vegtbk 发表于 2024-10-18 01:26

某站视频总结,使用py-request无法通过api稳定抓取数据

首先,我先描述啊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()).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)

```


注:数据爬取只用于做数据分析

BTFKM 发表于 2024-10-18 11:28

vegtbk 发表于 2024-10-18 11:22
带cookie的也有试过,单用户单线程一小会就拿不到了(拿到数据休眠2秒,没拿到休眠5秒)

https://github.com/lexiforest/curl_cffi

试试这个 多换几个浏览器指纹, 这个情况应该是典型的反爬了, 代{过}{滤}理池可能还不够

BTFKM 发表于 2024-10-18 11:14

vegtbk 发表于 2024-10-18 11:01
这是返回数据,忘记贴这个了
我没有从里面发现明显的错误信息

我刚刚在b站测试了下, 纯用户情况下获取总结应该是100%成功的, 我建议带上cookie, 不用多线程再试试? 程序和界面一起观察, 看看有没有规律, 不过我估计还是反爬了, 可以试试带浏览器指纹的requests

cuimen 发表于 2024-10-18 08:49

感谢分享,以前用的集成的,现在知道原理了。

BTFKM 发表于 2024-10-18 09:02

可以把返回内容打开看看, 是不是有错误内容

CoinsBtc 发表于 2024-10-18 09:09

现在终于知道原理了

三滑稽甲苯 发表于 2024-10-18 09:42

这个接口有速率限制吗

vegtbk 发表于 2024-10-18 10:59

三滑稽甲苯 发表于 2024-10-18 09:42
这个接口有速率限制吗

没有发现有啥明显的速率限制,对于单个线程已经是模拟了上文提到的间隔5秒了

Do_zh 发表于 2024-10-18 10:59

你很强。

vegtbk 发表于 2024-10-18 11:01

BTFKM 发表于 2024-10-18 09:02
可以把返回内容打开看看, 是不是有错误内容

这是返回数据,忘记贴这个了:'(weeqw
我没有从里面发现明显的错误信息

vegtbk 发表于 2024-10-18 11:22

BTFKM 发表于 2024-10-18 11:14
我刚刚在b站测试了下, 纯用户情况下获取总结应该是100%成功的, 我建议带上cookie, 不用多线程再试试? 程 ...

带cookie的也有试过,单用户单线程一小会就拿不到了(拿到数据休眠2秒,没拿到休眠5秒)
页: [1] 2
查看完整版本: 某站视频总结,使用py-request无法通过api稳定抓取数据