下载抖音视频 - Python
几句闲话,确定数据来源,找到要爬的播放列表,先提取列表,然后请求列表中每个视频的播放页,确定播放请求的页面,确定视频的最终来源。抖音的最终播放网址是编码了放在源码中的。
"""
巩固爬取抖音小姐姐的视频
"""
import time
import requests
import requests.utils
import re
import os
filePath = '抖音\\'
if not os.path.exists(filePath):
os.mkdir(filePath)
# 抖音的源地址是有js加密的,尝试从源码中提取视频地址
# 正文开始
# 选个感兴趣的up主,https://www.douyin.com/user/MS4wLjABAAAAPDltJR0Ko_jx63FmWeLrFgtfsqZwJHqFcqn8m4f10BE?author_id=98573160279&enter_from=main_page&enter_method=video_title&from_gid=6907989544281427207&group_id=6907989544281427207&log_pb=%7B%22impr_id%22%3A%2220211030210806010135168106160F6A94%22%7D
# 首先定义请求头
headers = {
'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36',
}
# 要请求的视频列表页面
url = 'https://www.douyin.com/user/MS4wLjABAAAAPDltJR0Ko_jx63FmWeLrFgtfsqZwJHqFcqn8m4f10BE' # 我们把?后面的参数去带哦了
# 开始带参数请求网页以获取视频列表id
response = requests.get(url=url, headers=headers)
# print(response.text) # 尝试打印
# 提取视频列表的视频播放地址
videoIds = re.findall('<a href="//www.douyin.com/video/(\d+)" class="', response.text)
# 直接建立视频列表页面的播放地址
videoPlayUrls = ["https://www.douyin.com/video/" + videoId for videoId in videoIds]
# 开始请求播放页面
for videoPlayUrl in videoPlayUrls:
time.sleep(2)
res = requests.get(url=videoPlayUrl, headers=headers)
title = re.findall('<title data-react-helmet="true">(.*?)</title>', res.text)[0] # 查找标题
# 因为通过开发者工具发现,视频播放页面请求的url类似https://v26-web.douyinvod.com/03b258cea5e5fc96a981e57fb573afed/617d5757/video/tos/cn/tos-cn-ve-15-alinc2/acda6724ba424dc7bdc00e49733ccee7/?a=6383&br=751&bt=751&cd=0|0|0&ch=26&cr=0&cs=0&cv=1&dr=0&ds=3&er=&ft=jal9wj--bz7ThWxuITct&l=021635600420858fdbddc0200fff0030a931d170000001f5969b2&lr=all&mime_type=video_mp4&net=0&pl=0&qs=0&rc=am42OGU6ZnJ5ODMzNGkzM0ApaDs2NjQzaTw3NzloZGk2Z2ctLTE2cjRfMnFgLS1kLTBzczY1XjRfMjQyNTY1YjAyLjM6Yw==&vl=&vr=
# 通过浏览器窗口打开上述页面,发现是源播放地址,也就是我们要下载视频的地址
# 又通过开发者工具搜素,发现播放页面请求的地址v26-web就存储在播放页面的源码中
# 接下来从播放页面的源码中直接提取该地址
# print(res.text)
# 提取出来发现网页被编码了
quotedUrls = re.findall('src(.*?)3D%22', res.text)[1]
# 通过分析发现,上面的列表第一项没用,第二项开始视频地址
orginalDownLoadUrl = requests.utils.unquote(quotedUrls).replace('":"//', 'https://')
# print(orginalDownLoadUrl) 提取地址完毕
# 开始请求下载
videoContent = requests.get(orginalDownLoadUrl, headers=headers).content
# 开始开心的批量下载
with open(filePath + title + '.mp4', mode='wb') as f:
f.write(videoContent)
if os.path.exists(filePath + title + '.mp4'):
print('文件已经存在!')
else:
print('正在下载%s.mp4!!' %(title))
# break # 调试的时候用的
最后就是文件名的问题,如果出现windows不能存储\等,用re.sub(r'\', '_', string)进行所有替换。

浙公网安备 33010602011771号