[转]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 ...
随机推荐
- ajax利用FormData异步文件提交
通常情况下,我们上传文件都会使用form表单来提交文件.但有时候,我们会有异步提交文件的需求,在这种情况下,我们就需要新建一个Formdata来提交文件,后台如果使用的是PHP的话可以使用$_FILE ...
- xampp配置多端口访问
1.修改D:\xampp\apache\conf\extra中的httpd-vhosts.conf文件,在最底部添加 <VirtualHost *:8080> ##需要监听的端口号 Ser ...
- Android中Activity和Service的数据通讯
在Android中,我们通常需要Activity跟Service进行通讯,很多人只知道Activity掉用Service,却不知道Service如何将数据返回给Activity.其实Service返回 ...
- C语言函数嵌套调用作业
一.实验作业 1.1 PTA题目:6-4 十进制转换二进制 设计思路 如果n大于1 对n/2继续进行该函数运算 输出n%2的值 代码截图 调试问题 我第一次做的时候判断的边界条件是大于0继续进行运算, ...
- HDFS架构
- Alpha冲刺Day5
Alpha冲刺Day5 一:站立式会议 今日安排: 首先由于经过黄腾飞短暂的测试,发现导入导出仍然有一些问题,今天需要进行完善 由黄腾飞负责企业自查风险管理子模块,要求为单元进行风险点的管理 由张梨贤 ...
- Scrum 冲刺 第六日
Scrum 冲刺 第六日 目录 要求 项目链接 燃尽图 问题 今日任务 明日计划 成员贡献量 要求 各个成员今日完成的任务(如果完成的任务为开发或测试任务,需给出对应的Github代码签入记录截图:如 ...
- HP DL380服务器RAID信息丢失数据恢复方法和数据恢复过程分享
[数据恢复故障描述] 客户服务器属于HP品牌DL380系列,存储是由6块73GB SAS硬盘组成的RAID5,操作系统是WINDOWS 2003 SERVER,主要作为企业部门内部的文件服务器来 ...
- RadioButton的图标改变大小(TextView也适用)
RadioButton的图标大小并没有相应的布局参数,本文通过自定义属性的方式自定义RadioButton,实现控制图片大小. 本文要点: 自定义属性的使用. 解决RadioButton文字上.下.左 ...
- Linux命令及lamp搭建
单纯属于Linux的命令:1.强制卸载有依赖关系的软件包: rpm -e httpd-2.2.15-26.el6.x86_64 --nodeps(--nodeps表示无依赖)4.删除当前目录所有的文件 ...