2015-05-06 4 views
2

Я использую Scrapy и Scrapyd для мониторинга определенных сайтов. Выходные файлы сжаты jsonlines. Сразу после того, как я отправляю расписание заданий на scrapyd, я вижу, что выходной файл создается и растет, когда он царапается.Переименуйте выходной файл после завершения патчи паутин

Моя проблема: я не могу быть уверен, когда выходной файл готов, т. Е. Паук завершен. Один из способов сделать это - переименовать выходной файл в нечто вроде «output.done», чтобы мои другие программы могли перечислить эти файлы и обработать их.

Мой текущий метод - проверить время изменения файла, и если он не изменится в течение пяти минут, я предполагаю, что это сделано. Тем не менее, пять минут иногда кажется недостаточным, и я действительно надеюсь, что мне не нужно продлевать его до 30 минут.

ответ

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) 
1

Возможно, вы захотите использовать сигналы для лечения, особенно 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.

+0

Спасибо. Использование сигнала - хорошая идея, но любая мысль о том, как она работает с существующим конвейером? В частности, я не уверен, могу ли я просто переименовать файл в начале и в конце паука. Разве это не сломает обработчик выходного файла экспортера? – Andy

+0

Если вы используете конвейер для записи выходного файла, вы можете использовать обратные вызовы spider_open/spider_close: http://doc.scrapy.org/en/latest/topics/item-pipeline.html#writing-your-own -item-газопровод – sardok