首先,我先描述啊b拿ai总结的过程(如果有任何问题,请指出),抓相关包分析该过程,应该是先做了一个judge,通过judge的返回值来判断是否有请求。如果有请求,视频总结按钮变亮,点击后且获取到总结(这里包括了该视频不存在ai总结的状态)前,会返回一个包,表示在等待状态(这个是个人观点,没扒源码),继续请求api(该过程5s一次,通过抓包的wts算出)。
在拿ai总结时,data中的code一直是1(应该是一个拿到总结前的等待状态,下文为了方便描述,就用“阻塞”这一说法)
已经做了judge确定有ai总结了,没带cookie(已经确定了不带cookie其实也能拿到总结),使用了代{过}{滤}理(无论是使用不同的代{过}{滤}理请求还是使用同一个代{过}{滤}理持续发送请求),api是这个
url=f"https://api.bilibili.com/x/webinterface/view/conclusion/get?bvid={bvid}&cid={cid}&up_mid{mid}&web_location=333.788&w_rid={w_rid}&wts={str(wts)}"🤔
并且通过输出的日志来看,能拿到总结的概率并不高,而且有奇怪的现象(开了多线程后,总有一定的时间多线程一起拿到总结,然后阻塞,然后再恢复,再阻塞,这里的代{过}{滤}理使用方式是一次一换,给每一个视频列表分配一个限时代{过}{滤}理来爬数据,也会出现这种情况)
使用py的requests来做抓取
对referer做随机,vd_source使用随机的uid处理得到
payload留白是模仿了 postman 中的写法,发现好用,没做修改
def get_url_summary(bvid, cid, mid, r_uid):
wts = int(time.time())
ua = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36"
hash_d = f'bvid={bvid}&cid={cid}&up_mid={mid}&web_location=333.788&wts={str(wts)}'
hash_c = "ea1db124af3c7062474693fa704f4ff8"
md5 = hashlib.md5()
md5.update((hash_d + hash_c).encode('utf-8'))
w_rid = md5.hexdigest()
url = (f"https://api.bilibili.com/x/web-interface/view/conclusion/get?"
f"bvid={bvid}&cid={cid}&up_mid={mid}&web_location=333.788"
f"&w_rid={w_rid}&wts={str(wts)}")
md5_a = hashlib.md5(bytes([int(x) for x in str(r_uid)])).hexdigest()
headers = {
'user-agent': ua,
'referer': f"https://www.bilibili.com/video/{bvid}/?vd_source={md5_a}"
# 'cookie': cookie
}
payload = {}
return url, headers, payload
略去了判断部分的代码
url, headers, payload = get_url_summary(bvid, cid, url_mid, r_uid)
response = requests.request("GET", url, headers=headers, data=payload, proxies=proxies, timeout=10)
注:数据爬取只用于做数据分析
|