1.我理解 爬虫主要的问题在于网络阻塞,所以使用多线程弥补 HTTP 异步等待。
那么使用了gevent
解决网络问阻塞题,就不需要使用多线程吗?
2.python 多线程运行时,使用的是单核心,还是多核心?在多核心机器上运行
如果是单核心,能否同时使用多线程
与多进程
?
3.在 4 核心 8 线程的电脑上,开启单个进程 32 线程 python 运行,这些线程是怎么分配的?
4.当网络阻塞不是瓶颈,如何才能最大化使用单台电脑 CPU ?应该使用多线程还是多进程增大爬取速率?
5.使用消息队列分布式爬虫,等待的消息过多会不会存在内存或 CPU 问题?
6.使用消息队列是如何增大爬取速率的?
1
leavic 2016-10-31 17:16:36 +08:00 2
首先,从来没有任何框架真正解决了网络阻塞问题, gevent 和 twisted 之类的异步是变相的网络多线程,理论上你可以一直异步一直等待,但你的连接数会达到无限大,在这之前连接就被服务器干掉了。
在这个前提下,异步也只能在一个限定的连接数之下充分发挥你最大的带宽而已,网络依然是阻塞的。 |
2
cdwyd 2016-10-31 17:20:07 +08:00 1
感觉你考虑太多了,爬虫的限制一般都来自目标网站
|
3
sunwei0325 2016-10-31 17:46:16 +08:00
花大把时间搞定之后, 一个 captcha 傻眼了
|
4
holajamc 2016-10-31 17:58:03 +08:00 1
你可以试试 pypy ,我觉得足够了= =
|
5
binux 2016-10-31 18:04:01 +08:00 1
1. 不需要
2. 单核,启动多个进程 3. 随机使用一个核 4. 多进程 5. 会 6. 使用消息队列不会增大爬取速率 |
6
ioiogoo 2016-10-31 18:31:19 +08:00
真的不担心把目标网站爬挂吗?
|
7
anexplore 2016-10-31 19:30:13 +08:00 1
真正的瓶颈来源于目标网站的反爬虫策略
|
8
WinterWu 2016-10-31 20:01:12 +08:00 1
瓶颈在 IO ,也就是网络上,包括目标网站的响应速度、网络状况、本地网络等。这个响应速度实际情况下至少也是 10ms 以上的,而你 CPU 处理这个页面速度怎么也在 0.01ms 以下吧(除非你里面又放了什么 IO 操作);所以你看这个速度差距在 1000 倍以上;你唯一要考虑的是目标网站把你当 DOS 攻击把你屏蔽了(有各种屏蔽方式)。如果对方真允许你这么快,你也的确需要这么快,那么多开几个进程吧;注意不要重复爬就是了。
分布式爬虫什么的不是爬单个简单目标,而是爬很多目标的情况下使用的,这个是集群情况下使用,单机就不用了吧。 另外楼主的问题其实不是关于爬虫的,而是计算机 /软件基础知识不清楚,建议补补这些吧。 |
9
ljcarsenal 2016-10-31 20:03:38 +08:00
@sunwei0325 233333
|
10
em70 2016-10-31 20:03:59 +08:00 1
python 的多线程本身就不稳定,我一般是把程序写成单线程,但启动多个进程来跑,非常稳定
|
11
sudoz 2016-10-31 20:11:28 +08:00
1L 已经回答了
|
12
yanzixuan 2016-11-01 13:55:43 +08:00
@em70 有时候要半路停下来就挺恶心了,要 awk 然后 xargs kill 。一个脚本里多个进程,杀起来就比较容易。。
|