爬虫: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‘)
时间: 2024-08-27 10:06:20

爬虫:Scrapy16 - Spider Contracts的相关文章

八月份课堂--Python爬虫(Spider)基础

一.爬虫(Spider) 请求网站,提取网页内容的最大化程序.获取到的是html代码,需要从这些文本中提取需要的数据. HTTP:是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从WWW服务器传输超文本到本地浏览器的传输协议,它可以使浏览器更加高效,使网络传输减少. HTTPS:是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL. SSL(Secure Sock

Web Spider实战1——简单的爬虫实战(爬取"豆瓣读书评分9分以上榜单")

1.Web Spider简介 Web Spider,又称为网络爬虫,是一种自动抓取互联网网页信息的机器人.它们被广泛用于互联网搜索引擎或其他类似网站,以获取或更新这些网站的内容和检索方式.它们可以自动采集所有其能够访问到的页面内容,以供搜索引擎做进一步处理(分检整理下载的页面),而使得用户能更快的检索到他们需要的信息. 2.一个简单的网络爬虫案例 作者在浏览网页的时候看到豆瓣书单的网页(首页),如下所示: 因为书单共有409本书,17个页面,若是要一个个浏览完,需要较长的时间,想要保存好书单,那

分布式爬虫:使用Scrapy抓取数据

分布式爬虫:使用Scrapy抓取数据 Scrapy是Python开发的一个快速,高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据.Scrapy用途广泛,可以用于数据挖掘.监测和自动化测试. 官方主页: http://www.scrapy.org/ 中文文档:Scrapy 0.22 文档 GitHub项目主页:https://github.com/scrapy/scrapy Scrapy 使用了 Twisted 异步网络库来处理网络通讯.整体架构大致如下(注:图片来自

爬虫Scrapy学习指南之抓取新浪天气

scrapy有一个简单的入门文档,大家可以参考一下,我感觉官方文档是最靠谱的,也是最真实的. 首先我们先创建一个scrapy的项目 scrapy startproject weather 我采用的是ubuntu12.04的系统,建立项目之后主文件夹就会出现一个weather的文件夹.我们可以通过tree来查看文件夹的结构.可以使用sudoapt-get install tree安装. tree weather weather ├── scrapy.cfg ├── wea.json ├── wea

爬虫相关之浅聊爬虫

1.安装:要是说到爬虫,我们不得不提一个大而全的爬虫组件/框架,这个框架就是scrapy:scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 其可以应用在数据挖掘,信息处理或存储历史数据等一系列的程序中.那么我们直接进入正题,先说说这个框架的两种安装方式: 第一种:windows环境下的安装需要以下几步操作 1.下载twisted:http://www.lfd.uci.edu/~gohlke/pythonlibs/ 2.pip3 install wheel 3.pip3 ins

web爬虫讲解—Scrapy框架爬虫—Scrapy安装—Scrapy指令

Scrapy框架安装 1.首先,终端执行命令升级pip: python -m pip install --upgrade pip2.安装,wheel(建议网络安装) pip install wheel3.安装,lxml(建议下载安装)4.安装,Twisted(建议下载安装)5.安装,Scrapy(建议网络安装) pip install Scrapy 测试Scrapy是否安装成功 Scrapy框架指令 scrapy -h 查看帮助信息 Available commands: bench Run q

爬虫性能相关

性能相关 在编写爬虫时,性能的消耗主要在IO请求中,当单进程单线程模式下请求URL时必然会引起等待,从而使得请求整体变慢. import requests def fetch_async(url): response = requests.get(url) return response url_list = ['http://www.github.com', 'http://www.bing.com'] for url in url_list: fetch_async(url) 1.同步执行

教你分分钟学会用python爬虫框架Scrapy爬取心目中的女神

欢迎加入Python学习交流群:535993938  禁止闲聊 ! 名额有限 ! 非喜勿进 ! 本博文将带领你从入门到精通爬虫框架Scrapy,最终具备爬取任何网页的数据的能力.本文以校花网为例进行爬取,校花网:http://www.xiaohuar.com/,让你体验爬取校花的成就感. Scrapy,Python开发的一个快速,高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据.Scrapy用途广泛,可以用于数据挖掘.监测和自动化测试. Scrapy吸引人的地方在于

Python爬虫进阶一之爬虫框架概述

综述 爬虫入门之后,我们有两条路可以走. 一个是继续深入学习,以及关于设计模式的一些知识,强化Python相关知识,自己动手造轮子,继续为自己的爬虫增加分布式,多线程等功能扩展.另一条路便是学习一些优秀的框架,先把这些框架用熟,可以确保能够应付一些基本的爬虫任务,也就是所谓的解决温饱问题,然后再深入学习它的源码等知识,进一步强化. 就个人而言,前一种方法其实就是自己动手造轮子,前人其实已经有了一些比较好的框架,可以直接拿来用,但是为了自己能够研究得更加深入和对爬虫有更全面的了解,自己动手去多做.