V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
mon3
V2EX  ›  问与答

不考虑被爬网站的各种限制,有什么方法可以加快爬虫的速度?

  •  
  •   mon3 · 2018-01-11 20:44:41 +08:00 · 2400 次点击
    这是一个创建于 2508 天前的主题,其中的信息可能已经有所发展或是发生改变。
    只需要页面的 status 状态码,有什么方法可以最大化爬虫的速度。

    单机,CPU AMD 1700 100M 宽带。

    现在用 python 写的,1 小时能爬 30W+的 URL

    还有其他方法可以加快速度?

    其他语言的也可以推荐。
    10 条回复    2018-01-12 15:01:42 +08:00
    justfly
        1
    justfly  
       2018-01-11 20:54:17 +08:00   ❤️ 2
    首先确定 瓶颈 在哪里。

    如果是阻塞的 IO 可以换非阻塞的 IO,便于榨干 CPU. 然后开多个线程并绑定到每个核心上。

    之后看 CPU 和 带宽哪个先成为瓶颈,如果带宽不够用了,考虑只发 HEAD 请求,或者自己实现 HTTP Client 读完头部就关连接。如果 CPU 先成瓶颈那就换语言吧

    代码逻辑上尽量增大并行度。
    fiht
        2
    fiht  
       2018-01-11 22:59:35 +08:00
    楼上大佬说得对。讲得很全面了。
    还有一点就是做好 DNS 缓存,这个对爬虫性能影响很大。
    akira
        3
    akira  
       2018-01-12 02:39:35 +08:00
    先粗暴的加机器
    tSQghkfhTtQt9mtd
        4
    tSQghkfhTtQt9mtd  
       2018-01-12 08:23:51 +08:00 via Android
    @fiht 有点在意 DNS 缓存要怎么做,前几周查了老半天。。(有个 python dns 请求量爆炸,不知道为啥全部都往上游发 dns,本地完全没缓存
    qsnow6
        5
    qsnow6  
       2018-01-12 08:37:58 +08:00 via iPhone
    scrapy
    mon3
        6
    mon3  
    OP
       2018-01-12 10:02:40 +08:00
    @qsnow6 没有自己写的快。
    Akkuman
        7
    Akkuman  
       2018-01-12 10:54:49 +08:00
    @justfly
    > 自己实现 HTTP Client 读完头部就关连接
    请问下这个怎么实现?自己实现 HEAD 请求还是?
    qsnow6
        8
    qsnow6  
       2018-01-12 11:23:28 +08:00
    @mon3 不知道你怎么写的,scrapy 单进程 7000 page /min 跟玩一样
    justfly
        9
    justfly  
       2018-01-12 11:26:35 +08:00
    @Akkuman

    这是我的一个脑洞,能用 HEAD 当然优先 HEAD 请求,考虑到很多网站不接受 HEAD 请求,只能 GET,但楼主想要极致速度,就要节省带宽,你就要自己发 GET 请求,读完头部就别再管很大的 body 了。

    这个实现要到直接操作 socket 了。
    Akkuman
        10
    Akkuman  
       2018-01-12 15:01:42 +08:00
    @justfly 谢谢提示^-^
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2664 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 05:14 · PVG 13:14 · LAX 21:14 · JFK 00:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.