推荐学习书目
› 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 · 7933 views
    This topic created in 3865 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
    appleandbanana
    Apr 6, 2016
    1
    我最近也在弄 scrapy+phantomjs 诶,楼主留个联系方式啊,咱一起研究研究~
    chinvo
    chinvo
    Apr 6, 2016
    2
    如果 phantomjs 没提供异步方法的话,一个来自 php 的思路:

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

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

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

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

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

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