抓取多个请求并填写单个项目

发布于 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 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    由于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
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看