在自己 mac 上写了一个抓取的程序
打开进程监控查看 python,显示开了一个进程 带 8 个线程
cpu 最多就使用 90%
有什么方法能好的利用 cpu,加快速度抓取内容
1
JoshOY 2015-10-29 17:38:37 +08:00
cpu 用到 90%已经快到极限了吧,我觉得此时的瓶颈是你的带宽…
|
2
dai269619118 OP @JoshOY 不好意思 写错了 cpu 闲置了 90%
|
3
JoshOY 2015-10-29 17:51:32 +08:00 1
|
4
ltttx 2015-10-29 17:52:11 +08:00 1
瓶颈在 IO ,所以很有可能 IO 跑满,但是 CPU 没跑满,所以你用 CPU 来加速抓取其实是不成立的。不如开几个进程来跑死循环,这样 CPU 就跑满了。恩。
|
5
dai269619118 OP |
6
txx 2015-10-29 18:13:17 +08:00 1
爬虫为啥会密集运算....网络请求 -> 解析 html -> 持久化
除了解析 html 其他的都不是密集运算啊 |
7
dai269619118 OP @txx 其实我就想 抓的快一点
|
8
stillzhl 2015-10-29 18:24:10 +08:00 1
@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"等等,爬虫的架构以及性能分析等都很详细。 |
9
zts1993 2015-10-29 18:50:34 +08:00 1
scrapy redis 多进程多机部署,,只能帮你到这里了
|
10
leavic 2015-10-29 18:58:25 +08:00 1
在 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 个进程相互独立,就算哪个进程挂掉,重跑的风险也被分摊了。 |
11
ChiangDi 2015-10-29 19:01:31 +08:00 1
抓快一点会被容易封的吧...
|
12
dai269619118 OP |
13
alexinit 2015-10-30 10:56:58 +08:00 1
爬虫不对于 CPU 的消耗不大啊,主要瓶颈在 IO 和网速,还有你怕的站点做的限制.
|
14
alexinit 2015-10-30 10:57:18 +08:00
爬
|