【问题标题】:Disable Scrapyd item storing in .jl feed禁用 .jl 提要中存储的 Scrapyd 项目
【发布时间】:2016-04-24 15:12:23
【问题描述】:

问题

我想知道如何在 scrapyd 中禁用项目存储。

我尝试了什么

我将蜘蛛部署到 Scrapy 守护进程 Scrapyd。部署的蜘蛛将蜘蛛数据存储在数据库中。而且效果很好。

但是,Scrapyd 会记录每个已抓取的 Scrapy 项目。在检查 scrapyd web interface 时可以看到这一点。 此项数据存储在..../items/<project name>/<spider name>/<job name>.jl

我不知道如何禁用它。我在 Docker 容器中运行 scrapyd,它使用了太多的存储空间。

我试过suppress Scrapy Item printed in logs after pipeline,但这似乎对scrapyd日志没有任何作用。 scrapyd 似乎忽略了所有蜘蛛日志记录设置。

编辑 我在有关Item storing 的文档中找到了此条目。如果您省略 items_dir 设置,似乎不会发生项目记录。据说这是默认禁用的。我没有 scrapyd.conf 文件,因此应该禁用项目日志记录。不是。

【问题讨论】:

    标签: scrapy scrapyd


    【解决方案1】:

    写完我的答案后,我重新阅读了您的问题,我发现您想要的与日志记录无关,而是关于不写入(默认).jl 提要(也许将标题更新为:“禁用scrapyd项目存储”)。要覆盖 scrapyd 的默认值,只需将 FEED_URI 设置为一个空字符串,如下所示:

    $ curl http://localhost:6800/schedule.json -d project=tutorial -d spider=example -d setting=FEED_URI=
    

    对于其他正在研究日志记录的人...让我们看一个例子。我们照常行事:

    $ scrapy startproject tutorial
    $ cd tutorial
    $ scrapy genspider example example.com
    

    然后编辑tutorial/spiders/example.py 以包含以下内容:

    import scrapy
    
    class TutorialItem(scrapy.Item):
        name = scrapy.Field()
        surname = scrapy.Field()
    
    class ExampleSpider(scrapy.Spider):
        name = "example"
    
        start_urls = (
            'http://www.example.com/',
        )
    
        def parse(self, response):
            for i in xrange(100):
                t = TutorialItem()
                t['name'] = "foo"
                t['surname'] = "bar %d" % i
                yield t
    

    注意跑的区别:

    $ scrapy crawl example
    # or
    $ scrapy crawl example -L DEBUG
    # or
    $ scrapy crawl example -s LOG_LEVEL=DEBUG
    

    $ scrapy crawl example -s LOG_LEVEL=INFO
    # or
    $ scrapy crawl example -L INFO
    

    通过在您的蜘蛛上尝试此类组合,确认它不会打印超出调试的日志级别的项目信息。

    现在是时候了,在你部署到 scrapyd 后,做同样的事情:

    $ curl http://localhost:6800/schedule.json -d setting=LOG_LEVEL=INFO -d project=tutorial -d spider=example
    

    在您运行时确认日志不包含项目:

    请注意,如果您的项目仍以 INFO 级别打印,则可能意味着您的代码或某些管道正在打印它。您可以进一步提高日志级别和/或调查并找到打印它的代码并将其删除。

    【讨论】:

    • 我希望你的建议有效。然而事实并非如此。我试过LOG_LEVEL=WARN。它没有任何区别。除了设置文件中的日志级别之外,此设置如何设置另一个设置?
    • 顺便说一句,使用 docker 做得很好。我不确切知道您如何使用抓取的数据,但总的来说,如果您使用例如在抓取完成后批量上传您的Items,而不是在您在某些项目管道中抓取时执行此操作。这是.jl 文件背后的概念。您将连接到spider_closed 信号并使用批量工具上传此.jl 文件。但也有极少数情况下不建议/可能这样做,例如如果您想要最小延迟。
    • 在管道中,我直接保存到另一个 Docker 容器中运行的 MySQL 数据库。我覆盖了process_item方法def process_item(self, productitem, spider):
    • 很好的答案!您的回答说明了如何同时禁用项目存储和记录。您的解决方案有效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-04
    • 2020-08-19
    • 2015-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多