V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
推荐学习书目
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 · Nov 21, 2017 · 5566 views
    This topic created in 3078 days ago, the information mentioned may be changed or developed.
    简单来说是我在想能不能把我想要下载的网站 url1, url2, url3 ... 等用 Requests 库发送请求后作为生产者放到消息队列里面,当这特定的 urlN 有返回包时消费者就从消息队列里面读取网站内容。

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