作者:乌尔班
链接:https://www.zhihu.com/question/54773510/answer/146971644
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Request中meta参数的作用是传递信息给下一个函数,使用过程可以理解成:

把需要传递的信息赋值给这个叫meta的变量,
但meta只接受字典类型的赋值,因此
要把待传递的信息改成“字典”的形式,即:
meta={'key1':value1,'key2':value2} 如果想在下一个函数中取出value1,
只需得到上一个函数的meta['key1']即可,
因为meta是随着Request产生时传递的,
下一个函数得到的Response对象中就会有meta,
即response.meta,
取value1则是value1=response.meta['key1']

这些信息可以是任意类型的,比如值、字符串、列表、字典......方法是把要传递的信息赋值给字典的键,分析见如下语句(爬虫文件):

class example(scrapy.Spider):
name='example'
allowed_domains=['example.com']
start_urls=['http://www.example.com']
def parse(self,response):
#从start_urls中分析出的一个网址赋值给url
url=response.xpath('.......').extract()
#ExamleClass是在items.py中定义的,下面会写出。
"""记住item本身是一个字典"""
item=ExampleClass()
item['name']=response.xpath('.......').extract()
item['htmlurl']=response.xpath('.......').extract()
"""通过meta参数,把item这个字典,赋值给meta中的'key'键(记住meta本身也是一个字典)。
Scrapy.Request请求url后生成一个"Request对象",这个meta字典(含有键值'key','key'的值也是一个字典,即item)
会被“放”在"Request对象"里一起发送给parse2()函数 """
yield Request(url,meta={'key':item},callback='parse2')
def parse2(self,response):
item=response.meta['key']
"""这个response已含有上述meta字典,此句将这个字典赋值给item,
完成信息传递。这个item已经和parse中的item一样了"""
item['text']=response.xpath('.......').extract()
#item共三个键值,到这里全部添加完毕了
yield item
items.py中语句如下: class ExampleClass(scrapy.Item):
name = scrapy.Field()
htmlurl = scrapy.Field()
text=scrapy.Field()

meta当然是可以传递cookie的(第一种):

下面start_requests中键‘cookiejar’是一个特殊的键,scrapy在meta中见到此键后,会自动将cookie传递到要callback的函数中。既然是键(key),就需要有值(value)与之对应,例子中给了数字1,也可以是其他值,比如任意一个字符串。

def start_requests(self):
yield Request(url,meta={'cookiejar':1},callback=self.parse)

需要说明的是,meta给‘cookiejar’赋值除了可以表明要把cookie传递下去,还可以对cookie做标记。一个cookie表示一个会话(session),如果需要经多个会话对某网站进行爬取,可以对cookie做标记,1,2,3,4......这样scrapy就维持了多个会话。

def parse(self,response):
key=response.meta['cookiejar'] #经过此操作后,key=1
yield Request(url2,meta={'cookiejar':key},callback='parse2')
def parse2(self,response):
pass

上面这段和下面这段是等效的:

def parse(self,response):
yield Request(url2,meta={'cookiejar':response.meta['cookiejar']},callback='parse2')
#这样cookiejar的标记符还是数字1
def parse2(self,response):
pass

传递cookie的第二种写法:

如果不加标记,可以用下面的写法:

#先引入CookieJar()方法
from scrapy.http.cookies import CookieJar

写spider方法时:

def start_requests(self):
yield Request(url,callback=self.parse)#此处写self.parse或‘parse’都可以
def parse(self,response):
cj = response.meta.setdefault('cookie_jar', CookieJar())
cj.extract_cookies(response, response.request)
container = cj._cookies
yield Request(url2,cookies=container,meta={'key':container},callback='parse2')
def parse2(self,response):
pass

meta是浅复制,必要时需要深复制。

可以这样引入:

import copy
meta={'key':copy.deepcopy('value')}
 

