mon3
V2EX  ›  问与答

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

  •  
  •   mon3 · Jan 11, 2018 · 2897 views
    This topic created in 3062 days ago, the information mentioned may be changed or developed.
    只需要页面的 status 状态码,有什么方法可以最大化爬虫的速度。

    单机,CPU AMD 1700 100M 宽带。

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

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

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

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

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

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

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

    这个实现要到直接操作 socket 了。
    Akkuman
        10
    Akkuman  
       Jan 12, 2018
    @justfly 谢谢提示^-^
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5522 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 75ms · UTC 05:47 · PVG 13:47 · LAX 22:47 · JFK 01:47
    ♥ Do have faith in what you're doing.