求教 scrapy 的一个问题,困扰了很久。 - V2EX
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 7131 次点击
    这是一个创建于 3475 天前的主题,其中的信息可能已经有所发展或是发生改变。
    时间较长的阻塞函数是不适宜放置在 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     Solana     2157 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 31ms UTC 00:32 PVG 08:32 LAX 17:32 JFK 20:32
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86