用 requests 替代 scrapy 的下载器,发现速度很慢,求解

2017-03-29 17:39:10 +08:00
 dsg001
class MyDownloaderMiddleware(object):

    def process_request(self, request, spider):
        res = requests.get(request.url)
        return HtmlResponse(request.url, body=res.content, encoding='utf-8', request=request)

scrapy 的下载器调教起来不如 requests 方便,所以想用 requests 替代

5981 次点击
所在节点    Python
15 条回复
knightdf
2017-03-29 17:51:02 +08:00
因为你这是一个同步操作,用 deferreds
bazingaterry
2017-03-29 17:52:20 +08:00
又想像同步一样逻辑清晰,又想有异步一样的性能,貌似很难调和呢……
lilydjwg
2017-03-29 17:54:09 +08:00
不要用 requests.get !

用同一个 requests.Session ,你能提速一倍以上!
dsg001
2017-03-29 18:23:45 +08:00
@knightdf 能分享个 demo 不,文档啃的太慢
@bazingaterry 一直没研究锅 twisted
@lilydjwg 实际代码中用的 requests.Session ,但速度比原生还是差的太多
bazingaterry
2017-03-29 19:20:53 +08:00
@dsg001 twisted 的确有点啰嗦……
knightdf
2017-03-29 19:22:43 +08:00
@dsg001 参考 scrapy 源码啊。日难看的,不想看第二遍
dsg001
2017-03-29 20:42:03 +08:00
@knightdf 找到相关源码了 scrapy/core/downloader/handlers/__init__.py
@bazingaterry 太别扭了
onlyice
2017-03-29 21:19:55 +08:00
Twisted 我硬是没学会。。有一些门槛。。
dsg001
2017-03-30 10:53:43 +08:00
@onlyice 面向需求学习 ←_←
kakadong
2017-03-30 14:18:29 +08:00
你这是在乱搞啊,下载中间件是负责修改每个 request 和 response 的,是不做下载这个动作的!你在里面加一个 requests.get 操作,等于每个网页你都下载了两遍,而且这个 get 操作还是同步的!!
kakadong
2017-03-30 14:43:40 +08:00
不好意思没认真看,下载了两遍是我说错的,你在 process_request 里返回了 response ,那 scrapy 就不会再去下载这个网页,但这样,并发就完全没有了,跟单线程用 requests 没什么区别
dsg001
2017-03-30 20:33:43 +08:00
@kakadong 嗯,所以需要重写下载器,方便 twisted 异步调用
mathgl
2017-03-31 19:51:32 +08:00
可以考虑使用 treq
https://github.com/twisted/treq
Vinkito
2017-05-08 00:48:38 +08:00
请问楼主找到好的解决方法了么,有没有 demo 提供参考一下。
dsg001
2017-05-08 08:36:06 +08:00

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

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

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

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

© 2021 V2EX