scrapy 抓取速度问题

2015-10-29 17:26:28 +08:00
 dai269619118

在自己 mac 上写了一个抓取的程序
打开进程监控查看 python,显示开了一个进程 带 8 个线程


cpu 最多就使用 90%
有什么方法能好的利用 cpu,加快速度抓取内容

11089 次点击
所在节点    Python
14 条回复
JoshOY
2015-10-29 17:38:37 +08:00
cpu 用到 90%已经快到极限了吧,我觉得此时的瓶颈是你的带宽…
dai269619118
2015-10-29 17:40:48 +08:00
@JoshOY 不好意思 写错了 cpu 闲置了 90%
JoshOY
2015-10-29 17:51:32 +08:00
@dai269619118 哦,这我就不太清楚了。
试试在 settings.py 里把 TIMEOUT 设小点,提高并发数( CONCURRENT_REQUESTS )看看?
ltttx
2015-10-29 17:52:11 +08:00
瓶颈在 IO ,所以很有可能 IO 跑满,但是 CPU 没跑满,所以你用 CPU 来加速抓取其实是不成立的。不如开几个进程来跑死循环,这样 CPU 就跑满了。恩。
dai269619118
2015-10-29 18:08:14 +08:00
@JoshOY 好的我试试 非常感谢!
@ltttx 是硬盘的 IO 吗?
txx
2015-10-29 18:13:17 +08:00
爬虫为啥会密集运算....网络请求 -> 解析 html -> 持久化

除了解析 html 其他的都不是密集运算啊
dai269619118
2015-10-29 18:15:41 +08:00
@txx 其实我就想 抓的快一点
stillzhl
2015-10-29 18:24:10 +08:00
@JoshOY cpu 用到极限应该是利用率达到 100% * 核心数,这才算是跑满多核 CPU 了。
@dai269619118 我觉得这里边你问了两个问题:
1 、为什么 8 个线程只用了 10%的 cpu ?
python 由于 GIL 的问题,单个进程里边的多线程并不能真正利用多核 cpu 的新能,不能实现多核上的并行,这能在单个核上并发之行。不过这对于爬虫这种 IO 密集型的程序已经足够了。在等待网络 IO 的时候, cpu 可以并发进行解析网页等计算。
2 、如何提高爬虫的抓取速度?
提高抓取速度的关键就是加快网络 IO ,可以从多个方面来解决这个问题,比如 1 、在本地做 dns 缓存; 2 、增加对页面的并发请求量等等措施。当然这些工作强大的 scrapy 框架已经都考虑到了。你可以自己去 google 里面搜索关于爬虫的 papper 阅读,关键词可以是“ Web Crawler"/"Distribute Web Crawler"等等,爬虫的架构以及性能分析等都很详细。
zts1993
2015-10-29 18:50:34 +08:00
scrapy redis 多进程多机部署,,只能帮你到这里了
leavic
2015-10-29 18:58:25 +08:00
setting.py 里面,可以把单 IP 或者单 domain 的 concurrent 线程数改成 16 或者更高,我这两天发现 16 线程对一般的网站来说根本没问题,而且 scrapy 自己的调度和重试系统可以保证每个页面都成功抓取。
至于分布式,前提还是被抓的服务器可以接受,在这个前提下,我有个比较笨的方法:
假定页面数是已知的,而且主页面的 url 是有规律的,例如 wordpress 的很多就是 domain.com/page/2000 这样的,同样的工程开 100 个进程,每个进程的 starturl 分别是 page/1 , page/21,page/41 这样的,然后自己实现一个 stopurl ,让这 100 个进程均摊 2000 个页面。一方面速度快(假定没有物理瓶颈),另一方面这 100 个进程相互独立,就算哪个进程挂掉,重跑的风险也被分摊了。
ChiangDi
2015-10-29 19:01:31 +08:00
抓快一点会被容易封的吧...
dai269619118
2015-10-30 08:55:17 +08:00
@stillzhl
@zts1993
@ChiangDi
@leavic
非常感谢 大致有思路了
alexinit
2015-10-30 10:56:58 +08:00
爬虫不对于 CPU 的消耗不大啊,主要瓶颈在 IO 和网速,还有你怕的站点做的限制.
alexinit
2015-10-30 10:57:18 +08:00

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

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

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

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

© 2021 V2EX