做网络爬虫,python 的多线程,异步和 node.js 的异步哪个好? - 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
pc10201

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

  •  
  •   pc10201 2014 年 2 月 12 日 14610 次点击
    这是一个创建于 4456 天前的主题,其中的信息可能已经有所发展或是发生改变。
    准备研究一下网络爬虫
    自己做过测试,在局域网环境中python的多线程要比gevent要快一点

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

    另外多线程可能与异步结合在一起么?
    感觉采集中最耗时的就是网络IO,数据抽取分析什么的倒是挺快
    30 条回复    2014-05-03 16:12:10 +08:00
    est
        1
    est  
       2014 年 2 月 12 日
    > 自己做过测试,在局域网环境中python的多线程要比gevent要快一点


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

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

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

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

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

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

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

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

    https://github.com/retresco/Spyder
    好像是用tornado+zeromq写的爬虫
    wuyadong
        18
    wuyadong  
       2014 年 2 月 12 日
    个人推荐,用tornado的异步+多进程,反正我是这么写的,其实到后面不是效率的问题了,是ip被封和验证码的问题了。。。
    wangfengmadking
        19
    wangfengmadking  
       2014 年 2 月 12 日
    我觉得怎么实现动态选择代理功能才是最大的一个坑
    wangfengmadking
        20
    wangfengmadking  
       2014 年 2 月 12 日
    我自己写的爬虫爬yelp的数据,还没用多线程呢,很快就被封ip了
    allenwei
        21
    allenwei  
       2014 年 2 月 12 日
    @wangfengmadking 赞同,代理才是爬虫的最大瓶颈,还没到遇到瓶颈的并发量也许那个网站就扛不住了,一般能扛得住的都有反爬虫机制
    simpx
        22
    simpx  
       2014 年 2 月 12 日
    @wangfengmadking 哈哈,是的。我的方案是建立在众多不稳定的代理之上的。需要动态监测、删除没用的代理,实在是非常麻烦。最后发现,其实只要摸清了目标限制策略,买几个额外的服务器ip,用多进程爬虫就把问题解决的又快又好
    sigmadog
        23
    sigmadog  
       2014 年 2 月 12 日
    @simpx 怎么配置出口ip呀。。如果服务器有多个ip的话,有资料不?
    lazybios
        24
    lazybios  
       2014 年 2 月 13 日
    @wuyadong 不错 正需要分析下这方面的原型
    guoyang
        25
    guoyang  
       2014 年 2 月 13 日
    你哪个语言用的最好,就哪个好!
    duwei
        26
    duwei  
       2014 年 2 月 13 日
    gevent的代码贴下?如果结果是比python多线程差的话,应该是没有利用上gevent的特性,比如使用了一些c的抓取库,这样的情况gevent是patch不到的。
    fire5
        27
    fire5  
       2014 年 2 月 13 日
    被人骂过, 如下:

    ”爬虫,还多线程? 我们一般都每次抓取后sleep 3秒钟。高性能,多核。丢我们爬虫界的脸。“

    想想也是,悠着点,你好他也好。
    fork3rt
        28
    fork3rt  
       2014 年 2 月 13 日
    我一般都是 Python 多线程 + Google Bot的 header - -#
    yakczh
        29
    yakczh  
       2014 年 2 月 20 日
    @wuyadong \tigerspider-master\core\util.py", line 79, in <module>
    @gen.coroutine
    AttributeError: 'module' object has no attribute 'coroutine'
    wuyadong
        30
    wuyadong  
       2014 年 5 月 3 日
    @yakczh tornado版本要新一点,coroutine是比较新的版本才有的
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2433 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 81ms UTC 16:04 PVG 00:04 LAX 09:04 JFK 12:04
    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