[转]scrapy中的request.meta
链接:https://www.zhihu.com/question/54773510/answer/146971644
meta属性是字典,字典格式即{‘key’:'value'},字典是一种可变容器模型,可存储任意类型对象。
request中meta参数的作用是传递信息给下一个函数,这些信息可以是任意类型的,比如值、字符串、列表、字典......方法是把要传递的信息赋值给meta字典的键,分析见如下语句(爬虫文件):
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键。Request在请求url后生成一个request对象,这个
           #(含有键值'key','key'的值是字典item)meta字典
           #里面的信息会被“放”在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的更多相关文章
- scrapy中的request
		scrapy中的request 初始化参数 class scrapy.http.Request( url [ , callback, method='GET', headers, body, cook ... 
- Scrapy中的Request和Response
		Request Request 部分源码: # 部分代码 class Request(object_ref): def __init__(self, url, callback=None, metho ... 
- scrapy中的Request和Response对象
		前言: 如果框架中的组件比做成是人的各个器官的话,那个Request和Response就是血液,Item就是代谢产物 Request对象: 是用来描述一个HTTP请求,其构造参数有 url 请求的UR ... 
- Scrapy中的Request和日志分析
		Scrapy.http.Request 自动去重,根据url的哈希值,进行去重 属性 meta(dict) 在不同的请求之间传递数据,dict priority(int) 此请求的优先级(默认为0 ... 
- Scrapy 中的 Request 对象和 Respionse 对象
		1.Request 对象 Request 对象用来描述一个 HTTP 请求,下面是其构造方法的参数列表 Request(url, [, callback, method='Get', headers, ... 
- Scrapy爬虫入门Request和Response(请求和响应)
		开发环境:Python 3.6.0 版本 (当前最新)Scrapy 1.3.2 版本 (当前最新) 请求和响应 Scrapy的Request和Response对象用于爬网网站. 通常,Request对 ... 
- Scrapy中的反反爬、logging设置、Request参数及POST请求
		常用的反反爬策略 通常防止爬虫被反主要有以下几策略: 动态设置User-Agent(随机切换User-Agent,模拟不同用户的浏览器信息.) 禁用cookies(也就是不启用cookies midd ... 
- python的scrapy框架的使用 和xpath的使用  && scrapy中request和response的函数参数 && parse()函数运行机制
		这篇博客主要是讲一下scrapy框架的使用,对于糗事百科爬取数据并未去专门处理 最后爬取的数据保存为json格式 一.先说一下pyharm怎么去看一些函数在源码中的代码实现 按着ctrl然后点击函数就 ... 
- Scrapy 中 Request 对象和 Response 对象的各参数及属性介绍
		Request 对象 Request构造器方法的参数列表: Request(url [, callback=None, method='GET', headers=None, body=None,co ... 
随机推荐
- C语言第十次博客作业--结构体
			一.PTA实验作业 题目1: 结构体数组按总分排序 1. 本题PTA提交列表 2. 设计思路 求出每名学生的总分 定义i,j循环变量 for i=0 to n for j=0 to 3 p[i].su ... 
- Python爬取百度贴吧
			from urllib import request,parseimport os#找到借口及关键字base_url = 'http://tieba.baidu.com/f?'a = input(&q ... 
- 【Python】随机模块random  &  日期时间のtime&&datetime
			■ random 顾名思义,random提供了python中关于模拟随机的一些方法.这些方法都一看就懂的,不多说了: random.random() 返回0<n<=1的随机实数 rando ... 
- [bzoj1355][Baltic2009]Radio Transmission_KMP
			Radio Transmissio bzoj-1355 Description 给你一个字符串,它是由某个字符串不断自我连接形成的. 但是这个字符串是不确定的,现在只想知道它的最短长度是多少. Inp ... 
- web语义化之SEO和ARIA
			在快速理解web语义化的时候,只知道web语义化有利于SEO和便于屏幕阅读器阅读,但并不知道它是如何有利于SEO和便于阅读器阅读的,带着这个疑问,进行了一番探索总结. SEO 什么是SEO? SEO( ... 
- CSS速查列表-3-(font)字体
			CSS Fonts(字体) CSS字体属性定义 1.字体:font-family 属性设置文本的字体系列.p{font-family:"Times New Roman", Time ... 
- 跨平台原生AR/VR应用研发引擎-NVisionXR开放内测
			NVisionXR引擎正式开放内测.现在,对原生AR/VR应用开发有兴趣的企业和开发者均可通过NVisionXR官网(www.nvisionxr.com)申请试用. NVisionXR引擎介绍视频 ... 
- ORACLE 11G R2 RAC classical install OGG12.1(LINUX) 经典抽取模式单项同步配置OGG12.1
			博文结构图如下: 一.环境描述以及注意事项 1.1 环境简介 IP 系统 Oracle版本 OGG版本 源端 172.16.10.16/36 RHEL6.5 oracle11204 12.1 目标端 ... 
- Spark ML源码分析之四 树
			之前我们讲过,在Spark ML中所有的机器学习模型都是以参数作为划分的,树相关的参数定义在treeParams.scala这个文件中,这里构建一个关于树的体系结构.首先,以Decis ... 
- 使用idea新建jsp
			使用idea解决新建jsp文件而找不到jsp文件模版的新建选项,这样每次创建一个新的jsp文件岂不是很耗时间? 解决办法: 就是要让idea知道你需要在这个目录下创建jsp文件 左上角,file中点击 ... 
