爬虫:Scrapy16 - Spider Contracts
Scrapy 通过合同(contract)的方式来提供了测试 spider 的集成方法。
可以硬编码(hardcode)一个样例(sample)url,设置多个条件来测试回调函数处理 response 的结果,来测试 spider 的回调函数。每个 contract 包含在文档字符串(docstring)里,以@开头。查看例子:
def parse(self, response):
""" This function parses a sample response. Some contracts are mingled
with this docstring. @url http://www.amazon.com/s?field-keywords=selfish+gene
@returns items 1 16
@returns requests 0 0
@scrapes Title Author Year Price
"""
该回调函数使用了3个内置的 contract 来测试:
class scrapy.contracts.default.UrlContract
该 contract(@url)设置了用于检查 spider 的其它 contract 状态的样例 url。该 contract 是必须的。所有缺失该 contract 的回调函数在测试时将被忽略:
@url url
class scrapy.contracts.default.ReturnContract
该 contract(@returns)设置 spider 返回的 items 和 requests 的上届和下届。上届是可选的:
@returns item(s)|request(s) [min [max]]
class scrapy.contracts.default.ScrapesContract
该 contract(@scrapes)检查回调函数返回的所有 item 是否有特定的 fields:
@scrapes field_1 field_2 ...
使用 check 命令来运行 contract 检查。
自定义 Contracts
如果想要比内置 Scrapy contract 更为强大的功能,可以在项目里创建并设置自己的 contract,并使用 SPIDER_CONTRACTS 设置来加载:
SPIDER_CONTRACTS = {
'myproject.contracts.ResponseCheck': 10,
'myproject.contracts.ItemValidate': 10,
}
每个 contract 必须继承 scrapy.contracts.Contract 并覆盖以下三个方法:
class scrapy.contracts.Contract(method, *args)
参数:
- method (function) – contract 所关联的回调函数
- args (list) – 传入 docstring 的(以空格区分的)argument 列表(list)
adjust_request_args(args)
接收一个字典(dict)作为参数。该参数包含了所有 Request 对象 参数的默认值。该方法必须返回相同或修改过的字典。
pre_process(response)
该函数在 sample request 接收到 response 后,传送给回调函数前被调用,运行测试。
post_process(output)
该函数处理回调函数的输出。迭代器(Iterators)在传输给该函数前会被列表化(listified)。
该样例 contract 在 response 接收时检查了是否有自定义 header。 在失败时 Raise scrapy.exceptions.ContractFaild 来展现错误:
from scrapy.contracts import Contract
from scrapy.exceptions import ContractFail class HasHeaderContract(Contract):
""" Demo contract which checks the presence of a custom header
@has_header X-CustomHeader
""" name = 'has_header' def pre_process(self, response):
for header in self.args:
if header not in response.headers:
raise ContractFail('X-CustomHeader not present')
爬虫:Scrapy16 - Spider Contracts的更多相关文章
- 爬虫基础spider 之(一) --- 初识爬虫
爬虫概念 (spider,网络蜘蛛)通过互联网上一个个的网络节点,进行数据的提取.整合以及存储.从而获取我们想要的部分 robots协议 robots协议不是技术层面的协议,只是一个君子协定: 首先在 ...
- 【爬虫入门01】我第一只由Reuests和BeautifulSoup4供养的Spider
[爬虫入门01]我第一只由Reuests和BeautifulSoup4供养的Spider 广东职业技术学院 欧浩源 1.引言 网络爬虫可以完成传统搜索引擎不能做的事情,利用爬虫程序在网络上取得数据 ...
- 第三百三十一节,web爬虫讲解2—Scrapy框架爬虫—Scrapy安装—Scrapy指令
第三百三十一节,web爬虫讲解2—Scrapy框架爬虫—Scrapy安装—Scrapy指令 Scrapy框架安装 1.首先,终端执行命令升级pip: python -m pip install --u ...
- 十 web爬虫讲解2—Scrapy框架爬虫—Scrapy安装—Scrapy指令
Scrapy框架安装 1.首先,终端执行命令升级pip: python -m pip install --upgrade pip2.安装,wheel(建议网络安装) pip install wheel ...
- 分布式爬虫:使用Scrapy抓取数据
分布式爬虫:使用Scrapy抓取数据 Scrapy是Python开发的一个快速,高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据.Scrapy用途广泛,可以用于数据挖掘. ...
- 【爬虫】从零开始使用 Scrapy
一. 概述 最近有一个爬虫相关的需求,需要使用 scrapy 框架来爬取数据,所以学习了一下这个非常强大的爬虫框架,这里将自己的学习过程记录下来,希望对有同样需求的小伙伴提供一些帮助. 本文主要从下面 ...
- Python之路【第二十三篇】爬虫
difference between urllib and urllib2 自己翻译的装逼必备 What is the difference between urllib and urllib2 mo ...
- python之路 - 爬虫
网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.另外一些不常使用的名字还有蚂蚁.自动索引.模拟程序或者蠕 ...
- 爬虫的入门以及scrapy
一.简介 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.另外一些不常使用的名字还有蚂蚁.自动索引.模拟 ...
随机推荐
- mysql常用命令添加外键主键约束存储过程索引
数据库连接 mysql -u root -p123456 查看表 show databases 创建数据库设置编码 create table books character set utf8; 创建用 ...
- Git笔记(pull/push)
一.从远程服务器上获取分支 git pull <远程主机名> <远程分支>:<本地分支> 例如 git pull origin master:loacal_bran ...
- Large-scale Scene Understanding (LSUN)
Large-scale Scene Understanding (LSUN) http://lsun.cs.princeton.edu/#organizers http://sunw.csail.mi ...
- lambda表达式的使用
lambda表达式和可遍历的datatable结合使用,把表中某一列中的数据转成字符串,用“|”隔开,代码如下: obj = tableName.AsEnumerable();if(tableName ...
- 内置函数SQLCODE和SQLERRM的使用
由于ORACLE的错信息最大长度是512字节,为了得到完整的错误提示信息,我们可用 SQLERRM 和 SUBSTR 函数一起得到错误提示信息,方便进行错误,特别是如果WHEN OTHERS异常处理器 ...
- MappingException:class com.zsn.crm.Model.user not found whie looking for property user id
之前好好地运行 什么东西都没动过 再次运行突然报异常*****MappingException:class com.zsn.crm.Model.user not found whie looking ...
- 还在使用pdf、word简历?简单五步实现github托管个人逼格简历
写在前面: 什么是git.github? git 版本控制工具 github 通过git工具做的版本控制的项目托管平台 项目开发肯定不止一个程序猿,多个程序猿针对同一个文件进行代码读写操作时,是先保存 ...
- springMVC入门二
一.准备工作 参考springMVC入门一,搭建maven项目如下: 前台结构如下: 项目介绍:使用springMVC实现前后台数据交互,例如controller返回json,页面传入pojo 二.具 ...
- angular常见问题总结
本文引自:https://www.cnblogs.com/zhoulujun/p/8881414.html 这篇是对angularJS的一些疑点回顾,是对目前angularJS开发的各种常见问题的整理 ...
- 第三章 文件 I/O
3.1 引言 先说明可用的文件 I/O 函数:open.read.write.close,然后说明不同缓冲区长度对read和write函数的影响. 本章所说的函数经常被称为不带缓冲的 I/O (unb ...