如何向scrapy请求回调函数传递附加参数
scrapy在发起一个请求之后,会通过该请求注册的回调函数来通知用户处理HTTP响应消息。默认情况下,回调函数只有一个response参数,response包含了和响应有关的所有信息。
比如:
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.logger.info("Visited %s", response.url)
parse_page2负责处理pase_page1产生的新请求返回的响应消息。
有时候我们可能需要向parse_page2传递一些附加参数,用于处理其他业务。
通过查看scrapy.Request的源码,我们发现其初始化函数支持众多其他参数:
class Request(object_ref):
def __init__(self, url, callback=None, method=’GET’, headers=None, body=None,
cookies=None, meta=None, encoding=’utf-8′, priority=0,
dont_filter=False, errback=None, flags=None, cb_kwargs=None):
这里边,cb_kwargs就可以用来传递附加参数。
def parse(self, response):
request = scrapy.Request('http://www.example.com/index.html',
callback=self.parse_page2,
cb_kwargs=dict(main_url=response.url))
request.cb_kwargs['foo'] = 'bar' # add more arguments for the callback
yield request
def parse_page2(self, response, main_url, foo):
yield dict(
main_url=main_url,
other_url=response.url,
foo=foo,
)
cb_kwargs是一个dict类型的参数,我们可以直接在构造Request时指定一个dict对象,然后可以直接向cb_kwargs中添加其他参数。
这些参数会被逐一追加到后续回调函数的参数列表中。
在上边示例中,parse函数构造Request时设置cb_kwargs为{‘mian_url’:response.url},并在后边继续添加了foo字段。
于是,回调函数parse_page2得到附加的main_url和foo两个参数。
需要注意的是:此方法仅适用于scrapy1.7及之后版本。旧版本可以使用Request.meta来传递附加参数。
赞 (0)