Конвейер Scrapy Spider_opened и Spider_closed не вызывается

У меня возникли проблемы с скрап-конвейером. Моя информация очищается от сайтов в порядке, и метод process_item вызывается правильно. Однако методы spider_opened и spider_closed не вызываются.

class MyPipeline(object):

    def __init__(self):
        log.msg("Initializing Pipeline")
        self.conn = None
        self.cur = None

    def spider_opened(self, spider):
        log.msg("Pipeline.spider_opened called", level=log.DEBUG)

    def spider_closed(self, spider):
        log.msg("Pipeline.spider_closed called", level=log.DEBUG)

    def process_item(self, item, spider):
        log.msg("Processsing item " + item['title'], level=log.DEBUG)

В журнале отображаются сообщения регистрации __init__ и process_item, а сообщения регистрации spider_open и spider_close - нет.

Мне нужно использовать методы spider_opened и spider_closed, поскольку я хочу использовать их для открытия и закрытия соединения с базой данных, но в журнале для них ничего не отображается.

Если кто-то что-то предложил, это было бы очень полезно.


person Jim Jeffries    schedule 06.11.2010    source источник


Ответы (2)


Извините, нашел сразу после публикации. Вы должны добавить:

dispatcher.connect(self.spider_opened, signals.spider_opened)
dispatcher.connect(self.spider_closed, signals.spider_closed)

в __init__ иначе он никогда не получит сигнал для его вызова

person Jim Jeffries    schedule 06.11.2010
comment
Спасибо за ответ, но где взять переменную dispatcher? И почему я не могу найти это в doc.scrapy.org/ ru/latest/topics/item-pipeline.html? :( - person wrongusername; 08.10.2012
comment
Чтобы это работало, вам нужно убедиться, что вы импортируете следующие вещи: from scrapy.xlib.pydispatch import dispatcher from scrapy import signals - person herrherr; 28.10.2013

Правильные имена методов — open_spider и close_spider, а не spider_opened и spider_closed. Это задокументировано здесь: http://doc.scrapy.org/en/latest/topics/item-pipeline.html#writing-your-own-item-pipeline.

person Mikhail Korobov    schedule 12.05.2014
comment
Это неправильно. spider_open и spider_closed — это сигналы, а не методы. Как описано здесь doc.scrapy.org /en/latest/topics/ и здесь doc.scrapy.org/en/latest/topics/ - person Jim Jeffries; 14.05.2014
comment
Существуют методы с именами open_spider и close_spider, однако они не имеют отношения к вопросу. - person Jim Jeffries; 14.05.2014
comment
Верно, но почему вы создаете методы Spider_opened и Spider_closed в своем примере конвейера и ожидаете, что они будут вызваны? И зачем вам прикреплять сигналы вручную, если есть методы, которые уже вызываются? - person Mikhail Korobov; 14.05.2014
comment
Я хочу что-то делать, когда такие вещи случаются, а не называть их - person Jim Jeffries; 14.05.2014
comment
Почему вы не можете сделать это в методах open_spider и close_spider, которые вызываются при открытии или закрытии паука? - person Mikhail Korobov; 15.05.2014
comment
Поскольку сигнал spider_closed предоставляет параметр reason, для пример. - person user; 07.10.2018
comment
@user вопрос был о том, почему методы в примере не работают. Они не работают, потому что они названы неправильно. Это правда, вы также можете использовать сигналы, хотя это отдельная функция. - person Mikhail Korobov; 08.10.2018