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
smallgoogle
V2EX  ›  Python

如何让 scrapy 返回数据?

  •  
  •   smallgoogle · 2020-07-20 10:05:11 +08:00 · 2597 次点击
    这是一个创建于 1622 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如何让 scrapy 抓取完成之后的结果返回到 shell 窗口;

    我想实现的是,a 用户发起一个抓取请求,后端接收到请求,调起 scrapy 进行抓取,然后返回数据到 a 用户那。。
    我想问一下,这个结构,如何实现?
    我所知道的,大概就仅仅是用命令运行爬虫,然后存入库。。然而我并不想让他存库。我想让他把结果返回出去。。
    那如果我使用 python 的 subprocess 执行命令,获取 shell 的返回值,然后返给 a 用户,你们觉得这样是可行的吗?

    15 条回复    2020-07-20 16:49:44 +08:00
    liuxu
        1
    liuxu  
       2020-07-20 10:25:31 +08:00
    直接 run spider,默认直接命令行输出
    zone10
        2
    zone10  
       2020-07-20 10:29:38 +08:00
    建议看看 scrapy item pipeline
    perpetually
        3
    perpetually  
       2020-07-20 10:36:13 +08:00
    你是想不入库,直接从目标网站把数据抓取下来返回给 a 用户?
    pipline 里面你不写入库的逻辑,直接启动 scrapy 返回的数据不就输出再页面上么?
    你把这个数据的数据直接返给 a 不就行了
    caijihui11
        4
    caijihui11  
       2020-07-20 10:36:58 +08:00
    返回数据,print, 打 log 都可以
    smallgoogle
        5
    smallgoogle  
    OP
       2020-07-20 10:38:18 +08:00
    @perpetually 我是想通过用户请求一个 API,后端启动爬虫,然后返回数据给用户。你说在 pipline 这里处理,这里是每次都是单条处理的,返回数据给用户只能一次,这里就没发持续返回了。除非用 socket
    jugelizi
        6
    jugelizi  
       2020-07-20 10:40:52 +08:00 via iPhone
    给 api 就启动一个 python 的 http 服务呗 请求来了就抓取并输出结束
    weiye265
        7
    weiye265  
       2020-07-20 10:41:44 +08:00
    使用 api
    cy476571989
        8
    cy476571989  
       2020-07-20 10:46:49 +08:00
    @smallgoogle Breword 翻译工具里面有用到 scrapy 去抓取 github 文档内容,我想我的这个场景能够满足你的需求。

    scrapy 需要用 scrapyd 来进行部署,运行在后台,用户发送请求到 scrapyd 接口, scrapyd 会调用一个 spider 去抓取内容,这里 scrapyd 接口会迅速返回,所以,用户请求 和 scrapy 运行之间是异步的关系,你没法一次性拿到 scrapy 返回的数据,只能是先将 scrapy 抓取的内容存储下来,比如,存在数据库里面,然后调用一个 callback, 通知用户,内容已经抓取完毕,然后用户再通过一个接口去获取存储的内容。

    本质上整个过程是异步的,而且网络请求耗时不确定,所以无法一次性返回抓取的数据。

    可以去 www.breword.com 试试创建一个项目,就能体验整个过程了。

    希望这个回答对你有帮助。
    warcraft1236
        9
    warcraft1236  
       2020-07-20 11:06:41 +08:00
    @cy476571989 我有点好奇,callback 的发送时机是怎么触发的,scrapy 有 pipeline 地方知道这是最后一个需要处理的抓取数据吗?
    tikazyq
        10
    tikazyq  
       2020-07-20 11:20:18 +08:00
    为啥不用 Crawlab ?不止是 scrapy,连其他语言的爬虫例如 java 、go 、php 都可以管理

    https://github.com/crawlab-team/crawlab
    zdnyp
        11
    zdnyp  
       2020-07-20 11:42:51 +08:00
    close_spider 里处理
    cy476571989
        12
    cy476571989  
       2020-07-20 11:44:02 +08:00
    @warcraft1236 spider 的 pipeline 有一个 hook,叫 close_spider, 可以用来标志抓取是否完成,https://docs.scrapy.org/en/latest/topics/item-pipeline.html
    brucedone
        13
    brucedone  
       2020-07-20 11:47:39 +08:00
    scrapy 的定位是离线任务,你这种在线时时的,不如一个 http api 在后端里面一个 requests 请求更好
    Vegetable
        14
    Vegetable  
       2020-07-20 11:48:33 +08:00
    实现的方式太多了,但是你这个显然与 scrapy 的传统思路不同,也不符合 Web 服务器设计的基本原则,需要自己动手实现。最简单的可以通过 scrapy redis 调度爬虫,直接在 redis 轮询等待结果,这样操作起来是比较符合认知的。如果直接操作 scrapy 的话,还涉及到爬虫冷启动什么的,太麻烦了。
    Fizzyi
        15
    Fizzyi  
       2020-07-20 16:49:44 +08:00
    何必一定要用 Scrapy 呢,自己手撸一个更适用
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2840 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 14:05 · PVG 22:05 · LAX 06:05 · JFK 09:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.