Scrapy объединяет предметы из нескольких процессов - PullRequest
0 голосов
/ 11 января 2019

У меня есть сценарий, который

  1. Находит все узлы ' страницы ' в XML-файле
  2. Разбирает все эти страницы, собирает данные, находит дополнительные страницы
  3. Дополнительные страницы анализируются и информация собирается

Скриптовый скрипт:

class test_spider(XMLFeedSpider):
 name='test'
 start_urls=['https://www.example.com'] 
 custom_settings={
  'ITEM_PIPELINES':{
   'test.test_pipe': 100,
  },
 }
 itertag='pages'  
 def parse1(self,response,node):
  yield Request('https://www.example.com/'+node.xpath('@id').extract_first()+'/xml-out',callback=self.parse2)
 def parse2(self,response):
  yield{'COLLECT1':response.xpath('/@id').extract_first()} 
  for text in string.split(response.xpath(root+'/node[@id="page"]/text()').extract_first() or '','^'):
   if text is not '':
    yield Request(
     'https://www.example.com/'+text,
     callback=self.parse3,
     dont_filter=True
    )
 def parse3(self,response):
  yield{'COLLECT2':response.xpath('/@id').extract_first()} 
class listings_pipe(object):
 def process_item(self,item,spider):
  pprint(item)

Идеальный результат - комбинированный элемент, такой как

{'COLLECT1': 'некоторые данные', 'COLLECT2': ['некоторые данные', 'некоторые данные', ...]}

Есть ли способ вызывать конвейер после каждого события parse1? и получить комбинированный набор предметов?

1 Ответ

0 голосов
/ 11 января 2019

В вашем методе Parse2 используйте meta и передайте вам collection1 на parse3, используя meta. Затем в Parse3 получите свой collection1, extract свой collection2 и получите комбинированный результат по своему желанию.

Для получения дополнительной информации о мета вы можете прочитать здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...