Scrapy 1.3.2 - Spider的全面认识

Spiders

Spider类定义了如何爬取某个(或某些)网站。包括了爬取的动作(例如:是否跟进链接)以及如何从网页的内容中提取结构化数据(爬取item)。 换句话说,Spider就是您定义爬取的动作及分析某个网页(或者是有些网页)的地方。

对spider来说,爬取的循环类似下文:
1. 以初始的URL初始化Request,并设置回调函数。 当该request下载完毕并返回时,将生成response,并作为参数传给该回调函数。
spider中初始的request是通过调用 start_requests() 来获取的。 start_requests() 读取 start_urls 中的URL, 并以 parse 为回调函数生成 Request 。
2. 在回调函数内分析返回的(网页)内容,返回 Item 对象或者 Request 或者一个包括二者的可迭代容器。 返回的Request对象之后会经过Scrapy处理,下载相应的内容,并调用设置的callback函数(函数可相同)。
3. 在回调函数内,您可以使用 选择器(Selectors) (您也可以使用BeautifulSoup, lxml 或者您想用的任何解析器) 来分析网页内容,并根据分析的数据生成item。
4. 最后,由spider返回的item将被存到数据库(由某些 Item Pipeline 处理)或使用 Feed exports 存入到文件中。

虽然该循环对任何类型的spider都(多少)适用,但Scrapy仍然为了不同的需求提供了多种默认spider。 之后将讨论这些spider。

scrapy.Spider

Spider是最简单的spider。每个其他的spider必须继承自该类(包括Scrapy自带的其他spider以及我们自己编写的spider)。 Spider并没有提供什么特殊的功能。 其仅仅请求给定的 start_urls/start_requests ,并根据返回的结果(resulting responses)调用spider的 parse 方法。

  • name:
    定义spider名字的字符串(string)。spider的名字定义了Scrapy如何定位(并初始化)spider,所以其必须是唯一的。 不过您可以生成多个相同的spider实例(instance),这没有任何限制。 name是spider最重要的属性,而且是必须的。

    如果该spider爬取单个网站(single domain),一个常见的做法是以该网站(domain)(加或不加 后缀 )来命名spider。 例如,如果spider爬取 mywebsite.com ,该spider通常会被命名为 mywebsite 。

  • allowed_domains:
    可选,包含了spider允许爬取的域名(domain)列表(list)。 当 OffsiteMiddleware 启用时, 域名不在列表中的URL不会被跟进。

  • start_urls:
    URL列表。当没有制定特定的URL时,spider将从该列表中开始进行爬取。 因此,第一个被获取到的页面的URL将是该列表之一。 后续的URL将会从获取到的数据中提取。

  • custom_settings:
    一个在运行时会覆盖项目设置的字典。它必须设置为类属性,因为设置在实例化之前更新。可以使用的设置字段可以参考这里Built-in settings reference

  • crawler:
    这个属性会在类初始化以后通过from_crawler()方法获得,并链接到此Spider实例绑定到的Crawler对象。
    Crawlers在项目中封装了大量的组件用于他们的单个条目访问(例如扩展,中间件,信号管理器等)。 有关详情,请参阅抓取工具API

  • settings:
    运行此Spider的配置。 这是一个设置实例,有关此主题的详细介绍,请参阅设置主题。

  • logger:
    使用Spider的name创建的Python记录器。我们可以通过它来发送在Spider运行时产生的日志消息。

  • from_crawler(crawler, *args, **kwargs)
    这是Scrapy用来创建Spider的方法。
    你可能不需要直接覆盖它,因为默认实现充当init ()方法的代理,使用给定的参数args和命名参数kwargs调用它。
    经管如此,该方法在创建新实例的时候会设置crawlersettings,以便稍后再Spider程序中访问。

    参数含义
    crawler(Crawler实例):将于Spider绑定的crawler
    args(list):将要传递到_init_()中的参数
    kwargs(dict):传递给_init_()关键字参数

  • start_requests():
    该方法返回一个可迭代的对象,包含了Spider用于爬取的第一个Request。
    当spider启动爬取并且未制定URL时,该方法被调用。 当指定了URL时,make_requests_from_url() 将被调用来创建Request对象。 该方法仅仅会被Scrapy调用一次,因此我们可以将其实现为生成器。
    该方法默认通过make_requests_from_url()来为start_urls中的每一个url创建Requests(请求)。
    如果想要修改最初爬取某个网站的Request对象,我们可以重写(override)该方法。 例如,如果我们需要在启动时以POST登录某个网站:

