【发布时间】:2020-09-22 22:51:53
【问题描述】:
我正在尝试学习 Scrapy 框架,并且我能够编写蜘蛛并在网络上爬行等等。我也能够保存所需的数据,但不是以我想要的方式。
示例代码:
import scrapy
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
class ExampleSpider(CrawlSpider):
name = 'examplecrawler'
allowed_domains = ['example.com']
start_urls = ['https://www.example/']
rules = [
Rule(LinkExtractor(unique=True), follow=True, callback="parse")
]
def parse(self, response):
url = response.url
yield {'link': url}
当前结果: Spider 递归运行,只有当我使用 Control + C
停止它时,它才会使用 Item Exporters 写入输出期望结果: Spider 递归运行并在运行时写入输出,而不必停止它来写入输出。
我已通读文档并查看在哪里可以使用诸如编写自定义管道来写入数据之类的东西,但我想知道当前项目导出器是否可以做到这一点。即:csv 和 json。
【问题讨论】:
-
您是否将输出写入外部存储系统(例如 S3、FTP、Google 存储)?否则,它应该按需要工作。见docs.scrapy.org/en/master/topics/…
-
我使用的是scrapy、csv和json提供的feed导出器。我没有输出到外部存储。我想在本地写,但不想延迟输出。即:如果我使用scrapy runspider examplespider.py -o output.json 运行spider,它只会在我使用Control + C 退出spider 或spider 没有更多要抓取的URL 后写入output.json。
-
CSV 输出应如您所愿; JSON 是不同的,因为它旨在保持输出文件有效的 JSON,这意味着它必须一次写入整个文件。考虑改用 JSON Lines,或将导出器子类化以按需要工作。
-
我尝试过 JSON Lines 和 CSV,但结果与 JSON 相同。唯一似乎有点工作的事情是在设置中设置 FEED_EXPORT_BATCH_ITEM_COUNT 但我不想要多个文件。我会试试 sqlite3 管道。