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

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

  •  
  •   Yc1992 ·
    bufrr · 2016-04-06 13:38:46 +08:00 · 6763 次点击
    这是一个创建于 3145 天前的主题,其中的信息可能已经有所发展或是发生改变。
    时间较长的阻塞函数是不适宜放置在 parse 回调函数里面的,这个我懂。

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

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

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

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

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

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

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

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

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

    不过,总体来讲,更多的,应该考虑带宽,以及防屏蔽机制。
    Yc1992
        21
    Yc1992  
    OP
       2016-04-07 08:51:32 +08:00
    @ffwalle 框架方便了我们这些初级码农写一些还不算太糟糕的爬虫,不过越写越发现确实很多地方被框架所限,谢谢你的建议~
    Yc1992
        22
    Yc1992  
    OP
       2016-04-07 08:52:59 +08:00
    @knightdf 额 我记得直接 timeout 导致 connection close 了
    sckieer
        23
    sckieer  
       2017-04-05 21:23:39 +08:00
    @cxh116 大神,我用 splash 为啥加载不了 iframe 下的内容啊?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1881 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 16:40 · PVG 00:40 · LAX 08:40 · JFK 11:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.