import scrapy

class LogginSpider(scrapy.Spider):

    name = 'loggin_test'

    def start_requests(self):
        return [scrapy.FormRequest('http://quotes.toscrape.com/login',
                                   formdata={'password': '1234', 'username': '1234'},
                                   callback= self.loggin)]

    def loggin(self, response):
        print response.body
  • make_requests_from_url(url):
    该方法接受一个URL并且返回一个Request对象(或者Request列表)用于爬取。此方法用于在start_requests()方法中构造初始请求,并且通常用于将URL转换为请求。
    除非重写,否则该方法返回一个以parse()作为回调方法的Request,并启用dont_filter参数。

  • parse(response)
    当response没有指定回调函数时,该方法是Scrapy处理下载的response的默认方法。
    parse 负责处理response并返回处理的数据以及(/或)跟进的URL。 Spider 对其他的Request的回调函数也有相同的要求。
    这个方法及其他Request的回调方法都必须返回一个可迭代的Request对象,或字典,或Item对象。

  • log(message[,level, component])
    使用 scrapy.log.msg() 方法记录(log)message。 log中自动带上该spider的 name 属性

  • closed(reason)
    该方法在Spider关闭时调用,该方法提供了一个替代调用signals.connect()来监听 spider_closed 信号的快捷方式。

通用Spider

Scrapy附带一些有用的通用蜘蛛,你可以使用它来子类化你的蜘蛛。 他们的目的是为一些常见的抓取案例提供方便的功能,例如根据某些规则跟踪网站上的所有链接,从站点地图抓取或解析XML / CSV Feed

在接下来的例子中,我们首先要在项目根目录下的items.py文件中新建TestItem类:

import scrapy

class TestItem(scrapy.Item):
    id = scrapy.Field()
    name = scrapy.Field()
    description = scrapy.Field()

CrawlSpider

这是最常用的爬行常规网站的Spider,因为它通过定义一组规则为跟随链接提供了一种方便的机制。 它可能不是最适合特定网站或项目,但它是通用的几种情况下,所以我们可以从它开始,覆盖它根据需要更多的自定义功能,或只是实现自己的Spider。

除了继承自Spider的属性,该类还有一个新的属性:

  • rules
    一个包含一个(或多个) Rule 对象的集合(list)。 每个 Rule 对爬取网站的动作定义了特定表现。 Rule对象在下边会介绍。 如果多个rule匹配了相同的链接,则根据他们在本属性中被定义的顺序,第一个会被使用。

CrawlSpider也提供了一个可以复写的方法:

-parse_start_url(response):
start_urls响应时调用此方法。 它允许解析初始响应,并且必须返回Item对象,Request对象或包含两者的iterable。

Crawling rules

Rule 构造函数的参数:
- link_extractor:是一个Link Extractor 对象,它定义了如何从爬取的页面中提取链接。
- callback : 是一个回调接口或者String(Spider中同名函数将被调用),从link_extractor中每获取到链接时将会调用该函数。该回调函数接受一个response作为其第一个参数, 并返回一个包含 Item 以及(或) Request 对象(或者这两者的子类)的列表(list)。

注意
当编写爬虫规则的时候,应避免使用parse()做为回调函数,因为CrawlSpider 使用parse()实现其逻辑。
- cb_kwargs : 包含传递给回调函数的参数(keyword argument)的字典。
- follow : 是一个布尔(boolean)值,指定了根据该规则从response提取的链接是否需要跟进。 如果 callback 为None, follow 默认设置为 True ,否则默认为 False 。
- process_links : 是一个callable或string(该spider中同名的函数将会被调用)。 从link_extractor中获取到链接列表时将会调用该函数。该方法主要用来过滤。
- process_request : 是一个callable或string(该spider中同名的函数将会被调用)。 该规则提取到每个request时都会调用该函数。该函数必须返回一个request或者None。 (用来过滤request)。

XMLFeedSpider

XMLFeedSpider被设计用于通过迭代各个节点来分析XML源(XML feed)。 迭代器可以从 iternodes , xml , html 选择。 鉴于 xml 以及 html 迭代器需要先读取所有DOM再分析而引起的性能问题, 一般还是推荐使用 iternodes 。 不过使用 html 作为迭代器能有效应对错误的XML。

