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
dai269619118
V2EX  ›  Python

scrapy 抓取速度问题

  •  
  •   dai269619118 · 2015-10-29 17:26:28 +08:00 · 11085 次点击
    这是一个创建于 3337 天前的主题,其中的信息可能已经有所发展或是发生改变。

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


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

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

    除了解析 html 其他的都不是密集运算啊
    dai269619118
        7
    dai269619118  
    OP
       2015-10-29 18:15:41 +08:00
    @txx 其实我就想 抓的快一点
    stillzhl
        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"等等,爬虫的架构以及性能分析等都很详细。
    zts1993
        9
    zts1993  
       2015-10-29 18:50:34 +08:00   ❤️ 1
    scrapy redis 多进程多机部署,,只能帮你到这里了
    leavic
        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 个进程相互独立,就算哪个进程挂掉,重跑的风险也被分摊了。
    ChiangDi
        11
    ChiangDi  
       2015-10-29 19:01:31 +08:00   ❤️ 1
    抓快一点会被容易封的吧...
    dai269619118
        12
    dai269619118  
    OP
       2015-10-30 08:55:17 +08:00
    @stillzhl
    @zts1993
    @ChiangDi
    @leavic
    非常感谢 大致有思路了
    alexinit
        13
    alexinit  
       2015-10-30 10:56:58 +08:00   ❤️ 1
    爬虫不对于 CPU 的消耗不大啊,主要瓶颈在 IO 和网速,还有你怕的站点做的限制.
    alexinit
        14
    alexinit  
       2015-10-30 10:57:18 +08:00
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5986 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 49ms · UTC 02:14 · PVG 10:14 · LAX 18:14 · JFK 21:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.