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

爬虫判断 Content-Length 的问题

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

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

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

    不想浪费带宽内存还说得过去,判断<10k 就关闭连接,不继续读取
        9
    goofool   68 天前 via Android
    head 请求
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   939 人在线   最高记录 4385   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 16ms · UTC 19:12 · PVG 03:12 · LAX 11:12 · JFK 14:12
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1