推荐学习书目
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
bytenoob
V2EX  ›  Python

求教 scrapy 的一个问题,困扰了很久。

  •  
  •   bytenoob ·
    bufrr · Apr 6, 2016 · 7503 views
    This topic created in 3697 days ago, the information mentioned may be changed or developed.
    时间较长的阻塞函数是不适宜放置在 parse 回调函数里面的,这个我懂。

    但是目前由于需要渲染带有 js 的页面,我使用了子进程 subprocess 调用 phantomjs 来完成页面的渲染,针对每个页面。

    我把这个实现写在了 parse 里面,导致了爬虫速度大大下降。

    有什么方法可以异步执行这种对时间消耗比较大的回调呢?

    谢谢!
    23 replies    2017-04-05 21:23:39 +08:00
    appleandbanana
        1
    appleandbanana  
       Apr 6, 2016
    我最近也在弄 scrapy+phantomjs 诶,楼主留个联系方式啊,咱一起研究研究~
    chinvo
        2
    chinvo  
       Apr 6, 2016
    如果 phantomjs 没提供异步方法的话,一个来自 php 的思路:

    用 phantomjs 封装个 web api 或者 unix socks 什么的,爬虫的 parse 里面去调用,不等待返回。
    bytenoob
        3
    bytenoob  
    OP
       Apr 6, 2016
    @appleandbanana 如果没有特别的限制,建议你用 scrapyjs ,比 phantomjs 好用得多,加上一个中间件,渲染效果很好。
    cxh116
        4
    cxh116  
       Apr 6, 2016
    js 抓取可以用 https://github.com/scrapy-plugins/scrapy-splash

    不过没有 phantomjs 强大
    bytenoob
        5
    bytenoob  
    OP
       Apr 6, 2016
    @chinvo 这不就成了一个服务了吗?还要去监控和守护?
    appleandbanana
        6
    appleandbanana  
       Apr 6, 2016
    @Yc1992 那我看看去,谢啦~
    bytenoob
        7
    bytenoob  
    OP
       Apr 6, 2016
    @cxh116 见楼上,实际情况是项目部署上 splash 不被允许,需要使用 docker
    chinvo
        8
    chinvo  
       Apr 6, 2016
    @Yc1992 既然用 docker 的话,管理一个这样的服务并不是很困难的样子
    bytenoob
        9
    bytenoob  
    OP
       Apr 6, 2016
    @chinvo 不是难度问题,是项目经理不允许使用。
    davidzhang
        10
    davidzhang  
       Apr 6, 2016
    目前偶的已经上线了,并且在运行了,就是网络流量会很大
    bytenoob
        11
    bytenoob  
    OP
       Apr 6, 2016
    @davidzhang 使用 splash 服务的 scrapy 爬虫吗?
    chinvo
        12
    chinvo  
       Apr 6, 2016
    @Yc1992 换个思路,数据直接入库,在需要的时候再调用 phantomjs 渲染
    cxh116
        13
    cxh116  
       Apr 6, 2016
    @Yc1992 splash 不一定要 docker .你觉得不麻烦, 手动安装到 linux 系统也可以. docker 只是为了省事,不用手动编译安装.

    http://splash.readthedocs.org/en/latest/install.html#ubuntu-14-04-manual-way
    bytenoob
        14
    bytenoob  
    OP
       Apr 6, 2016
    @cxh116 是的,但是生产环境只有 10.04 ,很多依赖需要手工编译,然后被否决了。。。
    bytenoob
        15
    bytenoob  
    OP
       Apr 6, 2016
    @chinvo 是个不错的建议,我再想想,谢谢~
    WildCat
        16
    WildCat  
       Apr 6, 2016
    最近上了 node 用 nightmare ,基于 electron 的,楼主可以试试这个如何。我觉得性能不错。就是任务调度你得自己写了
    knightdf
        17
    knightdf  
       Apr 6, 2016
    因为 phantomjs 本来就很慢,然后你这个可以直接用 phantomjs 来写一个下载器中间件
    bytenoob
        18
    bytenoob  
    OP
       Apr 6, 2016
    @knightdf 试过,直接 timeout 了 ,太慢了
    knightdf
        19
    knightdf  
       Apr 6, 2016
    @Yc1992 timeout 的时间是你自己定义的啊。 scrapy 只是有个默认值罢了
    ffwalle
        20
    ffwalle  
       Apr 7, 2016
    python GIL 单线程,不管你怎么搞,它就是单线程。

    本身做爬虫就不应该用那些什么 scrapy 一类的框架,应该因地制宜结合实际情况,自己做结构。

    如果真的特别关心性能,应该考虑用 java 一类的能真正充分利用 cpu 的来做。

    不过,总体来讲,更多的,应该考虑带宽,以及防屏蔽机制。
    bytenoob
        21
    bytenoob  
    OP
       Apr 7, 2016
    @ffwalle 框架方便了我们这些初级码农写一些还不算太糟糕的爬虫,不过越写越发现确实很多地方被框架所限,谢谢你的建议~
    bytenoob
        22
    bytenoob  
    OP
       Apr 7, 2016
    @knightdf 额 我记得直接 timeout 导致 connection close 了
    sckieer
        23
    sckieer  
       Apr 5, 2017
    @cxh116 大神,我用 splash 为啥加载不了 iframe 下的内容啊?
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3092 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 65ms · UTC 13:57 · PVG 21:57 · LAX 06:57 · JFK 09:57
    ♥ Do have faith in what you're doing.