#1 - 2021-9-11 23:07
th3ta "Paradox" (Rigidity and Uncertainty~☆)
我最近在上网课学 CNN,想写个 online learning 的“制服/Lo裙”分类器去练习,然后我就想到可以从专门的网站上实时抓带有 tag 的图片去作为训练数据集;

我用 python 的 request 写了一个爬虫,然后去抓bcy网站上面的 JK 以及 lolita 的 api feed,这个过程倒是挺顺利,能抓到一大堆条目的预览数据(标题,网址,预览图,作者,tag等);
爬虫的第二部分是打开条目的链接,进去找到图片,这样我就能得到已经标好 tag 的数据集了...... 然而,即使我写了足够像个人的 user-agent 还加上了 time.sleep(1) 的抓取间隔,在连续打开过十几次条目网址之后,抓到的东西就会变成 error,大概类似于这样:

<html>
<title></title>
<body>error</body>
</html>

俺寻思这是遇上了防抓取机制,想问问各位大佬有没有什么方法可以绕过去这种问题?
每次抓到 error 的时候去用浏览器打开网址就能看到一个白板网页上一行 error,然后隔半小时再去开这个网址就能看到正常的内容,所以我推断是我太快了在一定时间内同 ip 地址 request 数量异常导致服务器拒绝给出页面;如果要解决这个问题,一般来说应该把间隔放到多大才行?除了时间以外,有没有什么其他的解决方案呢?

万分感谢各位大佬的帮助!
(另,如果组内有bcy大佬的话我就先提前谢罪orz 求大佬饶我狗命不要鲨我(bgm38)
#2 - 2021-9-11 23:19
可以加 X-Forwarded-For X-Real-IP 之类的 header 试一下
#2-1 - 2021-9-11 23:24
th3ta "Paradox"
谢谢大佬!
我现在用的是《爬虫指南》里面这种形式的 header:

session = requests.Session()
headers = {'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5)'
           'AppleWebKit 537.36 (KHTML, like Gecko) Chrome',
           'Accept':'text/html,application/xhtml+xml,application/xml;'
           'q=0.9,image/webp,*/*;q=0.8'}
req = session.get(url, headers=headers)

请问我应该怎么改 real ip 啊?(bgm38)
#2-2 - 2021-9-11 23:44
Tkzc ⚥
th3ta "Paradox" 说: 谢谢大佬! 我现在用的是《爬虫指南》里面这种形式的 header: session = requests.Session()
headers = {'User-Agent':'Mozilla/5....
先爬到限制,然后用 Postman 或者 curl 加个 header 测试一下能不能绕过
#3 - 2021-9-12 07:46
看看robots文件有没有写delay时间
#4 - 2021-9-12 08:12
(情更怯)
使用库随机一下 User-Agent 。
如果网站封Cookie,要考虑一下处理每次请求后,响应的 Set-Cookie。  如果使用 scrapy  有中间件处理。
Referer 也得注意一下。
#5 - 2021-9-12 08:55
(BGMのTrinitas<=>婊冈妈<=>补冈妈<=>拜冈妈 三位一体 ...)
如果是vps也可以换ip啊,专业爬虫是要有集群的。
#6 - 2021-9-12 14:26
(天生万物以养人,人无一物以报天)
“每次抓到 error 的时候去用浏览器打开网址就能看到一个白板网页上一行 error,然后隔半小时再去开这个网址就能看到正常的内容”

如果半次元是简单暴力的检测到了同一个IP的请求过于密集然后封了单个IP,你的爬虫再怎么像人都没用,需要用代理池,通过多个ip地址爬取数据。