我需要向不同的网址发出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})
Run Code Online (Sandbox Code Playgroud)
由于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'}
Run Code Online (Sandbox Code Playgroud)
在您的情况下,当您应该有一个连续的链时,最终会产生一条裂链。
您的代码应如下所示:
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
Run Code Online (Sandbox Code Playgroud)