V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
lbfeng
V2EX  ›  Python

scrapy + tor + polipo

  •  
  •   lbfeng · 2016-04-22 02:35:49 +08:00 · 6564 次点击
    这是一个创建于 3137 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    第 1 条附言  ·  2016-04-23 05:09:25 +08:00
    有人收藏这个话题,我的解决方案是在 setting 中添加 HTTPERROR_ALLOWED_CODES = [500],这样可以捕捉 500 错误,当 response.status == 500 时,获取新的 identity 。

    参考
    http://blog.csdn.net/haipengdai/article/details/48526507
    https://stem.torproject.org/faq.html#how-do-i-request-a-new-identity-from-tor
    10 条回复    2016-04-24 16:35:02 +08:00
    d33n99
        1
    d33n99  
       2016-04-22 03:33:07 +08:00 via iPhone   ❤️ 1
    捕捉到 500 错误后并往 tor 的控制端口发送一个 new identity 命令
    lbfeng
        2
    lbfeng  
    OP
       2016-04-22 05:44:28 +08:00
    我有尝试 errback 和 response.status 都不成功,不知道为什么。
    @d33n99
    popil1987
        3
    popil1987  
       2016-04-22 07:35:00 +08:00
    response.status 不一定是 500 ,你要看成功和不成功的区别,如果一个 200 ,一个 404 ,那肯定是有区别的,并不要求一定得是 500 ,有区别就行。
    如果都是 200 ,那就得比较一下内容有没有关键字或者字符串能识别出是成功或者不成功
    knightdf
        4
    knightdf  
       2016-04-22 08:55:12 +08:00   ❤️ 1
    首先你得让 500 错误的 response 被返回 parse ,然后在做 status 检查,因为 scrapy 默认是会重试 5xx 并且不会触发 parse 的
    d33n99
        5
    d33n99  
       2016-04-22 17:52:13 +08:00
    http://blog.csdn.net/haipengdai/article/details/48526507
    不好意思,一开始没理解您 @lbfeng 的意思,没有用过 scrapy,不过这博文应该对你有帮助:-)
    Sayalic
        6
    Sayalic  
       2016-04-22 20:51:32 +08:00
    @lbfeng 别用 TOR ,试试快代理
    lbfeng
        7
    lbfeng  
    OP
       2016-04-23 04:13:27 +08:00
    @d33n99 很有用。
    lbfeng
        8
    lbfeng  
    OP
       2016-04-24 05:43:06 +08:00
    @d33n99 出现另一个问题,当又第一个 500 之后重新得到 identity 。但 scrapy 有多个线程会发送多个请求导致 Rate limiting NEWNYM request: delaying by x second(s)。
    d33n99
        9
    d33n99  
       2016-04-24 14:17:02 +08:00 via iPhone
    @lbfeng 一般面对这个情况,我是用比较笨的方法,设置一个全局变量,比如 hold ,在 NEWNYM 的时候把 hold 设置成 1 ,确定换好了链路或者 sleep 几秒再设置成 0 ,至于发送请求的时候循环检查这个 hold 变量, 0 是重试或者继续, 1 是 sleep 并循环检查 hold ,至于怎么确定是否成功建立新的链路还得去看看 tor 的 wiki :-\
    d33n99
        10
    d33n99  
       2016-04-24 16:35:02 +08:00 via iPhone
    @lbfeng 50 个访问请求就得换一个 ip 的话, tor 应该不符合你更换 ID 的需求, tor 更换 IP 的频率不能太频繁,或者用网上那些 1 块钱几百个 socks5 或者其他方式,又或者试试畸形的 http 请求去绕过。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2122 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 00:43 · PVG 08:43 · LAX 16:43 · JFK 19:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.