爬虫把自己爬死了。。。。点解?

2017-03-06 12:09:26 +08:00
 4ever911
我弄了一个爬虫程序, 没有把服务器爬死,倒是把自己网络经常弄挂,

大概就是用 gevent 创建一个 Pool(50) , 50 个并发,

用 Requests 来迭代 (有打 monkey patch )

url 大概是接近 10000 个,

速度其实还挺快的, 一秒能处理接近 300 个 requests , for 迭代,没有 sleep

但是现在的问题是,每次连续处理 3000 个左右还好,再多了,经常就把本地网络弄挂了,导致程序也 timeout 退出。
一两分钟内,经常网络也连不上。不知道是不是我程序写的太耗系统资源,可能要稍微在一段任务后休息一下。

现在的解决办法就是, 把任务分成小块,每块大概 2000 个, 每爬了 2000 个就休息几秒。

有没有更科学的方法,或者是我哪里使用不当?
6803 次点击
所在节点    Python
23 条回复
4ever911
2017-03-07 00:49:26 +08:00
最后发现, 路由器表示不背锅, 是我的程序写的有问题

在 gevent 调用的函数里面,我直接用的 Requests.get 来下载页面,这个方式下不能复用连接,也没有主动去调用关闭,所以程序保持了几千个服务器之间的连接,最后把路由器玩死了。


现在修改成用 session 来 get ,一切完美了,速度也快了好多。


nCount = 50
connection_limit = nCount
adapter = requests.adapters.HTTPAdapter(pool_connections=connection_limit,
pool_maxsize=connection_limit)
session = requests.session()
session.mount('http://', adapter)

fetchpool = Pool(nCount)
for job in jobs:
fetchpool.spawn(self.foobar, session, job)
fetchpool.join()



def foobar(self, session, job):
session.get(......)



不过,之前也没留心,我的路由器也有一些问题,非常不稳定,尤其是 wifi ,干扰严重,即使我已经选择了别人都没有用的 channel
skylancer
2017-03-07 08:26:03 +08:00
几千的连接就能跑挂..

我是建议先把渣渣网件固件换了
啊 8500 啊,那再见...
log4geek
2017-03-07 17:09:20 +08:00
网络搞挂就只能升级网络了啦~
说到爬虫,我这里给分享个爬虫的学习笔记
http://log4geek.cc/2017/03/零基础 12 天从入门到精通 python 爬虫 /

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

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

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

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

© 2021 V2EX