Scrapy:多级请求

时间:2015-02-18 07:09:26

标签: python parsing web-scraping scrapy

我试图从一个遵循4级分层结构的网站获取数据:

       root
   1         1
  2 2       2 2
 3 3 3     3 3 3
4 4 4 4   4 4 4 4

我从根级别开始,每个级别包含链接,因此具有以下级别。在抓取所有页面之后,我想生成包含在其下所有级别上解析的信息的第一级项目。

我试过这样的事情:

def parse(self,response):
   for link in links
       yield Request(link, callback = self.parse_1)

def parse_1(self,response):
   item1 = Item1()
   #get level 1 info
   ...
   for link in level2_links
       yield Request(link, callback = self.parse_2, meta = {'item': item1})
   yield item1

def parse_2(self,response):
   item1 = response.meta['item']
   item2 = Item2()
   #get level 2 info
   ...
   item1['items2'].append(item2)
   for link in level3_links
       yield Request(link, callback = self.parse_3, meta = {'item': item2})
   yield item 2

def parse_3(self,response):
   item2 = response.meta['item']
   item3 = Item3()
   #get level 3 info
   ...
   item1['items3'].append(item3)
   for link in level4_links
       yield Request(link, callback = self.parse_4, meta = {'item': item3})
   yield item3

def parse_4(self,response):
   item3 = response.meta['item']
   item4 = Item4()
   #get level 4 info
   item3['items4'].append(item4)
   yield item4

我遇到的问题是,在解析了它下面的所有数据之后,不是将第一个项目发送到管道,而是在每个级别被调用时将每个级别发送到管道,以便每个项目都被发送只有当前水平的信息。

也许我只是在做这个可怕的错误并且有一种更简单的方式

1 个答案:

答案 0 :(得分:0)

你在正确的轨道上,只是在meta中积累项目并在parse_4的末尾产生它们,意思是这样的:

def parse(self,response):
   for link in links
       yield Request(link, callback = self.parse_1)

def parse_1(self,response):
   item1 = Item1()
   items = [item1]
   for link in level2_links
       yield Request(link, callback = self.parse_2, meta = {'items': items})

def parse_2(self,response):
   items = response.meta['items']
   item2 = Item2()
   #get level 2 info
   ...
   items.append(item2)
   for link in level3_links
       yield Request(link, callback = self.parse_3, meta = {'items': items})

def parse_3(self,response):
   items = response.meta['items']
   item3 = Item3()
   #get level 3 info
   ...
   items.append(item3)
   for link in level4_links
       yield Request(link, callback = self.parse_4, meta = {'items': items})

def parse_4(self,response):
   items = response.meta['items']
   item4 = Item4()
   #get level 4 info
   ...
   items.append(item4)
   for item in items:
       yield item