scrapy spider完成后重命名输出文件

时间:2015-05-06 09:08:56

标签: python scrapy scrapy-spider scrapyd

我正在使用Scrapy和Scrapyd来监控某些网站。输出文件是压缩的jsonlines。在我向scrapyd提交作业计划后,我可以看到正在创建的输出文件,并且正在逐渐增加。

我的问题是我无法确定输出文件何时就绪,即蜘蛛已完成。一种方法是将输出文件重命名为" output.done"所以我的其他程序可以列出这些文件并进行处理。

我目前的方法是检查文件的修改时间,如果它没有改变五分钟,那么我认为它已经完成。然而,有时五分钟看起来不够,我真的希望我不需要将它延长到30分钟。

2 个答案:

答案 0 :(得分:1)

您可能希望使用scrapy信号,特别是spider_openedspider_closed来了解蜘蛛何时使用该文件。更多信息可以在这里找到:http://doc.scrapy.org/en/latest/topics/signals.html

spider_opened可以将文件重命名为 output.progress spider_closed可以将其重命名为 output.done 以指示文件不再存在蜘蛛使用。

如果输出文件是由Item管道写入的,则可以使用open_spiderclose_spider回调,这与使用信号的逻辑相同。有关项目管道回调的更多信息:http://doc.scrapy.org/en/latest/topics/item-pipeline.html#writing-your-own-item-pipeline

答案 1 :(得分:0)

我尝试了不同的方法后得到了一个有效的解决方案。 因为在我的特定情况下,我将输出转储到文件中,特别是bz2文件。我在打开之前和关闭文件之后定制了FileFeedStorage来完成工作。请参阅以下代码:

from scrapy.contrib.feedexport import FileFeedStorage
import os
import bz2

MB = 1024 * 1024


class Bz2FileFeedStorage(FileFeedStorage):
  IN_PROGRESS_MARKER = ".inprogress"

  def __init__(self, uri):
    super(Bz2FileFeedStorage, self).__init__(uri)
    self.in_progress_file = self.path + Bz2FileFeedStorage.IN_PROGRESS_MARKER

  def open(self, spider):
    dirname = os.path.dirname(self.path)
    if dirname and not os.path.exists(dirname):
      os.makedirs(dirname)
    return bz2.BZ2File(self.in_progress_file, "w", 10 * MB)

  def store(self, file):
    super(Bz2FileFeedStorage, self).store(file)
    os.rename(self.in_progress_file, self.path)