第一次发贴,写的不好请谅解,如果有更优化的处理方式请提出交流,代码仅供学习和交流
以下是正文和代码:
1.进入某头条的官网,目前是叫阳光宽频网,就提取首页的内容
2.通过分析出json数据的链接,并的得到出首页数据的链接:http://www.365yg.com/xigua/feed/?ChannelID=6797027941&Count=10&UseHQ=true(其中这个channelid是固定的,count代表提取的数量)
取首页数据链接
3.然后得到的是json数据格式,通过提取key值data的内容再提取key值raw_data的内容,得到的数据很明显是base64加密的方式,直接进行base64的解密,然后得到详细的标题,groupid还有一些其他的内容等等。
提取raw_data
base64解密后数据
4.进入单个视频,通过抓包发现链接的提取有两种方式,代码会进行具体说明,第一种提取方式就不上操作了,第二种提取方式需要再request headers里面加上一个协议头才能进行访问,这个协议头的内容在第3条中能提取出来
协议头
5.再优化一下代码,然后减少报错。
具体的操作截图和代码如下,目前所提取的视频链接都是自带声音,那种提取视频和音频分割的没有写,不过思路是一样的,提取出来,然后进行合成:
[Python] 纯文本查看 复制代码 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
觉得不错的朋友们可以给个鼓励,有错误也请各位朋友指正,谢谢了 |