如何让 scrapy 抓取完成之后的结果返回到 shell 窗口;
我想实现的是,a 用户发起一个抓取请求,后端接收到请求,调起 scrapy 进行抓取,然后返回数据到 a 用户那。。
我想问一下,这个结构,如何实现?
我所知道的,大概就仅仅是用命令运行爬虫,然后存入库。。然而我并不想让他存库。我想让他把结果返回出去。。
那如果我使用 python 的 subprocess 执行命令,获取 shell 的返回值,然后返给 a 用户,你们觉得这样是可行的吗?
1
liuxu 2020-07-20 10:25:31 +08:00
直接 run spider,默认直接命令行输出
|
2
zone10 2020-07-20 10:29:38 +08:00
建议看看 scrapy item pipeline
|
3
perpetually 2020-07-20 10:36:13 +08:00
你是想不入库,直接从目标网站把数据抓取下来返回给 a 用户?
pipline 里面你不写入库的逻辑,直接启动 scrapy 返回的数据不就输出再页面上么? 你把这个数据的数据直接返给 a 不就行了 |
4
caijihui11 2020-07-20 10:36:58 +08:00
返回数据,print, 打 log 都可以
|
5
smallgoogle OP @perpetually 我是想通过用户请求一个 API,后端启动爬虫,然后返回数据给用户。你说在 pipline 这里处理,这里是每次都是单条处理的,返回数据给用户只能一次,这里就没发持续返回了。除非用 socket
|
6
jugelizi 2020-07-20 10:40:52 +08:00 via iPhone
给 api 就启动一个 python 的 http 服务呗 请求来了就抓取并输出结束
|
7
weiye265 2020-07-20 10:41:44 +08:00
使用 api
|
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 试试创建一个项目,就能体验整个过程了。 希望这个回答对你有帮助。 |
9
warcraft1236 2020-07-20 11:06:41 +08:00
@cy476571989 我有点好奇,callback 的发送时机是怎么触发的,scrapy 有 pipeline 地方知道这是最后一个需要处理的抓取数据吗?
|
10
tikazyq 2020-07-20 11:20:18 +08:00
|
11
zdnyp 2020-07-20 11:42:51 +08:00
close_spider 里处理
|
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
|
13
brucedone 2020-07-20 11:47:39 +08:00
scrapy 的定位是离线任务,你这种在线时时的,不如一个 http api 在后端里面一个 requests 请求更好
|
14
Vegetable 2020-07-20 11:48:33 +08:00
实现的方式太多了,但是你这个显然与 scrapy 的传统思路不同,也不符合 Web 服务器设计的基本原则,需要自己动手实现。最简单的可以通过 scrapy redis 调度爬虫,直接在 redis 轮询等待结果,这样操作起来是比较符合认知的。如果直接操作 scrapy 的话,还涉及到爬虫冷启动什么的,太麻烦了。
|
15
Fizzyi 2020-07-20 16:49:44 +08:00
何必一定要用 Scrapy 呢,自己手撸一个更适用
|