我正在使用Scrapy和Scrapyd来监控某些网站。输出文件是压缩的jsonlines。在我向scrapyd提交作业计划后,我可以看到正在创建的输出文件,并且正在逐渐增加。
我的问题是我无法确定输出文件何时就绪,即蜘蛛已完成。一种方法是将输出文件重命名为" output.done"所以我的其他程序可以列出这些文件并进行处理。
我目前的方法是检查文件的修改时间,如果它没有改变五分钟,那么我认为它已经完成。然而,有时五分钟看起来不够,我真的希望我不需要将它延长到30分钟。
答案 0 :(得分:1)
您可能希望使用scrapy信号,特别是spider_opened
和spider_closed
来了解蜘蛛何时使用该文件。更多信息可以在这里找到:http://doc.scrapy.org/en/latest/topics/signals.html
spider_opened
可以将文件重命名为 output.progress ,spider_closed
可以将其重命名为 output.done 以指示文件不再存在蜘蛛使用。
如果输出文件是由Item管道写入的,则可以使用open_spider
和close_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)