做网络爬虫,python 的多线程,异步和 node.js 的异步哪个好?

2014-02-12 09:36:16 +08:00
 pc10201
准备研究一下网络爬虫
自己做过测试,在局域网环境中python的多线程要比gevent要快一点

有没有高手来对比一下下面的各项?
python的多线程
python中的Tornado的异步http
nodejs的异步

另外多线程可能与异步结合在一起么?
感觉采集中最耗时的就是网络IO,数据抽取分析什么的倒是挺快
13594 次点击
所在节点    Python
30 条回复
est
2014-02-12 09:42:46 +08:00
> 自己做过测试,在局域网环境中python的多线程要比gevent要快一点


贴出来看看?
pc10201
2014-02-12 10:09:54 +08:00
@est 源代码不知放哪了,python的多线程是基于这个的https://github.com/pycurl/pycurl/blob/master/examples/retriever.py,gevent的不知道放哪了
ipconfiger
2014-02-12 10:16:52 +08:00
python多进程+异步貌似会更加happy
xieren58
2014-02-12 10:20:43 +08:00
推荐nodejs
simpx
2014-02-12 10:21:18 +08:00
刚结束了自己的一个项目(爬虫+搜索),爬虫部分用的就是python gevent,我的经验可供参考下。

项目初期,我仅仅实现了一个demo,最简单的多线程+requests库+beautiful soup

后来为了性能,重构为异步IO,在tornado和gevent之间选择了一下,最后选择了gevent,倒不是因为技术原因,而是因为gevent更好写:) 而且还monkey patch了线程等库。此次重构还用自己写的正则匹配,替代了beautiful soup

再后来,爬虫抓取的目标增加了访问频率限制,不得不为爬虫增加了一个动态选择代理的功能,此次的重构耗时较多,也是此次重构为之后埋下了坑,动态选择的过程、代理的不稳定也成了耗时的原因。

为了进一步提速,但又需要绕过访问限制,而自己的服务器资源又不多(其实就一台爬虫服务器)。进行了又一次重构,此次重构可以说是业务上的进步,技术上的“倒退”,我发现如果进一步理解用户需求的话,其实用户需要的80%都是热点数据,而热点数据并不多。

于是改成了最简单的构架,多进程+requests库,用不到200行代码写了爬虫,把复杂的动态选择代理功能去了,仅仅用一个进程一个ip的原始策略抓取热点数据。多运行几个爬虫,问题就都解决了,而且稳定性,可维护性极大提升。

作为总结的废话是,如果楼主是打算做实际的项目,上线、盈利甚至以后会交给别人维护项目、代码,可以多分析一下用户需求,和自己的资源能力。写个爬虫做项目简单,解决自己埋下的坑很难。
Ever
2014-02-12 10:25:37 +08:00
读取用gevent pool + requests
数据抽取用gevent threadpool + lxml (lxml会释放GIL)
julyclyde
2014-02-12 10:28:01 +08:00
多线程快是因为局域网速度快。你到公网试试就知道了
XXOO
2014-02-12 10:30:35 +08:00
@simpx 求交流,求联系方式。
simpx
2014-02-12 11:10:51 +08:00
@XXOO 可以先邮件联系 :),simpxx@gmail
est
2014-02-12 11:19:39 +08:00
@pc10201 你这个用的是pycurl 啊!gevent用requests是用python代码解析http协议的好吧。
XXOO
2014-02-12 11:32:26 +08:00
@simpx ok.
gaicitadie
2014-02-12 11:36:23 +08:00
网络爬虫的瓶颈不在运算速度,在网速
pc10201
2014-02-12 11:57:48 +08:00
@est pycurl是基于c语言的,经个人测试速度比requests库要快,不过写起来稍为麻烦点
binux
2014-02-12 12:01:56 +08:00
拆开,抓取多线程或者异步,调度单进程,解析多进程。用FIFO队列串起来
tomnee
2014-02-12 12:02:30 +08:00
grequest
subpo
2014-02-12 12:13:09 +08:00
推荐nodejs,用类jquery的写法分析数据更得心应手
wuyadong
2014-02-12 12:47:01 +08:00
https://github.com/JobsDong/tigerspider
好像是用tornado+redis写的爬虫

https://github.com/scrapy/scrapy
好像是用twisted写的爬虫

https://github.com/retresco/Spyder
好像是用tornado+zeromq写的爬虫
wuyadong
2014-02-12 12:48:33 +08:00
个人推荐,用tornado的异步+多进程,反正我是这么写的,其实到后面不是效率的问题了,是ip被封和验证码的问题了。。。
wangfengmadking
2014-02-12 13:10:59 +08:00
我觉得怎么实现动态选择代理功能才是最大的一个坑
wangfengmadking
2014-02-12 13:11:53 +08:00
我自己写的爬虫爬yelp的数据,还没用多线程呢,很快就被封ip了

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

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

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

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

© 2021 V2EX