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) Статья должна знать идентификатор своей категории, чтобы сформировать отношение То же самое для записей изображений