1
est 2014-02-12 09:42:46 +08:00
> 自己做过测试,在局域网环境中python的多线程要比gevent要快一点
贴出来看看? |
2
pc10201 OP @est 源代码不知放哪了,python的多线程是基于这个的https://github.com/pycurl/pycurl/blob/master/examples/retriever.py,gevent的不知道放哪了
|
3
ipconfiger 2014-02-12 10:16:52 +08:00
python多进程+异步貌似会更加happy
|
4
xieren58 2014-02-12 10:20:43 +08:00
推荐nodejs
|
5
simpx 2014-02-12 10:21:18 +08:00 2
刚结束了自己的一个项目(爬虫+搜索),爬虫部分用的就是python gevent,我的经验可供参考下。
项目初期,我仅仅实现了一个demo,最简单的多线程+requests库+beautiful soup 后来为了性能,重构为异步IO,在tornado和gevent之间选择了一下,最后选择了gevent,倒不是因为技术原因,而是因为gevent更好写:) 而且还monkey patch了线程等库。此次重构还用自己写的正则匹配,替代了beautiful soup 再后来,爬虫抓取的目标增加了访问频率限制,不得不为爬虫增加了一个动态选择代理的功能,此次的重构耗时较多,也是此次重构为之后埋下了坑,动态选择的过程、代理的不稳定也成了耗时的原因。 为了进一步提速,但又需要绕过访问限制,而自己的服务器资源又不多(其实就一台爬虫服务器)。进行了又一次重构,此次重构可以说是业务上的进步,技术上的“倒退”,我发现如果进一步理解用户需求的话,其实用户需要的80%都是热点数据,而热点数据并不多。 于是改成了最简单的构架,多进程+requests库,用不到200行代码写了爬虫,把复杂的动态选择代理功能去了,仅仅用一个进程一个ip的原始策略抓取热点数据。多运行几个爬虫,问题就都解决了,而且稳定性,可维护性极大提升。 作为总结的废话是,如果楼主是打算做实际的项目,上线、盈利甚至以后会交给别人维护项目、代码,可以多分析一下用户需求,和自己的资源能力。写个爬虫做项目简单,解决自己埋下的坑很难。 |
6
Ever 2014-02-12 10:25:37 +08:00
读取用gevent pool + requests
数据抽取用gevent threadpool + lxml (lxml会释放GIL) |
7
julyclyde 2014-02-12 10:28:01 +08:00
多线程快是因为局域网速度快。你到公网试试就知道了
|
12
gaicitadie 2014-02-12 11:36:23 +08:00
网络爬虫的瓶颈不在运算速度,在网速
|
14
binux 2014-02-12 12:01:56 +08:00
拆开,抓取多线程或者异步,调度单进程,解析多进程。用FIFO队列串起来
|
15
tomnee 2014-02-12 12:02:30 +08:00
grequest
|
16
subpo 2014-02-12 12:13:09 +08:00
推荐nodejs,用类jquery的写法分析数据更得心应手
|
17
wuyadong 2014-02-12 12:47:01 +08:00 3
https://github.com/JobsDong/tigerspider
好像是用tornado+redis写的爬虫 https://github.com/scrapy/scrapy 好像是用twisted写的爬虫 https://github.com/retresco/Spyder 好像是用tornado+zeromq写的爬虫 |
18
wuyadong 2014-02-12 12:48:33 +08:00
个人推荐,用tornado的异步+多进程,反正我是这么写的,其实到后面不是效率的问题了,是ip被封和验证码的问题了。。。
|
19
wangfengmadking 2014-02-12 13:10:59 +08:00
我觉得怎么实现动态选择代理功能才是最大的一个坑
|
20
wangfengmadking 2014-02-12 13:11:53 +08:00
我自己写的爬虫爬yelp的数据,还没用多线程呢,很快就被封ip了
|
21
allenwei 2014-02-12 15:09:51 +08:00
@wangfengmadking 赞同,代理才是爬虫的最大瓶颈,还没到遇到瓶颈的并发量也许那个网站就扛不住了,一般能扛得住的都有反爬虫机制
|
22
simpx 2014-02-12 15:38:30 +08:00
@wangfengmadking 哈哈,是的。我的方案是建立在众多不稳定的代理之上的。需要动态监测、删除没用的代理,实在是非常麻烦。最后发现,其实只要摸清了目标限制策略,买几个额外的服务器ip,用多进程爬虫就把问题解决的又快又好
|
25
guoyang 2014-02-13 09:36:29 +08:00
你哪个语言用的最好,就哪个好!
|
26
duwei 2014-02-13 11:24:35 +08:00
gevent的代码贴下?如果结果是比python多线程差的话,应该是没有利用上gevent的特性,比如使用了一些c的抓取库,这样的情况gevent是patch不到的。
|
27
fire5 2014-02-13 11:36:38 +08:00
被人骂过, 如下:
”爬虫,还多线程? 我们一般都每次抓取后sleep 3秒钟。高性能,多核。丢我们爬虫界的脸。“ 想想也是,悠着点,你好他也好。 |
28
fork3rt 2014-02-13 16:25:22 +08:00
我一般都是 Python 多线程 + Google Bot的 header - -#
|
29
yakczh 2014-02-20 21:34:14 +08:00
|