原文链接
带大家重写个批量下载抖音视频的小脚本呀~mp.weixin.qq.com导语
转眼又大半个月没更新公众号了,带大家重写个批量下载抖音视频的小脚本吧。其实去年还是前年是出过几个版本的,但是因为我自己是不用抖音的,所以就没打算再更新它。但是总有些人,关注了公众号之后拿了之前代码,发现不能用,就在后台留几句脏话,然后取关公众号。真的挺无语的,不过想想还是更新一下吧,毕竟没取关的还是占多数的。
废话不多说,让我们愉快地开始吧~
相关文件
关注微信公众号"Charles的皮卡丘",公众号内回复"抖音"获取。
PS:代码仅供学习交流哦~
开发工具
Python版本:3.6.4
相关模块:
requests模块;
execjs模块;
lxml模块;
click模块;
prettytable模块;
以及一些python自带的模块。
nodejs版本:v10.15.3
环境搭建
安装Python并添加到环境变量,pip安装需要的相关模块即可。
原理简介
简单介绍一下实现的原理吧,首先随便搞个用户id,然后进入对应的抖音主页:
https://www.amemv.com/share/user/{用户id}
注意,用户id不等于用户抖音号,而是类似这样的uid(即你可以在分享链接中看到):
例如:
然后抓取一下用户的主页数据:
response = self.session.get(self.user_url.format(userid), headers=self.headers)
html = response.text
for key, value in self.font_dict.items():
if key in html:
html = html.replace(key, value)
assert 'dytk' in html
dytk = re.findall(r"dytk: '(.*?)'", html)[0]
tac = re.findall(r"<script>tac='(.*?)'</script>", html)[0]
html = etree.HTML(html)
nickname = html.xpath('//p[@class="nickname"]/text()')[0]
douyinid = ''.join(html.xpath('//p[@class="shortid"]/i/text()'))
num_followers = ''.join(html.xpath('//span[@class="follower block"]/span[1]//text()')).strip()
num_videos = ''.join(html.xpath('//div[@class="user-tab active tab get-list"]/span/i/text()'))
其中dytk和tac这两个参数是必要的,其他数据是给代码使用者看的,用于确定自己输入的用户id是否正确,效果类似这样:
接着,我们可以通过请求如下接口来获取用户的所有视频作品数据:
https://www.iesdouyin.com/web/api/v2/aweme/post/
需要携带的参数如下:
params = {
'user_id': userid,
'sec_uid': '',
'count': '1000',
'max_cursor': '0',
'aid': '1128',
'_signature': signature,
'dytk': dytk
}
signature需要根据userid, tac和ua来计算.
请求这个接口可以直接返回所有视频作品的下载链接,所以只需要再写个视频下载的小脚本就ok啦:
'''视频下载'''
def __download(self, download_url, savename, savedir='.'):
print('[INFO]: 正在下载 ——> %s' % savename)
if not os.path.exists(savedir):
os.mkdir(savedir)
with closing(self.session.get(download_url, headers=self.ios_headers, stream=True, verify=False)) as response:
total_size = int(response.headers['content-length'])
if response.status_code == 200:
label = '[FileSize]:%0.2f MB' % (total_size/(1024*1024))
with click.progressbar(length=total_size, label=label) as progressbar:
with open(os.path.join(savedir, savename+'.mp4'), "wb") as fp:
for chunk in response.iter_content(chunk_size=1024):
if chunk:
fp.write(chunk)
progressbar.update(1024)
大功告成~完整源代码详见相关文件。
效果展示
在终端运行如下命令即可:
python douyin.py
效果如下:
知乎视频www.zhihu.com完整源代码
https://github.com/CharlesPikachu/Video-Downloader/tree/master/douyin