
如何让 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 ByteMind 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 呢,自己手撸一个更适用 |