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

2016-10-06 13:40:29 +08:00
 hohoho
全部代码:
https://gist.github.com/1oo1/40fc5bb84eaec15fd3471e2fd777b515
国庆期间学 python 玩,看了几个项目代码,然后自己拼凑了一个链家二手房的爬虫,运行一段时间后总是被卡死,找了两天也没有发现问题在哪,自己怀疑应该是线程死锁问题,请大家帮忙看看指点下。

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

2. https://github.com/lanbing510/LianJiaSpider
4830 次点击
所在节点    Python
12 条回复
102400
2016-10-06 15:21:24 +08:00
难道不是 IO 的问题?
a87150
2016-10-06 15:30:15 +08:00
py2 和 py3 混一起?
9hills
2016-10-06 15:34:41 +08:00
也有可能是网络卡住了, request 要加 timeout
aabbccli
2016-10-06 15:42:23 +08:00
楼上正解
hohoho
2016-10-06 16:20:57 +08:00
@102400 不知道,所以才发帖求助,尝试过把 sqlite 的读写注释掉,但是问题依然存在

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

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

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

这个明显是 3 的语法吧。
BiggerLonger
2016-10-06 16:49:14 +08:00
except ProxyError:
self.proxies_list.remove(proxy)
self.crawl(url)
难道不是这个吗?重复调用, 不断 ProxyError 就不断死循环
titianxingdaozhe
2016-10-06 16:54:23 +08:00
你不是死锁,而且网路断开后,没有写处理相关异常的组件吧?他就一直维持死循环了。
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
2016-10-06 17:40:23 +08:00
加 log ,看日志,分析停在什么地方了
感觉程序停止的情况有很多,死循环,超时,死锁,异常 catch 了没抛出等等,具体问题具体分析
hohoho
2016-10-06 19:43:00 +08:00
多谢大家,已经按照 @9hills 说的解决此问题。

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

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

@rale 确实是这个问题。
ddddnxzy
2016-10-07 14:18:20 +08:00
在 linux 上就 strace 查看下。
使用 requests 的时候需要注意默认是没有加 timeout 的。

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

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

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

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

© 2021 V2EX