在使用的时候我们必须通过定义类属性来设置 iterator 和 tag 的 名称:
- iterator
用于确定使用哪个迭代器的string。可选项有:
- iternodes: 一个高性能的基于正则表达式的迭代器
- html : 使用 Selector 的迭代器。 需要注意的是该迭代器使用DOM进行分析,其需要将所有的DOM载入内存, 当数据量大的时候会产生问题。
- xml : 使用 Selector 的迭代器。 需要注意的是该迭代器使用DOM进行分析,其需要将所有的DOM载入内存, 当数据量大的时候会产生问题

  • itertag
    包含开始迭代的节点的名称itertag = ‘product’

  • namespaces:
    一个由 (prefix, url) 元组(tuple)所组成的list。 其定义了在该文档中会被spider处理的可用的namespace。 prefix 及 uri 会被自动调用 register_namespace() 生成namespace。

除了这些新添加的属性外,我们也可以复写一些方法:

  • adapt_response(responsed):
    该方法在Spider解析response之前被调用。我们可以在response在被分析之前修改其内容。该方法接收一个responsez并且也返回一个response(可以是相同的)。

  • parse_node(response, selector):
    对于与提供的标记名称(itertag)匹配的节点,将调用此方法。 接收每个节点的响应和选择器。 覆盖此方法是必需的。 否则,你的Spider不会工作。 此方法必须返回Item对象,Request对象或包含其中任何对象的iterable。

  • process_results(response, results):
    对于由Spider返回的每个结果(项目或请求),将调用此方法,并且它将在将结果返回到框架核心之前执行所需的任何最后处理,例如设置项目ID。 它接收结果列表和产生那些结果的响应。 它必须返回结果列表(项目或请求)。

CSVFeedSpider

这个Spider非常类似于XMLFeedSpider,除了它迭代行,而不是节点。 在每次迭代中调用的方法是parse_row()
- delimiter:
CSV文件中字段组成的字符串,默认以”,”隔开。

  • quotechar:
    同上,默认’ ” ‘。

  • headers:
    文件CSV Feed中包含的行的列表,用于从中提取字段。

  • parse_row(response, row):
    使用CSV文件的每个提供(或检测到)标头的键接收响应和dict(表示每行)。 此Spider还提供了覆盖adapt_response和process_results方法用于预处理和后处理目的的机会。

SitemapSpider

SitemapSpider允许您通过使用Sitemaps发现网址来抓取网站。
它支持嵌套Sitemap和从robots.txt发现Sitemap网址。

  • sitemao_urls:
    抓取的网站的网址列表。
    还可以指向robots.txt,自动解析从中提取Sitemap网址。

  • sitemap_follow:
    应遵循的网站地图的正则表达式列表。 这只适用于使用指向其他Sitemap文件的Sitemap索引文件的网站。
    默认情况下,将跟踪所有网站地图

  • sitemap_alternate_links:
    指定是否应遵循一个网址的替代链接。 这些是同一网站在同一网址中传递的另一种语言的链接。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
