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

爬虫判断 Content-Length 的问题

  •  
  •   csx163 · 2018-12-16 09:33:47 +08:00 · 2933 次点击
    这是一个创建于 2154 天前的主题,其中的信息可能已经有所发展或是发生改变。
    各位大佬,请问你们的爬虫是:
    先 get head 读取 Content-Length 再 get 一次下载页面
    还是
    直接下载整个页面一次搞定?
    meik2333
        1
    meik2333  
       2018-12-16 09:36:29 +08:00   ❤️ 1
    可以在 get 请求的一个 TCP 连接中,先读取 Content-Length 然后再继续读数据内容,这样只用 get 一次。
    csx163
        2
    csx163  
    OP
       2018-12-16 11:04:57 +08:00
    @meik2333 使用的 python 的 request 库,貌似没看到支持这个操作。。。
    meik2333
        3
    meik2333  
       2018-12-16 11:07:29 +08:00
    @csx163 requests 库吧...requests 已经帮你把这些事情处理好了,直接 get 请求一次就好了。
    csx163
        4
    csx163  
    OP
       2018-12-16 11:30:01 +08:00
    @meik2333 哦,抱歉问题没有描述清楚,意思是判断 Content-Length 小于 10kb 就不下载了,大于 10kb 就下载页面,目前 10kb 以下的页面占 40%左右,body 页面 500kb 至 2000kb 不等,不考虑带宽的情况下,纯粹为了爬取的隐蔽性,是不是预先读取 head 会好一些?
    meik2333
        5
    meik2333  
       2018-12-16 11:52:39 +08:00
    @csx163 这...看你自己的想法吧...

    requests 底层是复用了 tcp 连接的,一般来说一次请求是可以获得多于 10kb 的数据的。也就是说,你 head 一次和 get 一个 10kb 的页面都是一次传输。反而之前一次请求的现在需要两次,更可能被封。

    为了隐蔽性的话,一般的可以随机 UA 之类的,如果对方有反爬机制的话,可以上代理。
    summerwar
        6
    summerwar  
       2018-12-16 14:43:48 +08:00
    requests 有个 stream 参数,看下那个
    otakustay
        7
    otakustay  
       2018-12-16 15:37:20 +08:00
    用稍微底层一些的库,get head 和 response 不冲突,response 应该是一个 stream,当你拿到 header 的时候这个 stream 还没开始读,这个时候判断一下,需要的就读 stream,不需要的就直接断掉
    imn1
        8
    imn1  
       2018-12-16 16:29:01 +08:00
    如果只是隐蔽性没必要
    多一次请求和连接隐蔽性更差

    不想浪费带宽内存还说得过去,判断<10k 就关闭连接,不继续读取
    goofool
        9
    goofool  
       2018-12-16 16:46:04 +08:00 via Android
    head 请求
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2823 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 13:40 · PVG 21:40 · LAX 05:40 · JFK 08:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.