如题,分析并爬取今日头条的视频链接
代码仅供交流使用
一.分析
1.进入现在的官网http://www.365yg.com/,然后通过抓包发现首页数据的走向,一般来说首页数据放在网页中,要不然就是用json返回的。
可以发现并没有看到任何首页的数据,就剩下在json了
通过开发者工具的筛选xhr数据,然后发现返回这两条链接,第一条被排除了,就只剩下第二条链接,看到返回内容,发现其中data中的id跟首页视频跳转的id并不对应,再分析其他几个,发现是时间戳,最后只有raw_data没有显示任何内容,看完整个数据可以推断是base64加密,解密看了下,发现所需要的数据在这里面。
2.再上面的内容中并没有得到相应的视频链接,就只能去视频里面找呢
随便点击首页的一个视频进入,然后打开开发者工具进行抓包,还是一样,无法在网页中找到,就进行筛选xhr链接
从这么多数据里面发现只有两个数据能有返回包,而这两个包通过返回数据发现都能提取到视频的链接,而且是不同清晰度的:
第一条链接,发现了其中包含packjson的数据,里面就能提取到链接。
第二条链接,显示了不同的清晰度和进行base64加密的链接,但是这条提取的链接,需要参数的提交,其中的Authorization在提交的协议头中,还有video_id,还有附带的token。
这些参数在第1步的分析中能提取到,提取后通过组成完整的链接进行提取即可
二.代码
通过上面的分析链接,可以得到代码如下:
import requests
from base64 import b64decode
import json
def get_url(num):
headers = {
"User-Agent": "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50"
}
res = requests.post(f'http://www.365yg.com/xigua/feed/?ChannelID=6797027941&Count={num}&UseHQ=true',
headers=headers,
allow_redirects=False).json()
data_list = []
base_list = res['Data']
for base in base_list:
base = base['raw_data']
raw = b64decode(base).decode()
raw = json.loads(raw)
title = raw['title']
group_id = raw['group_id']
video_id = raw['video_id']
token = raw['play_biz_token']
auth_token = raw['play_auth_token']
#第一种,通过group_id提取视频的链接
# res = requests.post(f'http://www.365yg.com/xigua/play/?GroupID={group_id}', headers=headers,
# allow_redirects=False).json()
# video_list = json.loads(res['InformationResponse']['Info']['PackedJson'])['video_play_info']
# video_list = json.loads(video_list)['video_list']
#第二种,通过提取video_id和两个token,提取视频链接
url = f'http://vas.snssdk.com/video/openapi/v1/?format_type=dash&action=GetPlayInfo&video_id={video_id}&nobase64=false&ptoken={token}&vfrom=xgplayer'
headers.update({'Authorization': auth_token})
res = requests.get(url, headers=headers).json()
#这下面的提取是两种方法通用
try:
video_list = res['data']['dynamic_video']['dynamic_video_list']
# print("dv_list", video_list)
for video in video_list:
video_type = video['definition']
video_url = b64decode(video['main_url']).decode()
# print(title + ':' + video_type + '|' + video_url)
data = title, video_type, video_url
data_list.append(data)
except TypeError:
video_list = res['data']['video_list']
# print("v_list", video_list)
for i in range(1, 5):
try:
video_type = video_list[f'video_{i}']['definition']
video_url = b64decode(video_list[f'video_{i}']['main_url']).decode()
# print(title + ':' + video_type + '|' + video_url)
data = title, video_type, video_url
data_list.append(data)
except KeyError:
pass
finally:
pass
return data_list
这就是分析头条并提取的视频链接的过程,其中还有某些视频的音频和视频是分开,这个需要提取出音频然后进行合成,目前还没写,有问题的话请指出。