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
hohoho
V2EX  ›  Python

练手写了个爬虫,但是总是死锁,找了两天也没有找到原因

  •  
  •   hohoho · 2016-10-06 13:40:29 +08:00 · 4644 次点击
    这是一个创建于 2731 天前的主题,其中的信息可能已经有所发展或是发生改变。
    全部代码:

    国庆期间学 python 玩,看了几个项目代码,然后自己拼凑了一个链家二手房的爬虫,运行一段时间后总是被卡死,找了两天也没有发现问题在哪,自己怀疑应该是线程死锁问题,请大家帮忙看看指点下。

    参考的项目:
    1. https://github.com/mapleray/proxy_pool

    2. https://github.com/lanbing510/LianJiaSpider
    第 1 条附言  ·  2016-10-06 19:35:42 +08:00
    谢谢大家,按照 @9hills 说的加上 timeout 后即可,此问题已解决。
    12 条回复    2016-10-07 14:18:20 +08:00
    102400
        1
    102400  
       2016-10-06 15:21:24 +08:00   ❤️ 1
    难道不是 IO 的问题?
    a87150
        2
    a87150  
       2016-10-06 15:30:15 +08:00   ❤️ 1
    py2 和 py3 混一起?
    9hills
        3
    9hills  
       2016-10-06 15:34:41 +08:00   ❤️ 1
    也有可能是网络卡住了, request 要加 timeout
    aabbccli
        4
    aabbccli  
       2016-10-06 15:42:23 +08:00   ❤️ 1
    楼上正解
    hohoho
        5
    hohoho  
    OP
       2016-10-06 16:20:57 +08:00
    @102400 不知道,所以才发帖求助,尝试过把 sqlite 的读写注释掉,但是问题依然存在

    @a87150 如果是 py3 在 2.7.12 下运行不起来吧

    @9hills @aabbccli requests 应该有默认的 timeout 吧,但是卡着的时间特长,从数据库里的记录看最长的一次有三个多小时。我等下试试再来反馈
    a87150
        6
    a87150  
       2016-10-06 16:34:47 +08:00
    @hohoho

    except Exception as e:
    print(u'代理获取异常:{}'.format(e))

    这个明显是 3 的语法吧。
    BiggerLonger
        7
    BiggerLonger  
       2016-10-06 16:49:14 +08:00
    except ProxyError:
    self.proxies_list.remove(proxy)
    self.crawl(url)
    难道不是这个吗?重复调用, 不断 ProxyError 就不断死循环
    titianxingdaozhe
        8
    titianxingdaozhe  
       2016-10-06 16:54:23 +08:00
    你不是死锁,而且网路断开后,没有写处理相关异常的组件吧?他就一直维持死循环了。
    rale
        9
    rale  
       2016-10-06 17:17:47 +08:00
    @9hills 是对的, @hohoho 你这个存在死锁的可能性非常少, 你用 pycharm 跟踪一下,你会发现没有默认的 timeout , timeout 要自己加。 python2 自带的 urllib 包里面也有这种问题。另外,你可以看到你这个进程的 channel 状态是 sk_wait_data ,就算用 curl 也可能出现你这种问题: http://stackoverflow.com/questions/20576369/wget-hanging-script-stops
    lizon
        10
    lizon  
       2016-10-06 17:40:23 +08:00
    加 log ,看日志,分析停在什么地方了
    感觉程序停止的情况有很多,死循环,超时,死锁,异常 catch 了没抛出等等,具体问题具体分析
    hohoho
        11
    hohoho  
    OP
       2016-10-06 19:43:00 +08:00
    多谢大家,已经按照 @9hills 说的解决此问题。

    @a87150 python 语法不是太熟,还不太清楚 2 和 3 的具体区别,看别人项目照葫芦画瓢写的。

    @BiggerLonger @titianxingdaozhe 谢谢提醒,只是代理错误的话不会陷入死循环,但是代理池空了且 ip 被封了时会陷入死循环, 这里还未做处理。

    @rale 确实是这个问题。
    ddddnxzy
        12
    ddddnxzy  
       2016-10-07 14:18:20 +08:00
    在 linux 上就 strace 查看下。
    使用 requests 的时候需要注意默认是没有加 timeout 的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2875 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 13:51 · PVG 21:51 · LAX 06:51 · JFK 09:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.