scrapy的request的meta参数是什么意思?的更多相关文章

  1. scrapy中Request中常用参数

    url: 就是需要请求,并进行下一步处理的url callback: 指定该请求返回的Response,由那个函数来处理. method: 一般不需要指定,使用默认GET方法请求即可 headers: ...

  2. scrapy框架Request函数callback参数为什么是self.parse而不是self.parse( )

    加括号是调用函数,不加括号是指的是函数地址,此处只需要传入函数的地址,等待程序到时调用即可

  3. scrapy.Request使用meta传递数据,以及deepcopy的使用

    scrapy.Request(url[,callback,method="GET",headers,body,cookies,meta,dont_filter=False])   ...

  4. python的scrapy框架的使用 和xpath的使用 && scrapy中request和response的函数参数 && parse()函数运行机制

    这篇博客主要是讲一下scrapy框架的使用,对于糗事百科爬取数据并未去专门处理 最后爬取的数据保存为json格式 一.先说一下pyharm怎么去看一些函数在源码中的代码实现 按着ctrl然后点击函数就 ...

  5. Scrapy 中 Request 对象和 Response 对象的各参数及属性介绍

    Request 对象 Request构造器方法的参数列表: Request(url [, callback=None, method='GET', headers=None, body=None,co ...

  6. scrapy之Request对象

    我们在使用scrapy框架的时候,会经常疑惑,数据流是怎么样在各个组件中间传递的.最近经常用scrapy+selenium爬取淘宝,又因为今天周五心情好,本宝宝决定梳理一下这方面知识. scrapy中 ...

  7. Scrapy的Request和Response

    Scrapy的Request和Response   本文链接:https://blog.csdn.net/kissazhu/article/details/80865773 上节课我们学习了中间件,知 ...

  8. JSP userBean setProperty直接从request中获取参数

    JSP userBean setProperty直接从request中获取参数: form表单Jsp: <%@ page language="java" import=&qu ...

  9. Scrapy 发送Request Payload

    Scrapy 发送Request Payload 首先要打开 F12 进入调试模式 然后 查看是用什么方法获取的 如果是Json: 1. json.dumps 转化成Json yield Reques ...

随机推荐

  1. 数据结构与算法--最小生成树之Kruskal算法

    数据结构与算法--最小生成树之Kruskal算法 上一节介绍了Prim算法,接着来看Kruskal算法. 我们知道Prim算法是从某个顶点开始,从现有树周围的所有邻边中选出权值最小的那条加入到MST中 ...

  2. 自己写一个java的mvc框架吧(四)

    自己写一个mvc框架吧(四) 写一个请求的入口,以及初始化框架 上一章写了获取方法的入参,并根据入参的参数类型进行数据转换.这时候,我们已经具备了通过反射调用方法的一切必要条件.现在我们缺少一个htt ...

  3. spring-bean实例化三种方式

    在spring中,bean的示例化有三种方式. 1.使用类的无参构造函数创建 2.使用静态工厂方式创建 3.使用实例化工厂方式创建. 具体代码如下 静态工厂方式: Bean2.java package ...

  4. Linux命令行介绍

    一.Linux命令行结尾的提示符有“#”和“$”两种不同的符号,代码如下所示: [root@localhost ~]# ls anaconda-ks.cfg Desktop Documents min ...

  5. JavaScript高级编程——引用类型、Array数组使用、栈方法

    JavaScript高级编程——引用类型.Array数组使用.栈方法 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999 ...

  6. python 类之间的关系

    类与类之间的关系 在我们的世界中事物和事物之间总会有一些联系. 在面向对象中. 类和类之间也可以产生相关的关系 1. 依赖关系 执行某个动作的时候. 需要xxx来帮助你完成这个操作. 此时的关系是最轻 ...

  7. mysql-学习笔记1

    1.while循环的一个方便的用法是循环处理一个SQL查询结果中的数据行. 2.mysqli_fetch_array(),这个内置的PHP函数从一个数据库查询的结果中获取一个数据行,可以搭配while ...

  8. CentOS7安装maven3.6.1

    1.下载maven的tar.gz安装包 2.移到centos7中并解压 tar -xzvf maven.tar.gz 3.开始配置maven环境变量,通过命令 vim /etc/profile 4.配 ...

  9. Clumsy 弱网络环境模拟工具使用介绍

    Clumsy 弱网络环境模拟工具使用介绍 by:授客 QQ:1033553122 简介 利用封装 Winodws Filtering Platform 的WinDivert 库, clumsy 能实时 ...

  10. Android - Android Studio 解决访问被墙的问题

    socks代理配置 项目代理:根目录下的gradle.properties文件 org.gradle.jvmargs=-DsocksProxyHost= 2.全局代理:用户根目录下的.gradle\g ...