练手写了个爬虫,但是总是死锁,找了两天也没有找到原因 - V2EX
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
4.04D
V2EX    Python

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

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

    国庆期间学 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  
       201-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
    x8
        10
    x8  
       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     Solana     2646 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 15:03 PVG 23:03 LAX 08:03 JFK 11:03
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86