如何向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)

相关推荐

  • 第 56 天:Python 爬虫之 urllib 包基本使用

    urllib 是一个 python 内置包,不需要额外安装即可使用,包里面包含了以下几个用来处理 url 的模块: urllib.request,用来打开和读取 url,意思就是可以用它来模拟发送请求 ...

  • scrapy实践之翻页爬取

    在scrapy框架中,spider具有以下几个功能 1. 定义初始爬取的url 2. 定义爬取的行为,是否跟进链接 3. 从网页中提取结构化数据 所谓的跟进链接,其实就是自动爬取该页的所有链接,然后顺 ...

  • sanic异步框架之中文文档

    typora-copy-images-to: ipic [TOC] 快速开始 在安装Sanic之前,让我们一起来看看Python在支持异步的过程中,都经历了哪些比较重大的更新. 首先是Python3. ...

  • 爬虫框架Scrapy(1)Scrapy基础1

    一. Scrapy框架简介 Scrapy是一个使用Python语言(基于Twisted框架)编写的开源网络爬虫框架,目前由 Scrapinghub Ltd 维护.Scrapy 简单易用.灵活易拓展.开 ...

  • scrapy终端常用命令

    scrapy命令行 一.默认的scrapy项目结构 scrapy.cfgmyproject/    __init__.py    items.py    pipelines.py    setting ...

  • 干货!一文教会你 Scrapy 爬虫框架的基本使用

    原创 投稿君 Python数据之道 收录于话题 #读者投稿 28 #Python干货分享 2 #Python 11 #项目实战 20 出品:Python数据之道 (ID:PyDataLab) 作者:叶 ...

  • 单片机怎么用回调函数在不同文件之间传递数据

    大家好,我是无际. 今天继续来聊下回调函数. 之前写过一篇受到了广大老铁们的认可. 最近有几个新学员被回调函数搞得有点懵逼. 不理解为什么要搞这种绕来绕去.指针指来指去的函数. 先写篇文章预热一下,晚 ...

  • 一文搞懂C语言回调函数

    什么是回调函数 我们先来看看百度百科是如何定义回调函数的: 回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这 ...

  • C 语言回调函数详解 | 菜鸟教程

    C 语言回调函数详解 | 菜鸟教程

  • Modbus功能码的回调函数如何编写-FreeModbus从站设计(10)

    FreeModbus从站设计(10)-Modbus功能码的回调函数如何编写 关键词:FreeModbus CubeMX HAL库 串口 功能码 此系列的前面几篇文章,主要是阐述了用HAL库生成keil ...

  • C语言系列_9:函数指针,函数指针数组和回调函数

    (5)函数指针 A:什么是函数指针 数组指针是指向数组的,函数指针就是指向函数的,也就是函数也是有自己的地址的 这里要注意一点,数组的时候&数组名是数组的地址,数组名是数组首元素的地址. 而函 ...

  • VB 函数 CallByName 的一些用法 (函数动态调用,回调函数)

    VB  函数  CallByName (函数动态调用,回调函数) 的一些用法 最近编程,要用到函数指针来动态地调用函数,在C 语言里很容易实现,用函数指针就行了. VB里就没有这么方便了,查阅相关资料 ...

  • C# (事件触发)回调函数,完美处理各类疑难杂症!

    C# (事件触发)回调函数,完美处理各类疑难杂症!

  • 详解C#中委托,事件与回调函数讲解

    .Net编程中最经常用的元素,事件必然是其中之一.无论在ASP.NET还是WINFrom开发中,窗体加载(Load),绘制(Paint),初始化(Init)等等. "protected vo ...

  • 一种编写回调函数的简单方法

    繁琐的重复性工作 在之前的一篇文章中,我们讨论了这样一个主题:如果回调函数是一个类的成员函数,则这个回调函数必须被声明为静态的. 编写一个静态的回调函数,其实并不复杂,但是还是比较繁琐,下图中展示了一 ...