【问题标题】:Scrapy CrawlSpider Output while CrawlingScrapy CrawlSpider 爬行时的输出
【发布时间】: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 管道。

标签: python scrapy


【解决方案1】:

要修改当前爬虫的工作方式,以便打印出实时状态,您必须发送至modify the existing code of the base class or create a crawler yourself。由于您要导入现有模块,因此您确实无法更改其工作方式,因此您最好(如果不是唯一)的赌注是创建您自己的具有自定义输出的爬虫。

【讨论】:

    猜你喜欢
    • 2014-12-31
    • 1970-01-01
    • 1970-01-01
    • 2020-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多