Scrapy: как заполнить иерархические элементы многозадачными запросами

Это расширение множественного вложенного запроса с помощью scrapy. Запрашиваемая потому что представленное решение имеет недостатки:
1. Это устраняет асинхронность, значительно снижая эффективность очистки
2. Если при обработке ссылок "стек" возникнет исключение, и ни один элемент не будет получен
3. Что делать, если есть огромное количество детских предметов?

Чтобы разобраться с (1) я рассмотрел это:

class CatLoader(ItemLoader):

    def __int__(self, item=None, selector=None, response=None, parent=None, **context):
        super(self.__class__, self).__init__(item, selector, response, parent, **context)
        self.lock = threading.Lock()
        self.counter = 0

    def dec_counter(self):
        self.lock.acquire()
        self.counter += 1
        self.lock.release()

Тогда в парсере:

    if len(urls) == 0:
        self.logger.warning('Cat without items, url: ' + response.url)
        item = cl.load_item()
        yield item
    cl.counter = len(urls)
    for url in urls:
        rq = Request(url, self.parse_item)
        rq.meta['loader'] = cl
        yield rq

И в parse_item() Я могу сделать:

def parse_item(self, response):
    l = response.meta['loader']

    l.dec_counter()
    if l.counter == 0:
        yield l.load_item()

НО! Чтобы справиться с 2, мне нужно в каждой функции сделать:

def parse_item(self, response):
    try:
        l = response.meta['loader']

    finally:
        l.dec_counter()
        if l.counter == 0:
            yield l.load_item()

Которое я считаю не элегантным решением. Так может кто-нибудь помочь с лучшим решением? Кроме того, я собираюсь вставлять элементы в БД, а не в вывод json, так что, может быть, лучше создать элемент с обещанием и сделать pipline, который анализирует дочерние элементы, чтобы проверить, выполнено ли обещание (когда элемент вставлен в БД), или что-то вроде тот?

UPD: Иероглифические предметы: категория -> статья -> изображения. Все должно быть сохранено в разных таблицах с правильными отношениями. Итак: 1) Статьи должны быть отнесены к таблице ПОСЛЕ категории. 2) Статья должна знать идентификатор своей категории, чтобы сформировать отношение То же самое для записей изображений

0 ответов

Другие вопросы по тегам