有人试过并发爬虫时把返回结果的处理放到消息队列中么? - 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
fyooo
V2EX    Python

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

  •  
  •   fyooo 2017-11-21 15:16:04 +08:00 5233 次点击
    这是一个创建于 2886 天前的主题,其中的信息可能已经有所发展或是发生改变。
    简单来说是我在想能不能把我想要下载的网站 url1, url2, url3 ... 等用 Requests 库发送请求后作为生产者放到消息队列里面,当这特定的 urlN 有返回包时消费者就从消息队列里面读取网站内容。

    不知道技术上靠谱么?
    20 条回复    2017-11-22 13:32:10 +08:00
    dawncold
        1
    dawncold  
       2017-11-21 15:41:21 +08:00
    听起来你打算用一个很慢的队列技术来实现异步非阻塞框架的功能
    nilai
        2
    nilai  
       2017-11-21 15:43:32 +08:00
    这就是分布式的雏形。。。。
    wsbnd9
        3
    wsbnd9  
       2017-11-21 15:46:40 +08:00
    这没有什么问题,简单点用 redis 更好点有 Kafka 然后开多进程去前面队列读取数据进行处理
    dawncold
        4
    dawncold  
       2017-11-21 15:47:44 +08:00
    可以做得到,技术上没什么问题,比如 tornado 框架、asyncio 就可以做到
    p2pCoder
        5
    p2pCoder  
       2017-11-21 15:47:49 +08:00
    我想了解 如何 拿到特定的返回包
    picone
        6
    picone  
       2017-11-21 15:49:56 +08:00
    还真试过放到 redis 里面的 SET 集合里。
    我用 Go 做过一个搜索引擎,当时就是把爬回来的结果发给消费者,消费者处理后把结果放到 Redis 的 SET 里面,同时还能去重,但是有个问题,消费者处理到的 url 越来越多,然后 Redis 存放的体积越来越大。。。
    asuraa
        7
    asuraa  
       2017-11-21 15:51:08 +08:00
    baixiangcpp
        8
    baixiangcpp  
       2017-11-21 16:03:22 +08:00
    scrapy-redis python 安装这个就好了
    dawncold
        9
    dawncold  
       2017-11-21 16:05:47 +08:00
    @wsbnd9 他的意思是要把网络 io 变成非阻塞的模式
    dawncold
        10
    dawncold  
       2017-11-21 16:06:19 +08:00
    @p2pCoder socket 可 read 信号
    3IOhG7M0knRu5UlC
        11
    3IOhG7M0knRu5UlC  
       2017-11-21 16:11:11 +08:00 via Android
    可以啊,这不是很常用方案。要对数据做清洗处理才能入库。
    p2pCoder
        12
    p2pCoder  
       2017-11-21 16:14:31 +08:00
    @dawncold 请教一下,这个 socket 要监听 什么参数,能拿到特定的包返回
    还有就是 这个过程会有 包丢失吗?
    smilekung
        13
    smilekung  
       2017-11-21 16:26:18 +08:00
    没问题啊 我现在就这么做的 更奢侈的是 我回吧 request 返回结果 直接存到 oss 里 然后把 key 丢到队列里
    smilekung
        14
    smilekung  
       2017-11-21 16:27:10 +08:00
    不过 request 可以直接发异步请求啊 加一个回调 就可以在收到 response 时处理
    fyooo
        15
    fyooo  
    OP
       2017-11-21 16:31:30 +08:00
    @smilekung 可以分享一下你的消息队列技术细节么?
    dawncold
        16
    dawncold  
       2017-11-21 16:47:28 +08:00
    @p2pCoder linux 系统中把很多功能抽象成文件,比如 socket 也是。简单说就是,对方发送回响应到达本机网卡后,内核会找到等待处理的进程,通知它可以读取数据了。
    wsbnd9
        17
    wsbnd9  
       2017-11-21 17:08:43 +08:00
    cheesea
        18
    cheesea  
       2017-11-21 20:01:41 +08:00
    你去看一下 pyspider 的源码,它就是这么干的。
    调度器,下载器,结果处理器通过消息队列沟通,可以在一台机器上跑调度器,另外几台机器跑多个下载器和处理器,实现分布式。
    smilekung
        19
    smilekung  
       2017-11-22 09:44:59 +08:00 via Android
    @fyooo 基本跟楼上说的一样 要抓取的连接和抓取的内容都通过消息队列交互 如果是你的需求可以直接用一个异步的 request 工具
    lxwu
        20
    lxwu  
       2017-11-22 13:32:10 +08:00
    技术上没什么问题,但是脱离业务场景谈架构是无意义的。
    队列最根本的目的还是解耦,你这里说将队列放置在请求之后,而调度与请求还是一个高耦合的状态。
    另外,我引入一个业务场景,假设 url ( url1, url2, ...)有抓取优先级,那么你这个设计如何满足需求?
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2877 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 14:11 PVG 22:11 LAX 07:11 JFK 10:11
    Do have faith in what you're doing.
    ubao msn 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