爬虫判断 Content-Length 的问题

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

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

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

不想浪费带宽内存还说得过去,判断<10k 就关闭连接,不继续读取
goofool
2018-12-16 16:46:04 +08:00
head 请求

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/517957

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX