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

2018-01-11 20:44:41 +08:00
 mon3
只需要页面的 status 状态码,有什么方法可以最大化爬虫的速度。

单机,CPU AMD 1700 100M 宽带。

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

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

其他语言的也可以推荐。
2394 次点击
所在节点    问与答
10 条回复
justfly
2018-01-11 20:54:17 +08:00
首先确定 瓶颈 在哪里。

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

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

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

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

这个实现要到直接操作 socket 了。
Akkuman
2018-01-12 15:01:42 +08:00
@justfly 谢谢提示^-^

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

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

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

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

© 2021 V2EX