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 · 4597 次点击
    这是一个创建于 2320 天前的主题,其中的信息可能已经有所发展或是发生改变。
    简单来说是我在想能不能把我想要下载的网站 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 信号
    GooMS
        11
    GooMS  
       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   ·   我们的愿景   ·   实用小工具   ·   2863 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 11:29 · PVG 19:29 · LAX 04:29 · JFK 07:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.