我试图从一个遵循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
我遇到的问题是,在解析了它下面的所有数据之后,不是将第一个项目发送到管道,而是在每个级别被调用时将每个级别发送到管道,以便每个项目都被发送只有当前水平的信息。
也许我只是在做这个可怕的错误并且有一种更简单的方式
答案 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