Scrapy中如何控制yield的顺序
How to control the order of yield in Scrapy
求助!阅读下面的scrapy代码和爬虫的结果。我想从http://china.fathom.info/data/data.json爬取一些数据,只允许Scrapy。但是我不知道如何控制产量的顺序。我期待在循环中处理所有 parse_member 请求,然后 return group_item,但是似乎 yield 项目总是在 yield 请求之前执行。
start_urls = [
"http://china.fathom.info/data/data.json"
]
def parse(self, response):
groups = json.loads(response.body)['group_members']
for i in groups:
group_item = GroupItem()
group_item['name'] = groups[i]['name']
group_item['chinese'] = groups[i]['chinese']
group_item['members'] = []
members = groups[i]['members']
for member in members:
yield Request(self.person_url % member['id'], meta={'group_item': group_item, 'member': member},
callback=self.parse_member, priority=100)
yield group_item
def parse_member(self, response):
group_item = response.meta['group_item']
member = response.meta['member']
person = json.loads(response.body)
ego = person['ego']
group_item['members'].append({
'id': ego['id'],
'name': ego['name'],
'chinese': ego['chinese'],
'role': member['role']
})
您需要在最终回调中放弃该项目,parse
不会在 parse_member
完成之前停止,因此 parse
中的 group_item
不会在 parse_member
工作时更改。
不要产生 parse
的 group_item
,只产生 parse_member
上的那个,因为你已经复制了 meta
上的上一个项目并且你已经恢复了它在 parse_member
上 response.meta['group_item']
求助!阅读下面的scrapy代码和爬虫的结果。我想从http://china.fathom.info/data/data.json爬取一些数据,只允许Scrapy。但是我不知道如何控制产量的顺序。我期待在循环中处理所有 parse_member 请求,然后 return group_item,但是似乎 yield 项目总是在 yield 请求之前执行。
start_urls = [
"http://china.fathom.info/data/data.json"
]
def parse(self, response):
groups = json.loads(response.body)['group_members']
for i in groups:
group_item = GroupItem()
group_item['name'] = groups[i]['name']
group_item['chinese'] = groups[i]['chinese']
group_item['members'] = []
members = groups[i]['members']
for member in members:
yield Request(self.person_url % member['id'], meta={'group_item': group_item, 'member': member},
callback=self.parse_member, priority=100)
yield group_item
def parse_member(self, response):
group_item = response.meta['group_item']
member = response.meta['member']
person = json.loads(response.body)
ego = person['ego']
group_item['members'].append({
'id': ego['id'],
'name': ego['name'],
'chinese': ego['chinese'],
'role': member['role']
})
您需要在最终回调中放弃该项目,parse
不会在 parse_member
完成之前停止,因此 parse
中的 group_item
不会在 parse_member
工作时更改。
不要产生 parse
的 group_item
,只产生 parse_member
上的那个,因为你已经复制了 meta
上的上一个项目并且你已经恢复了它在 parse_member
上 response.meta['group_item']