如何让 scrapy 返回数据?

2020-07-20 10:05:11 +08:00
 smallgoogle

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

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

2560 次点击
所在节点    Python
15 条回复
liuxu
2020-07-20 10:25:31 +08:00
直接 run spider,默认直接命令行输出
zone10
2020-07-20 10:29:38 +08:00
建议看看 scrapy item pipeline
perpetually
2020-07-20 10:36:13 +08:00
你是想不入库,直接从目标网站把数据抓取下来返回给 a 用户?
pipline 里面你不写入库的逻辑,直接启动 scrapy 返回的数据不就输出再页面上么?
你把这个数据的数据直接返给 a 不就行了
caijihui11
2020-07-20 10:36:58 +08:00
返回数据,print, 打 log 都可以
smallgoogle
2020-07-20 10:38:18 +08:00
@perpetually 我是想通过用户请求一个 API,后端启动爬虫,然后返回数据给用户。你说在 pipline 这里处理,这里是每次都是单条处理的,返回数据给用户只能一次,这里就没发持续返回了。除非用 socket
jugelizi
2020-07-20 10:40:52 +08:00
给 api 就启动一个 python 的 http 服务呗 请求来了就抓取并输出结束
weiye265
2020-07-20 10:41:44 +08:00
使用 api
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
2020-07-20 11:06:41 +08:00
@cy476571989 我有点好奇,callback 的发送时机是怎么触发的,scrapy 有 pipeline 地方知道这是最后一个需要处理的抓取数据吗?
tikazyq
2020-07-20 11:20:18 +08:00
为啥不用 Crawlab ?不止是 scrapy,连其他语言的爬虫例如 java 、go 、php 都可以管理

https://github.com/crawlab-team/crawlab
zdnyp
2020-07-20 11:42:51 +08:00
close_spider 里处理
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
2020-07-20 11:47:39 +08:00
scrapy 的定位是离线任务,你这种在线时时的,不如一个 http api 在后端里面一个 requests 请求更好
Vegetable
2020-07-20 11:48:33 +08:00
实现的方式太多了,但是你这个显然与 scrapy 的传统思路不同,也不符合 Web 服务器设计的基本原则,需要自己动手实现。最简单的可以通过 scrapy redis 调度爬虫,直接在 redis 轮询等待结果,这样操作起来是比较符合认知的。如果直接操作 scrapy 的话,还涉及到爬虫冷启动什么的,太麻烦了。
Fizzyi
2020-07-20 16:49:44 +08:00
何必一定要用 Scrapy 呢,自己手撸一个更适用

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

https://www.v2ex.com/t/691460

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

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

© 2021 V2EX