成果展示
视频下载
爬取的100个视频:https://ghgxj.lanzous.com/b08xszm0h
项目场景
抖音【喜欢】这一栏收藏了很多视频,如下图,共有4691个,如何批量下载下来?
预备知识
只下载单个视频其实是不难的,可以参考我的这篇文章:
1、运行下方代码:
import re, json, requests
from tqdm import tqdm # 打印进度条的库
inp = input(\'请输入复制的抖音分享链接:\') # 如:https://v.douyin.com/JVFp8r5/
url = re.findall(\'https://v.douyin.com/.*?/\', inp)[0] # 链接解析
res = requests.get(url)
vid = re.findall(\'/video/(.*?)/\', res.url)[0] # vid解析,vid就是视频id,是我自己定义的
api = f\'https://www.iesdouyin.com/web/api/v2/aweme/iteminfo/?item_ids={vid}\' # 调用api
res = requests.get(api).json()
url = res[\'item_list\'][0][\'video\'][\'play_addr\'][\'url_list\'][0] # 视频下载链接解析
url = url.replace(\'/playwm/\', \'/play/\') # 去水印
res = requests.get(url, headers={\'user-agent\': \'chrome\'})
total_size = round(int(res.headers["Content-Length"])/1024/1024)
with open(f\'{vid}.mp4\', \'wb\') as f:
for chunk in tqdm(iterable=res.iter_content(1024*1024), total=total_size, unit=\'KB\'):
f.write(chunk)
2、输入抖音短视频分享链接
不用考虑我的感受 我没感受 不用和我说对不起 反正下次还是对不起 https://v.douyin.com/JVccx8h/ 复制此链接,打开抖音搜索,直接观看视频!
3、就能将视频下载到本地了
批量爬取
下载单个视频的时候,我们是通过复制分享视频链接来实现的,如何批量获取视频链接呢?总不能一个一个点吧,【喜欢】里面总共有4691个视频,一个一个用手点肯定是不行的。这里我就想到了用Fiddler Everywhere来对抖音APP进行抓包。
抓包结果如下:
【喜欢】的api接口是:
https://aweme.snssdk.com/aweme/v1/aweme/favorite/
返回的是json数据:
请求参数有很多,但每次改变的只有这4个参数:
count
max_cursor:
ts
_rticket
其中,count是返回的视频数量,max_cursor首次请求时为0,往后请求的值为上一次的返回值。ts和_rticket目前还不知道怎么解析,不过应该是通过某种加密方式计算出来的。所以目前是项目是卡在这里,如果以后有解决办法会再更新的。
温馨提示
因为api接口有些参数目前还尚未解析,所有我就手动复制了返回的几个json数据,然后运行下方代码下载:
import os, json, requests
from tqdm import tqdm
def down(name, link):
res = requests.get(link)
with open(name, \'wb\') as f:
f.write(res.content)
def main():
root = \'favorite/\'
os.makedirs(root, exist_ok=True)
with open(\'favorite.json\', \'r\', encoding=\'utf-8\') as f:
data = json.load(f)
for item in tqdm(data[\'aweme_list\']):
name = root+item[\'aweme_id\']+\'.mp4\'
link = item[\'video\'][\'play_addr\'][\'url_list\'][0]
down(name, link)
main()
顺便一提
其实我也用appium尝试过,但【喜欢】里面视频播放时竟然捕捉不到元素
from appium import webdriver
import time
# 连接手机抖音
caps = {
"platformName": "Android",
"deviceName": "emulator-5554",
"platformVersion": "6.0.1",
"appPackage": "com.ss.android.ugc.aweme",
"appActivity": ".main.MainActivity",
"noReset": "True",
"unicodeKeyboard": "True",
"resetKeyboard": "True"
}
driver = webdriver.Remote(\'http://127.0.0.1:4723/wd/hub\', caps)
# 爬抖音喜欢的视频数据
time.sleep(5)
print(\'点击我\')
driver.find_elements_by_id(\'com.ss.android.ugc.aweme:id/h3f\')[4].click()
time.sleep(5)
print(\'点击喜欢\')
driver.find_elements_by_id(\'com.ss.android.ugc.aweme:id/g1c\')[2].click()
time.sleep(5)
print(\'打开视频\')
driver.find_elements_by_id(\'com.ss.android.ugc.aweme:id/a2z\')[0].click()
time.sleep(5)
print(\'点击分享\')
driver.find_element_by_id(\'com.ss.android.ugc.aweme:id/gh0\').click()
time.sleep(5)
driver.swipe(500, 1300, 0, 1300)
time.sleep(5)
print(\'点击复制链接\')
# 下方代码或报错,因为获取不到元素,hhh
driver.find_elements_by_id(\'com.ss.android.ugc.aweme:id/gg1\')[-3].click()
time.sleep(1)
print(driver.get_clipboard_text())