scrapy + tor + polipo

2016-04-22 02:35:49 +08:00
 lbfeng

最近在爬一个网站,明显有反爬虫机制, 50 个 request 之后就变 500 internal error 。不换 ip 的话 4 , 5 天都不能访问了。参考教程用了 tor+polipo ,情况好了点但依旧有 10%的 500 。我有试 errback 调用方法,但 errback 没有被触发。用什么方法能捕捉到 500 错误,并且在调用我的方法重启 tor 。

6422 次点击
所在节点    Python
10 条回复
d33n99
2016-04-22 03:33:07 +08:00
捕捉到 500 错误后并往 tor 的控制端口发送一个 new identity 命令
lbfeng
2016-04-22 05:44:28 +08:00
我有尝试 errback 和 response.status 都不成功,不知道为什么。
@d33n99
popil1987
2016-04-22 07:35:00 +08:00
response.status 不一定是 500 ,你要看成功和不成功的区别,如果一个 200 ,一个 404 ,那肯定是有区别的,并不要求一定得是 500 ,有区别就行。
如果都是 200 ,那就得比较一下内容有没有关键字或者字符串能识别出是成功或者不成功
knightdf
2016-04-22 08:55:12 +08:00
首先你得让 500 错误的 response 被返回 parse ,然后在做 status 检查,因为 scrapy 默认是会重试 5xx 并且不会触发 parse 的
d33n99
2016-04-22 17:52:13 +08:00
http://blog.csdn.net/haipengdai/article/details/48526507
不好意思,一开始没理解您 @lbfeng 的意思,没有用过 scrapy,不过这博文应该对你有帮助:-)
Sayalic
2016-04-22 20:51:32 +08:00
@lbfeng 别用 TOR ,试试快代理
lbfeng
2016-04-23 04:13:27 +08:00
@d33n99 很有用。
lbfeng
2016-04-24 05:43:06 +08:00
@d33n99 出现另一个问题,当又第一个 500 之后重新得到 identity 。但 scrapy 有多个线程会发送多个请求导致 Rate limiting NEWNYM request: delaying by x second(s)。
d33n99
2016-04-24 14:17:02 +08:00
@lbfeng 一般面对这个情况,我是用比较笨的方法,设置一个全局变量,比如 hold ,在 NEWNYM 的时候把 hold 设置成 1 ,确定换好了链路或者 sleep 几秒再设置成 0 ,至于发送请求的时候循环检查这个 hold 变量, 0 是重试或者继续, 1 是 sleep 并循环检查 hold ,至于怎么确定是否成功建立新的链路还得去看看 tor 的 wiki :-\
d33n99
2016-04-24 16:35:02 +08:00
@lbfeng 50 个访问请求就得换一个 ip 的话, tor 应该不符合你更换 ID 的需求, tor 更换 IP 的频率不能太频繁,或者用网上那些 1 块钱几百个 socks5 或者其他方式,又或者试试畸形的 http 请求去绕过。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/273523

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX