抓取多个请求并填写单个项目
发布于 2021-01-29 16:03:17
我需要向不同的网址发出2个请求,并将该信息放入同一项目。我尝试过这种方法,但是结果写在不同的行中。回调 返回item
。我尝试了很多方法,但似乎都没有用。
def parse_companies(self, response):
data = json.loads(response.body)
if data:
item = ThalamusItem()
for company in data:
comp_id = company["id"]
url = self.request_details_URL + str(comp_id) + ".json"
request = Request(url, callback=self.parse_company_details)
request.meta['item'] = item
yield request
url2 = self.request_contacts + str(comp_id)
yield Request(url2, callback=self.parse_company_contacts, meta={'item': item})
关注者
0
被浏览
40
1 个回答
-
由于scrapy是异步的,因此您需要手动链接请求。要在请求之间传输数据,可以使用Request的
meta
属性:def parse(self, response): item = dict() item['name'] = 'foobar' yield request('http://someurl.com', self.parse2, meta={'item': item}) def parse2(self, response): print(response.meta['item']) # {'name': 'foobar'}
在您的情况下,当您应该有一个连续的链时,您最终会产生一条分裂链。
您的代码应如下所示:def parse_companies(self, response): data = json.loads(response.body) if not data: return for company in data: item = ThalamusItem() comp_id = company["id"] url = self.request_details_URL + str(comp_id) + ".json" url2 = self.request_contacts + str(comp_id) request = Request(url, callback=self.parse_details, meta={'url2': url2, 'item': item}) yield request def parse_details(self, response): item = response.meta['item'] url2 = response.meta['url2'] item['details'] = '' # add details yield Request(url2, callback=self.parse_contacts, meta={'item': item}) def parse_contacts(self, response): item = response.meta['item'] item['contacts'] = '' # add details yield item