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)
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)
如果我想将 page1 与 page2 中的元素整合,直接通过二者的解析函数没办法做到。所以这个时候需要用到 meta 参数来传递数据信息。具体过程为:
在page1的页面解析函数中构造一个 Item 对象
然后将该 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
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
再在page2的解析函数中,使用该数据对即可。
def parse_page2(self, response):
item = response.meta['item']
item['other_url'] = response.url
return 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
完整代码
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。同时通过属性 meta 将 parse_page1 的 Item 传递给了 parse_page2 。通过这种操作可以将 page1 与 page2 中需要整合的元素整合到同一个 Item 中。