完整版:https://download.csdn.net/download/qq_27595745/89522468 【课程大纲】 1-1 什么是java 1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机中的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3-1 java语言基础入门 3-2 数据的分类 3-3 标识符、关键字和常量 3-4 运算符 3-5 表达式 3-6 顺序结构和选择结构 3-7 循环语句 3-8 跳转语句 3-9 MyEclipse工具介绍 3-10 java基础知识章节练习 4-1 一维数组 4-2 数组应用 4-3 多维数组 4-4 排序算法 4-5 增强for循环 4-6 数组和排序算法章节练习 5-0 抽象和封装 5-1 面向过程的设计思想 5-2 面向对象的设计思想 5-3 抽象 5-4 封装 5-5 属性 5-6 方法的定义 5-7 this关键字 5-8 javaBean 5-9 包 package 5-10 抽象和封装章节练习 6-0 继承和多态 6-1 继承 6-2 object类 6-3 多态 6-4 访问修饰符 6-5 static修饰符 6-6 final修饰符 6-7 abstract修饰符 6-8 接口 6-9 继承和多态 章节练习 7-1 面向对象的分析与设计简介 7-2 对象模型建立 7-3 类之间的关系 7-4 软件的可维护与复用设计原则 7-5 面向对象的设计与分析 章节练习 8-1 内部类与包装器 8-2 对象包装器 8-3 装箱和拆箱 8-4 练习题 9-1 常用类介绍 9-2 StringBuffer和String Builder类 9-3 Rintime类的使用 9-4 日期类简介 9-5 java程序国际化的实现 9-6 Random类和Math类 9-7 枚举 9-8 练习题 10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习题 11-1 Java集合框架和泛型机制 11-2 Collection接口 11-3 Set接口实现类 11-4 List接口实现类 11-5 Map接口 11-6 Collections类 11-7 泛型概述 11-8 练习题 12-1 多线程 12-2 线程的生命周期 12-3 线程的调度和优先级 12-4 线程的同步 12-5 集合类的同步问题 12-6 用Timer类调度任务 12-7 练习题 13-1 Java IO 13-2 Java IO原理 13-3 流类的结构 13-4 文件流 13-5 缓冲流 13-6 转换流 13-7 数据流 13-8 打印流 13-9 对象流 13-10 随机存取文件流 13-11 zip文件流 13-12 练习题 14-1 图形用户界面设计 14-2 事件处理机制 14-3 AWT常用组件 14-4 swing简介 14-5 可视化开发swing组件 14-6 声音的播放和处理 14-7 2D图形的绘制 14-8 练习题 15-1 反射 15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋游戏 17-2 总体设计 17-3 代码实现 17-4 程序的运行与发布 17-5 手动生成可执行JAR文件 17-6 练习题 18-1 Java数据库编程 18-2 JDBC类和接口 18-3 JDBC操作SQL 18-4 JDBC基本示例 18-5 JDBC应用示例 18-6 练习题 19-1 。。。
完整版:https://download.csdn.net/download/qq_27595745/89522468 【课程大纲】 1-1 什么是java 1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机中的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3-1 java语言基础入门 3-2 数据的分类 3-3 标识符、关键字和常量 3-4 运算符 3-5 表达式 3-6 顺序结构和选择结构 3-7 循环语句 3-8 跳转语句 3-9 MyEclipse工具介绍 3-10 java基础知识章节练习 4-1 一维数组 4-2 数组应用 4-3 多维数组 4-4 排序算法 4-5 增强for循环 4-6 数组和排序算法章节练习 5-0 抽象和封装 5-1 面向过程的设计思想 5-2 面向对象的设计思想 5-3 抽象 5-4 封装 5-5 属性 5-6 方法的定义 5-7 this关键字 5-8 javaBean 5-9 包 package 5-10 抽象和封装章节练习 6-0 继承和多态 6-1 继承 6-2 object类 6-3 多态 6-4 访问修饰符 6-5 static修饰符 6-6 final修饰符 6-7 abstract修饰符 6-8 接口 6-9 继承和多态 章节练习 7-1 面向对象的分析与设计简介 7-2 对象模型建立 7-3 类之间的关系 7-4 软件的可维护与复用设计原则 7-5 面向对象的设计与分析 章节练习 8-1 内部类与包装器 8-2 对象包装器 8-3 装箱和拆箱 8-4 练习题 9-1 常用类介绍 9-2 StringBuffer和String Builder类 9-3 Rintime类的使用 9-4 日期类简介 9-5 java程序国际化的实现 9-6 Random类和Math类 9-7 枚举 9-8 练习题 10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习题 11-1 Java集合框架和泛型机制 11-2 Collection接口 11-3 Set接口实现类 11-4 List接口实现类 11-5 Map接口 11-6 Collections类 11-7 泛型概述 11-8 练习题 12-1 多线程 12-2 线程的生命周期 12-3 线程的调度和优先级 12-4 线程的同步 12-5 集合类的同步问题 12-6 用Timer类调度任务 12-7 练习题 13-1 Java IO 13-2 Java IO原理 13-3 流类的结构 13-4 文件流 13-5 缓冲流 13-6 转换流 13-7 数据流 13-8 打印流 13-9 对象流 13-10 随机存取文件流 13-11 zip文件流 13-12 练习题 14-1 图形用户界面设计 14-2 事件处理机制 14-3 AWT常用组件 14-4 swing简介 14-5 可视化开发swing组件 14-6 声音的播放和处理 14-7 2D图形的绘制 14-8 练习题 15-1 反射 15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋游戏 17-2 总体设计 17-3 代码实现 17-4 程序的运行与发布 17-5 手动生成可执行JAR文件 17-6 练习题 18-1 Java数据库编程 18-2 JDBC类和接口 18-3 JDBC操作SQL 18-4 JDBC基本示例 18-5 JDBC应用示例 18-6 练习题 19-1 。。。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值