有人试过并发爬虫时把返回结果的处理放到消息队列中么?

2017 年 11 月 21 日
 fyooo
简单来说是我在想能不能把我想要下载的网站 url1, url2, url3 ... 等用 Requests 库发送请求后作为生产者放到消息队列里面,当这特定的 urlN 有返回包时消费者就从消息队列里面读取网站内容。

不知道技术上靠谱么?
5574 次点击
所在节点    Python
20 条回复
dawncold
2017 年 11 月 21 日
听起来你打算用一个很慢的队列技术来实现异步非阻塞框架的功能
nilai
2017 年 11 月 21 日
这就是分布式的雏形。。。。
wsbnd9
2017 年 11 月 21 日
这没有什么问题,简单点用 redis 更好点有 Kafka 然后开多进程去前面队列读取数据进行处理
dawncold
2017 年 11 月 21 日
可以做得到,技术上没什么问题,比如 tornado 框架、asyncio 就可以做到
p2pCoder
2017 年 11 月 21 日
我想了解 如何 拿到特定的返回包
picone
2017 年 11 月 21 日
还真试过放到 redis 里面的 SET 集合里。
我用 Go 做过一个搜索引擎,当时就是把爬回来的结果发给消费者,消费者处理后把结果放到 Redis 的 SET 里面,同时还能去重,但是有个问题,消费者处理到的 url 越来越多,然后 Redis 存放的体积越来越大。。。
asuraa
2017 年 11 月 21 日
baixiangcpp
2017 年 11 月 21 日
scrapy-redis python 安装这个就好了
dawncold
2017 年 11 月 21 日
@wsbnd9 他的意思是要把网络 io 变成非阻塞的模式
dawncold
2017 年 11 月 21 日
@p2pCoder socket 可 read 信号
3IOhG7M0knRu5UlC
2017 年 11 月 21 日
可以啊,这不是很常用方案。要对数据做清洗处理才能入库。
p2pCoder
2017 年 11 月 21 日
@dawncold 请教一下,这个 socket 要监听 什么参数,能拿到特定的包返回
还有就是 这个过程会有 包丢失吗?
smilekung
2017 年 11 月 21 日
没问题啊 我现在就这么做的 更奢侈的是 我回吧 request 返回结果 直接存到 oss 里 然后把 key 丢到队列里
smilekung
2017 年 11 月 21 日
不过 request 可以直接发异步请求啊 加一个回调 就可以在收到 response 时处理
fyooo
2017 年 11 月 21 日
@smilekung 可以分享一下你的消息队列技术细节么?
dawncold
2017 年 11 月 21 日
@p2pCoder linux 系统中把很多功能抽象成文件,比如 socket 也是。简单说就是,对方发送回响应到达本机网卡后,内核会找到等待处理的进程,通知它可以读取数据了。
wsbnd9
2017 年 11 月 21 日
cheesea
2017 年 11 月 21 日
你去看一下 pyspider 的源码,它就是这么干的。
调度器,下载器,结果处理器通过消息队列沟通,可以在一台机器上跑调度器,另外几台机器跑多个下载器和处理器,实现分布式。
smilekung
2017 年 11 月 22 日
@fyooo 基本跟楼上说的一样 要抓取的连接和抓取的内容都通过消息队列交互 如果是你的需求可以直接用一个异步的 request 工具
lxwu
2017 年 11 月 22 日
技术上没什么问题,但是脱离业务场景谈架构是无意义的。
队列最根本的目的还是解耦,你这里说将队列放置在请求之后,而调度与请求还是一个高耦合的状态。
另外,我引入一个业务场景,假设 url ( url1, url2, ...)有抓取优先级,那么你这个设计如何满足需求?

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

https://study.congcong.us/t/408277

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

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

© 2021 V2EX