爬虫: asyncio+aiohttp 比 scrapy 还快吗? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
drroot

爬虫: asyncio+aiohttp 比 scrapy 还快吗?

  •  1
     
  •   drroot Feb 19, 2018 6754 views
    This topic created in 2992 days ago, the information mentioned may be changed or developed.

    每天爬 1 百万网页,用 1000 个代理( 50%有效)

    获取的是 json 文件,把每个结果输出到同一个 csv 文件里

    对于异常或 timeout 的访问,希望自动尝试新代理,最多尝试三次

    asyncio+aiohttp 是否比 Scrapy 更快 也更稳定呢?

    Supplement 1    Feb 20, 2018
    因为所有 URLS 是已知的,所以不用去重

    需要在 7 个小时内爬完
    Supplement 2    Feb 20, 2018
    用的这台 VPS 只有 2GB 内存 现在用 concurrent.futures 的 multithreading,max_workers 多点就爆内存 OOM,设少点 7 小时跑不完任务
    14 replies    2018-08-16 11:16:09 +08:00
    gouchaoer
        1
    gouchaoer  
       Feb 19, 2018 via Android
    首先 100w 数据量并不大,每个爬虫每 5s 访问一次的话只需要 65 个爬虫进程一天就能爬完 100w,假设我拿 200 个爬虫来爬,那这种程度的单机就能扛住,就阻塞的 requests 就 ok 了。。。so 大部分定制爬虫瓶颈不在 cpu
    gouchaoer
        2
    gouchaoer  
       Feb 20, 2018 via Android
    你输出到 csv 如何去重?结果需要保存到数据库,并且爬数据的时候去数据库看是否重复
    swirling
        3
    swirling  
       Feb 20, 2018
    @gouchaoer 从性能上分析得很好,我从另一个角度说两句. 对于 output 格式的统一处理, 如果你用 scrapy 是可以很容易切换文件或者是 database 的,只需要换 pipline. 对于 timeout 重试这些只需要配置就行了. 部署工具链一套全家桶, 我反正跑了快半年也没挂过. 你用 asyncio 要自己写的东西肯定更多. 除非你觉得你比别人聪明, 不然你出错的概率更大, 也更不稳定.
    gouchaoer
        4
    gouchaoer  
       Feb 20, 2018 via Android
    @swirling
    不是我太聪明,是大家把问题复杂化了,爬东西本身就是个简单的问题,scrapy 封装太厉害了,比如实现 lz 这个更换代理 3 次你 scrapy 怎么搞?去读文档写 hook 么?我手写的直接写逻辑就 ok 了。。。算了,反正你用起来爽就行
    drroot
        5
    drroot  
    OP
       Feb 20, 2018
    @gouchaoer 每条记录大小在 10KB 左右,所以 100 万网页,需要在 7 小时内下载 10GB 的数据
    drroot
        6
    drroot  
    OP
       Feb 20, 2018
    @swirling 现在是想先输出成 csv,以后从 csv 导入各种数据库再行处理,也很方便哒
    gouchaoer
        7
    gouchaoer  
       Feb 20, 2018 via Android
    @drroot 你不考虑爬虫只是考虑代理和带宽的话,用异步或者半协程的确能提高速度,go 和 php 甚至有 fullstack 的协程 httpclient,在低 cpu 下打满带宽,但是一般情况下搞爬虫的精力还在和反爬搏斗,你这种瓶颈在代理 ip 上,直接堆机器吧
    drroot
        8
    drroot  
    OP
       Feb 20, 2018
    @swirling Scrapy 有没办法把访问每个网址是否成功的状态返回,如果没有成功返回或者 timeout 或者有 exception,就把这个网址放入 pool,下次循环对这个 pool 里没有成功访问的网址重新运行?
    swirling
        9
    swirling  
       Feb 20, 2018
    https://github.com/aivarsk/scrapy-proxies
    直接撸个 middleware 上去. 如果觉得他不符合需求再自己写.
    gouchaoer
        10
    gouchaoer  
       Feb 20, 2018 via Android
    看来我干了 2 年全职爬虫还是有积累的
    inflationaaron
        11
    inflationaaron  
       Feb 20, 2018
    这个还是看语言,我用 aiohttp + asyncio + uvloop 写的就是没有 Go 的多线程快。如果资源有限的话用手动管理内存可能更好一点?
    drroot
        12
    drroot  
    OP
       Feb 22, 2018
    @inflationaaron 相比 scrapy 呢?
    inflationaaron
        13
    inflationaaron  
       Feb 22, 2018
    @drroot 比 scrapy 简单,而且速度更快。说到底 scrapy 是用 Twisted 的,可以看看 uvloop 的 benchmark:

    https://magic.io/blog/uvloop-blazing-fast-python-networking/

    性能可以赶上单核 Go 了,但是没有办法利用多核就是硬伤。
    rocketman13
        14
    rocketman13  
       Aug 16, 2018
    你用 asyncio+aiohttp 遇到过什么坑吗?例如没有任何反爬措施的 api 会请求超时,同样的 api 如果用 request 就能随便拿到数据这种。。。。
    About     Help     Advertise     Blog     API     FAQ     Solana     2425 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 39ms UTC 15:47 PVG 23:47 LAX 08:47 JFK 11:47
    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