pea3nut / Pxer

A tool for pixiv.net. 人人可用的P站爬虫
http://pxer.pea3nut.org/
MIT License
982 stars 105 forks source link

Rate limiting: Pixiv疑似调整了流控策略, 可能导致批量获取作品信息失败 #211

Closed Ailitonia closed 2 years ago

Ailitonia commented 2 years ago

Pixiv 疑似于 2022 年 8 月 15 日左右调整了流控策略,与以往的几乎不限制 API 请求频率不同,只要一次性批量获取的作品过多,就可能受到流控限制,具体表现为:

  1. 判定区间短:只要在短时间(1~2分钟内)内请求数量超过三位数,就容易触发该流控限制
  2. 限制时间短:只要停止请求 1~2分钟,限制自动解除

该流控策略对于批量获取图片下载地址来说可以说会造成毁灭性的体验

已批量获取已关注用户作品场景为例,仅抓取前 200 个作品: image

大致从 80 个左右开始,就无法正常获取作品信息了,此时即使保持登录状态访问作品页面也会提示错误: image

作品信息接口将直接返回 429 error: image image

奇怪的是,上述流控策略仅限于登录状态,使用不含用户登录状态 cookies 的请求却不会受到该流控策略的限制,但这样就获取不了一些受限制的作品了

以上是我个人最近遇到的情况,当然不排除是否和网络环境、用户行为、请求频次等其他因素相关,若该流控策略被证实是普遍存在的,希望能添加一个请求频率控制以缓解流控策略造成的影响

AOALI123 commented 2 years ago

这个问题普遍存在 解决方法就是抓取的时候加个CD 两种方法 1 延长每幅作品之间抓取CD 2 在返回429以后CD几分钟再继续抓取

AOALI123 commented 2 years ago

这个问题普遍存在 解决方法就是抓取的时候加个CD 两种方法 1 延长每幅作品之间抓取CD 2 在返回429以后CD几分钟再继续抓取

或者使用方法3 手动CD 抓取完以后隔个几分钟(或者自行测试可正常打开作品)再点击重试全部

Ailitonia commented 2 years ago

这个问题普遍存在 解决方法就是抓取的时候加个CD 两种方法 1 延长每幅作品之间抓取CD 2 在返回429以后CD几分钟再继续抓取

之前 pixiv 的流控没有这么严格,随便抓五六千个作品都不带限制的,现在这样爬虫效率也得低好几个数量级

pea3nut commented 2 years ago

woc 有尝试过把线程改成1,是不是就不会触发P站拦截阈值了?

Ailitonia commented 2 years ago

woc 有尝试过把线程改成1,是不是就不会触发P站拦截阈值了?

这版本配置里面没有线程数选项了呀

手动改了下入口处的线程数分别到 1、16、32、64

https://github.com/FoXZilla/Pxer/blob/5c550e837898b1191e2b107e75f43820ec3942a0/src/app/PxerApp.js#L72-L75

还是以抓取关注用户前200个作品作为测试,结果发现无论线程数是多少,基本都是抓取到70个作品左右时被流控

据此推测,Pixiv 当前流控策略应该是根据一段时间内用户的请求次数进行流控限制的,大概只有人为降低单位时间内请求次数来避免

或者就是遇到返回 429 时自动暂停抓取,然后等待一段时间后再重新抓取

pea3nut commented 2 years ago

修好了,再试试?