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

2016-04-06 13:38:46 +08:00
 Yc1992
时间较长的阻塞函数是不适宜放置在 parse 回调函数里面的,这个我懂。

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

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

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

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

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

不过没有 phantomjs 强大
Yc1992
2016-04-06 14:25:37 +08:00
@chinvo 这不就成了一个服务了吗?还要去监控和守护?
appleandbanana
2016-04-06 14:26:52 +08:00
@Yc1992 那我看看去,谢啦~
Yc1992
2016-04-06 14:27:19 +08:00
@cxh116 见楼上,实际情况是项目部署上 splash 不被允许,需要使用 docker
chinvo
2016-04-06 14:48:45 +08:00
@Yc1992 既然用 docker 的话,管理一个这样的服务并不是很困难的样子
Yc1992
2016-04-06 14:56:10 +08:00
@chinvo 不是难度问题,是项目经理不允许使用。
davidzhang
2016-04-06 15:07:54 +08:00
目前偶的已经上线了,并且在运行了,就是网络流量会很大
Yc1992
2016-04-06 15:11:03 +08:00
@davidzhang 使用 splash 服务的 scrapy 爬虫吗?
chinvo
2016-04-06 15:29:53 +08:00
@Yc1992 换个思路,数据直接入库,在需要的时候再调用 phantomjs 渲染
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
2016-04-06 16:06:48 +08:00
@cxh116 是的,但是生产环境只有 10.04 ,很多依赖需要手工编译,然后被否决了。。。
Yc1992
2016-04-06 16:09:02 +08:00
@chinvo 是个不错的建议,我再想想,谢谢~
WildCat
2016-04-06 16:09:20 +08:00
最近上了 node 用 nightmare ,基于 electron 的,楼主可以试试这个如何。我觉得性能不错。就是任务调度你得自己写了
knightdf
2016-04-06 16:58:21 +08:00
因为 phantomjs 本来就很慢,然后你这个可以直接用 phantomjs 来写一个下载器中间件
Yc1992
2016-04-06 17:37:02 +08:00
@knightdf 试过,直接 timeout 了 ,太慢了
knightdf
2016-04-06 20:15:23 +08:00
@Yc1992 timeout 的时间是你自己定义的啊。 scrapy 只是有个默认值罢了
ffwalle
2016-04-07 00:39:14 +08:00
python GIL 单线程,不管你怎么搞,它就是单线程。

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

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

不过,总体来讲,更多的,应该考虑带宽,以及防屏蔽机制。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/268947

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX