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
V2EX  ›  Python

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

  •  
  •   pc10201 · 2014-02-12 09:36:16 +08:00 · 13777 次点击
    这是一个创建于 3939 天前的主题,其中的信息可能已经有所发展或是发生改变。
    准备研究一下网络爬虫
    自己做过测试,在局域网环境中python的多线程要比gevent要快一点

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

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


    贴出来看看?
    pc10201
        2
    pc10201  
    OP
       2014-02-12 10:09:54 +08:00
    @est 源代码不知放哪了,python的多线程是基于这个的https://github.com/pycurl/pycurl/blob/master/examples/retriever.py,gevent的不知道放哪了
    ipconfiger
        3
    ipconfiger  
       2014-02-12 10:16:52 +08:00
    python多进程+异步貌似会更加happy
    xieren58
        4
    xieren58  
       2014-02-12 10:20:43 +08:00
    推荐nodejs
    simpx
        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的原始策略抓取热点数据。多运行几个爬虫,问题就都解决了,而且稳定性,可维护性极大提升。

    作为总结的废话是,如果楼主是打算做实际的项目,上线、盈利甚至以后会交给别人维护项目、代码,可以多分析一下用户需求,和自己的资源能力。写个爬虫做项目简单,解决自己埋下的坑很难。
    Ever
        6
    Ever  
       2014-02-12 10:25:37 +08:00
    读取用gevent pool + requests
    数据抽取用gevent threadpool + lxml (lxml会释放GIL)
    julyclyde
        7
    julyclyde  
       2014-02-12 10:28:01 +08:00
    多线程快是因为局域网速度快。你到公网试试就知道了
    XXOO
        8
    XXOO  
       2014-02-12 10:30:35 +08:00
    @simpx 求交流,求联系方式。
    simpx
        9
    simpx  
       2014-02-12 11:10:51 +08:00
    @XXOO 可以先邮件联系 :),simpxx@gmail
    est
        10
    est  
       2014-02-12 11:19:39 +08:00
    @pc10201 你这个用的是pycurl 啊!gevent用requests是用python代码解析http协议的好吧。
    XXOO
        11
    XXOO  
       2014-02-12 11:32:26 +08:00
    @simpx ok.
    gaicitadie
        12
    gaicitadie  
       2014-02-12 11:36:23 +08:00
    网络爬虫的瓶颈不在运算速度,在网速
    pc10201
        13
    pc10201  
    OP
       2014-02-12 11:57:48 +08:00
    @est pycurl是基于c语言的,经个人测试速度比requests库要快,不过写起来稍为麻烦点
    binux
        14
    binux  
       2014-02-12 12:01:56 +08:00
    拆开,抓取多线程或者异步,调度单进程,解析多进程。用FIFO队列串起来
    tomnee
        15
    tomnee  
       2014-02-12 12:02:30 +08:00
    grequest
    subpo
        16
    subpo  
       2014-02-12 12:13:09 +08:00
    推荐nodejs,用类jquery的写法分析数据更得心应手
    wuyadong
        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写的爬虫
    wuyadong
        18
    wuyadong  
       2014-02-12 12:48:33 +08:00
    个人推荐,用tornado的异步+多进程,反正我是这么写的,其实到后面不是效率的问题了,是ip被封和验证码的问题了。。。
    wangfengmadking
        19
    wangfengmadking  
       2014-02-12 13:10:59 +08:00
    我觉得怎么实现动态选择代理功能才是最大的一个坑
    wangfengmadking
        20
    wangfengmadking  
       2014-02-12 13:11:53 +08:00
    我自己写的爬虫爬yelp的数据,还没用多线程呢,很快就被封ip了
    allenwei
        21
    allenwei  
       2014-02-12 15:09:51 +08:00
    @wangfengmadking 赞同,代理才是爬虫的最大瓶颈,还没到遇到瓶颈的并发量也许那个网站就扛不住了,一般能扛得住的都有反爬虫机制
    simpx
        22
    simpx  
       2014-02-12 15:38:30 +08:00
    @wangfengmadking 哈哈,是的。我的方案是建立在众多不稳定的代理之上的。需要动态监测、删除没用的代理,实在是非常麻烦。最后发现,其实只要摸清了目标限制策略,买几个额外的服务器ip,用多进程爬虫就把问题解决的又快又好
    sigmadog
        23
    sigmadog  
       2014-02-12 21:01:30 +08:00
    @simpx 怎么配置出口ip呀。。如果服务器有多个ip的话,有资料不?
    lazybios
        24
    lazybios  
       2014-02-13 01:20:03 +08:00
    @wuyadong 不错 正需要分析下这方面的原型
    guoyang
        25
    guoyang  
       2014-02-13 09:36:29 +08:00
    你哪个语言用的最好,就哪个好!
    duwei
        26
    duwei  
       2014-02-13 11:24:35 +08:00
    gevent的代码贴下?如果结果是比python多线程差的话,应该是没有利用上gevent的特性,比如使用了一些c的抓取库,这样的情况gevent是patch不到的。
    fire5
        27
    fire5  
       2014-02-13 11:36:38 +08:00
    被人骂过, 如下:

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

    想想也是,悠着点,你好他也好。
    fork3rt
        28
    fork3rt  
       2014-02-13 16:25:22 +08:00
    我一般都是 Python 多线程 + Google Bot的 header - -#
    yakczh
        29
    yakczh  
       2014-02-20 21:34:14 +08:00
    @wuyadong \tigerspider-master\core\util.py", line 79, in <module>
    @gen.coroutine
    AttributeError: 'module' object has no attribute 'coroutine'
    wuyadong
        30
    wuyadong  
       2014-05-03 16:12:10 +08:00
    @yakczh tornado版本要新一点,coroutine是比较新的版本才有的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4273 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 04:11 · PVG 12:11 · LAX 20:11 · JFK 23:11
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.