爬虫: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社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.另外一些不常使用的名字还有蚂蚁.自动索引.模拟 ...
随机推荐
- java.util包中 Set 和 List 的区别
http://ligaosong.iteye.com/blog/903692 对于Set 和 List都是 接口 Collection 的子接口 1.Set 不允许重复,List允许重复 2.Set ...
- Onboard,迷人的引导页样式制作库
简介 Onboard主要用于引导页制作,源码写的相当规范,值得参考. 项目主页: https://github.com/mamaral/Onboard 实例下载: https://github.com ...
- 学习vue-cli3的项目搭建
安装 关于旧版本 Vue CLI 的包名称由 vue-cli 改成了 @vue/cli. 如果你已经全局安装了旧版本的 vue-cli(1.x 或 2.x),你需要先通过 npm uninstall ...
- LeetCode105. Construct Binary Tree from Preorder and Inorder Traversal
题目 根据一棵树的前序遍历与中序遍历构造二叉树. 注意: 你可以假设树中没有重复的元素. 例如,给出 前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9,3 ...
- BZOJ1509: [NOI2003]逃学的小孩(树的直径)
Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1126 Solved: 567[Submit][Status][Discuss] Description ...
- MySQL工作经验
以下是根据工作中遇到各种场景用到的一些Mysql用法,比较实用,基本是语法之外的一些东西. 修改账户密码 1.打开Mysql控制台,输入原密码: 2.输入以下语法:mysql> set pass ...
- Xtrabackup实现MySQL备份
一.xtrabackup介绍 Xtrabackup是一个对InnoDB做数据备份的工具,支持在线热备份(备份时不影响数据读写)它由percona提供的mysql数据库备份工具,据官方介绍,这也是世界上 ...
- 动态代理和AOP
之前说过了我对IOC的理解,这篇文章说以下我对动态代理和基本的对AOP的理解. 所谓动态代理就是,在运行时,动态创建实现了一组指定接口的实现类对象. 比如有: interface A { } inte ...
- 【PHP】nl2br转化输出input框的换行
在input或者textarea框中输入的换行符保存到数据库是/n,如果直接输出到前端的话是不会有换行的,所以要用到nl2br转化 nl2br($test);
- PHP.36-TP框架商城应用实例-后台12-商品管理-主分类添加、修改、搜索(连表查询)
需求:一个商品必须有一个主分类,一个主分类可以有多个商品 [一对多] 修改表p39_goods,增加外键约束,增加索引 主分类添加[控制器->页面] 1.在控制器GoodsController. ...