V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
mintyun
V2EX  ›  Python

关于 python 爬虫速率的疑问

  •  
  •   mintyun · 2016-10-31 16:53:54 +08:00 · 2831 次点击
    这是一个创建于 2950 天前的主题,其中的信息可能已经有所发展或是发生改变。

    优化网络:

    1.我理解 爬虫主要的问题在于网络阻塞,所以使用多线程弥补 HTTP 异步等待。 那么使用了gevent解决网络问阻塞题,就不需要使用多线程吗?

    优化 CPU :

    2.python 多线程运行时,使用的是单核心,还是多核心?在多核心机器上运行如果是单核心,能否同时使用多线程多进程

    3.在 4 核心 8 线程的电脑上,开启单个进程 32 线程 python 运行,这些线程是怎么分配的?

    4.当网络阻塞不是瓶颈,如何才能最大化使用单台电脑 CPU ?应该使用多线程还是多进程增大爬取速率?

    5.使用消息队列分布式爬虫,等待的消息过多会不会存在内存或 CPU 问题?

    6.使用消息队列是如何增大爬取速率的?

    12 条回复    2016-11-01 13:55:43 +08:00
    leavic
        1
    leavic  
       2016-10-31 17:16:36 +08:00   ❤️ 2
    首先,从来没有任何框架真正解决了网络阻塞问题, gevent 和 twisted 之类的异步是变相的网络多线程,理论上你可以一直异步一直等待,但你的连接数会达到无限大,在这之前连接就被服务器干掉了。
    在这个前提下,异步也只能在一个限定的连接数之下充分发挥你最大的带宽而已,网络依然是阻塞的。
    cdwyd
        2
    cdwyd  
       2016-10-31 17:20:07 +08:00   ❤️ 1
    感觉你考虑太多了,爬虫的限制一般都来自目标网站
    sunwei0325
        3
    sunwei0325  
       2016-10-31 17:46:16 +08:00
    花大把时间搞定之后, 一个 captcha 傻眼了
    holajamc
        4
    holajamc  
       2016-10-31 17:58:03 +08:00   ❤️ 1
    你可以试试 pypy ,我觉得足够了= =
    binux
        5
    binux  
       2016-10-31 18:04:01 +08:00   ❤️ 1
    1. 不需要
    2. 单核,启动多个进程
    3. 随机使用一个核
    4. 多进程
    5. 会
    6. 使用消息队列不会增大爬取速率
    ioiogoo
        6
    ioiogoo  
       2016-10-31 18:31:19 +08:00
    真的不担心把目标网站爬挂吗?
    anexplore
        7
    anexplore  
       2016-10-31 19:30:13 +08:00   ❤️ 1
    真正的瓶颈来源于目标网站的反爬虫策略
    WinterWu
        8
    WinterWu  
       2016-10-31 20:01:12 +08:00   ❤️ 1
    瓶颈在 IO ,也就是网络上,包括目标网站的响应速度、网络状况、本地网络等。这个响应速度实际情况下至少也是 10ms 以上的,而你 CPU 处理这个页面速度怎么也在 0.01ms 以下吧(除非你里面又放了什么 IO 操作);所以你看这个速度差距在 1000 倍以上;你唯一要考虑的是目标网站把你当 DOS 攻击把你屏蔽了(有各种屏蔽方式)。如果对方真允许你这么快,你也的确需要这么快,那么多开几个进程吧;注意不要重复爬就是了。
    分布式爬虫什么的不是爬单个简单目标,而是爬很多目标的情况下使用的,这个是集群情况下使用,单机就不用了吧。

    另外楼主的问题其实不是关于爬虫的,而是计算机 /软件基础知识不清楚,建议补补这些吧。
    ljcarsenal
        9
    ljcarsenal  
       2016-10-31 20:03:38 +08:00
    @sunwei0325 233333
    em70
        10
    em70  
       2016-10-31 20:03:59 +08:00   ❤️ 1
    python 的多线程本身就不稳定,我一般是把程序写成单线程,但启动多个进程来跑,非常稳定
    sudoz
        11
    sudoz  
       2016-10-31 20:11:28 +08:00
    1L 已经回答了
    yanzixuan
        12
    yanzixuan  
       2016-11-01 13:55:43 +08:00
    @em70 有时候要半路停下来就挺恶心了,要 awk 然后 xargs kill 。一个脚本里多个进程,杀起来就比较容易。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1529 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 17:10 · PVG 01:10 · LAX 09:10 · JFK 12:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.