Scrapy-基础-Spider内不同级别parse传递参数

本文最后更新于:2021年2月5日 下午

问题描述

并不是每一个网站都将你想要的所有信息放在最内层页面的
可能需要在不同层级的请求中获取不同的参数,共同组成最后的item
如果不懂得在不同层级的parse中传递参数,那么最后的item会缺失一些信息。

处理

SpiderRequest请求经过处理后,最终会返回一个Response,被回调函数callback处理

如果想要传递数据,有两种处理方式:

  • Request中添加meta参数(官方不推荐)
  • 使用Requestcb_kwargs属性

使用meta参数

我们可以在Request中添加meta参数,记录需要传递的信息
meta参数所附带的信息最终会被Response返回
meta参数可传递 简单类型参数 或 对象类型参数

案例:使用Requestmeta参数传递数据

1
2
3
4
5
6
7
8
9
10
11
12
13
def parse(self, response):
item = MyItem()
item['id'] = response.xpath('//h1/text()').extract()[0]

for item_url in item_urls:
# meta 参数传递
yield Request(url=item_url, callback=self.parse_deeper, meta={'item': item})

def parse_deeper(self, response):
# 获取meta记录
item = response.meta['item']
item['name'] = response.xpath('//p/text()').extract()[0]
yield item

使用Requestcb_kwargs属性

将需要传递的内容用Requestcb_kwargs属性保存
待到下级解析的时候,从参数中获取即可

案例:使用Requestcb_kwargs属性传递数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def parse(self, response):
request = scrapy.Request('http://www.example.com/index.html',
callback=self.parse_page2,
cb_kwargs=dict(main_url=response.url))
# cb_kwargs增加参数传递
request.cb_kwargs['foo'] = 'bar'
yield request

def parse_page2(self, response, main_url, foo): # 从函数参数中拿到结果
yield dict(
main_url=main_url,
other_url=response.url,
foo=foo,
)

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!