scrapy爬虫,将不同页面元素整理到同一个Item中

scrapy爬虫,将不同页面元素整理到同一个Item中

今天写scrapy过程时,碰到一个问题:需要将两个页面中的元素给整合到同一个 Item 中。
解决方法参见 官方文档
下面只是对官方文档做一下解释:
Example:

def parse_page1(self, response):
    return scrapy.Request("http://www.example.com/some_page.html",
                          callback=self.parse_page2)

def parse_page2(self, response):
    # this would log http://www.example.com/some_page.html
    self.log("Visited %s" % response.url)

如果我想将 page1page2 中的元素整合,直接通过二者的解析函数没办法做到。所以这个时候需要用到 meta 参数来传递数据信息。具体过程为:

  1. 在page1的页面解析函数中构造一个 Item 对象

  2. 然后将该 Item 对象作为元数据传递到 meta 中,meta是一个字典,除了一些内置关键字以外,用户可以自定义关键字。这里可以使用 meta[‘item’] = Item 构造这个键值对

    def parse_page1(self, response):
    item = MyItem()
    item['main_url'] = response.url
    request = scrapy.Request("http://www.example.com/some_page.html",
                             callback=self.parse_page2)
    request.meta['item'] = item
    return request
    
  3. 再在page2的解析函数中,使用该数据对即可。

    	def parse_page2(self, response):
    	    item = response.meta['item']
    	    item['other_url'] = response.url
    	    return item
    
  4. 完整代码

    def parse_page1(self, response):
        item = MyItem()
        item['main_url'] = response.url
        request = scrapy.Request("http://www.example.com/some_page.html",
                                 callback=self.parse_page2)
        request.meta['item'] = item  # 通过meta属性将parse_page1的Item传递到parse_page2中
        return request
    def parse_page2(self, response):
        item = response.meta['item']
        item['other_url'] = response.url
        return item
    

总结:
上述 page1 中对新的 URL 进行对Request时,回调函数 callback 所指明的方法是 parse_page2。同时通过属性 metaparse_page1Item 传递给了 parse_page2 。通过这种操作可以将 page1page2 中需要整合的元素整合到同一个 Item 中。

你可能感兴趣的:(爬虫技术)