推荐学习书目
› 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
cabinw
V2EX  ›  Python

如何用Gevent更快速的异步爬取内容

  •  
  •   cabinw ·
    cabinw · Sep 14, 2012 · 10607 views
    This topic created in 5165 days ago, the information mentioned may be changed or developed.
    其实也不一定要用gevent,不过用了gevent之后效果的确不错

    情况是这样,从IMDB id tt0000000 到 tt9999999遍历访问一遍豆瓣的电影信息,并保存电影信息。如果只是用线程,然后gevent.joinall(threads),效果好像不是很明显,有什么更好的办法么?

    初学gevent,还处于不会的状态
    35 replies  •  1970-01-01 08:00:00 +08:00
    Livid
    Livid
    MOD
    PRO
    Sep 14, 2012
    1
    Celery or RQ is better for such scenario.
    cabinw
    cabinw
    OP
    Sep 14, 2012
    2
    @Livid 3x~
    phuslu
    phuslu
    Sep 14, 2012
    3
    gevent.pool.spawn + httplib2
    Brutal
    Brutal
    Sep 14, 2012
    4
    queue 然后 q.get()
    reus
    reus
    Sep 14, 2012
    5
    requests + multiprocessing.Pool
    cabinw
    cabinw
    OP
    Sep 14, 2012
    6
    @phuslu @Brutal @reus 感谢给出的各种方案,我都去了解下
    btwo
    btwo
    Sep 14, 2012
    7
    有测试结果了也请贴出来,一起学习下!
    cabinw
    cabinw
    OP
    Sep 14, 2012
    11
    @btwo 好
    cabinw
    cabinw
    OP
    Sep 14, 2012
    12
    @muxi 如此详细,大赞!
    sinreal
    sinreal
    Sep 14, 2012
    13
    额,豆瓣好像限制单个ip访问频率的。楼主可以考虑多个ip慢慢去抓。
    cabinw
    cabinw
    OP
    Sep 14, 2012
    14
    @sinreal 我测试用单ip抓了12万数据貌似还没出现问题,不过这的确会是个问题啊
    14kscn
    14kscn
    Sep 14, 2012
    15
    我比较好奇的是 v2ex 可以贴 code 了?
    eric_q
    eric_q
    Sep 14, 2012
    16
    如果爬得过快消耗太多资源,可能会被手动封禁
    cabinw
    cabinw
    OP
    Sep 14, 2012
    17
    @eric_q 诶,那真是大问题了
    clowwindy
    clowwindy
    Sep 14, 2012
    18
    爬虫的瓶颈不在抓取,在被爬的网站上……一般要爬单个网站的大量数据,要么直接找对方要,要么动用大量 IP……

    抓取的性能不是问题,如果爬完全不同的网站,之前用 tornado 那个 async_http_client 写了一个爬虫,开 5 个进程一边爬一边往 HBase 里插,可以达到 2000 QPS。
    fanzeyi
    fanzeyi
    Sep 14, 2012
    19
    如果楼主可以生成出爬的页面的链接到一个数组里,可以直接用 grequests<https://crate.io/packages/grequests/> 非常好用的异步 URL Fetching 库.

    后端是 Gevent ..可以写上 callback 参数 =v=
    chendahui007
    chendahui007
    Nov 18, 2012
    20
    @cabinw 可以看看你写的爬豆瓣电影那个么?
    cabinw
    cabinw
    OP
    Nov 18, 2012
    22
    @chendahui007 我已经放弃爬了,会被封IP的
    cabinw
    cabinw
    OP
    Nov 18, 2012
    23
    @eric_q thanks,后来我也发现这个api了,看文档不够仔细阿,哈哈
    chendahui007
    chendahui007
    Nov 18, 2012
    24
    @cabinw 那可以观摩你之前写的代码么?俺是新手,很新的手,没啥思路 ...`从IMDB id tt0000000 到 tt9999999遍历访问一遍豆瓣的电影信息 ` 这 它们怎么关联的 ,求思路
    cabinw
    cabinw
    OP
    Nov 18, 2012
    25
    @chendahui007 gtalk:cabinw#gmail.com
    lj0014
    lj0014
    Nov 18, 2012
    26
    楼主爬了多少豆瓣电影了,据说有40W,我现在就爬了7W~
    cabinw
    cabinw
    OP
    Nov 18, 2012
    27
    @lj0014 哈哈,我已经停止了,本来有10来万的样子,交流下?
    lj0014
    lj0014
    Nov 19, 2012
    28
    @cabinw 加你gtalk了
    xi4nyu
    xi4nyu
    Nov 19, 2012
    29
    多核机子上面应该对应核数启,才能达到最大性能.
    feilaoda
    feilaoda
    Nov 19, 2012
    30
    @cabinw 用你的代码,也只爬了7w多的数据。不知道其他的链接怎么找到。
    BigZ
    BigZ
    Nov 19, 2012
    31
    异步?还快速?太黑了
    丢我们采集界的脸

    采集界有个原则,单线程同步采集,必要的时候还要sleep几秒
    lj0014
    lj0014
    Nov 19, 2012
    32
    @BigZ 我用scrapy 有限速的……
    cabinw
    cabinw
    OP
    Nov 19, 2012
    33
    @BigZ 汗~小白不懂规矩,在这里向采集界各位前辈赔礼道歉了~ Sorry!不过我最后没有这么做
    sohoer
    sohoer
    Nov 19, 2012
    34
    @BigZ 呵呵,混哪的
    lemon1992
    lemon1992
    Dec 16, 2013
    35
    @BigZ 我觉着还好吧,异步的库足够好的话,性能和单线程同步区别也不算大。各有优劣吧
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2681 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 81ms · UTC 13:42 · PVG 21:42 · LAX 05:42 · JFK 08:42
    ♥ Do have faith in what you're doing.