一、Scrapy安装
-
官网地址:https://scrapy.org
-
安装
- pip install scrapy
-
测试安装
- 只需要启动python交互式编程终端,看看能否import模块scrapy即可;
-
scrapy帮助
- 在交互式编程终端,使用import引入scrapy模块,并使用help(scrapy)获取scrapy框架API整体模块结构(其 他更加详细的帮助可以使用help与dir获取)
-
教程与参考资料
二、Scrapy组件结构与工作流程
-
核心组件介绍
- 组件01:引擎(Scrapy Engine)
- Scrapy Engine引擎作用有两个:
- 控制Scrapy框架中所有组件之间的数据流;
- 并在某些爬取动作发生的时候触发数据处理事件。
- Scrapy Engine引擎作用有两个:
- 组件02:调度器(Scheduler)
- 调度器(Scheduler)接收来自引擎的请求,并将它们排队,以便在引擎请求时向引擎提供这些请求。
- 组件03:下载器(Downloader)
- 下载者(Downloader)负责下载网页并将其发送给引擎,引擎把下载的网页发送给蜘蛛/爬虫处理。
- 组件04:蜘蛛/爬虫(Spiders)
- 蜘蛛/爬虫(Spider)负责解析下载器下载的网页,并从中提取数据项(ITEM)(也称为爬取项)或后续的爬取请求。
- 蜘蛛/爬虫(Spider)一般由用户实现,用来实现用户的爬取逻辑。一般继承Spider类来定制实现。
- 组件05:数据项管道(Item Pipeline)
- 数据项管道(Item Pipeline)负责处理被蜘蛛/爬虫提取(或爬取)的数据项。典型的任务包括:
- 清理;
- 验证;
- 持久存储(如将数据项存储在数据库关系数据库或者NoSQL数据库中)。
- 数据项管道(Item Pipeline)负责处理被蜘蛛/爬虫提取(或爬取)的数据项。典型的任务包括:
- 组件06:下载器中间件(Downloader middlewares)
- 下载器中间件(Downloader middlewares)是位于引擎和下载器之间的特定功能的回调Hook,负责处理从引擎 传递到下载器时处理请求,以及从下载器传递到引擎的响应。
- 使用下载器中间件(Downloader middlewares)的几种情况:
- 需要根据条件放弃一些请求。
- 在没有爬取到网页的情况下,发送一个响应给spider;
- 重新发送新的请求,而不是将收到的响应传递给spider;
- 在传递给spider之前改变接受到的响应;
- 在将请求发送给下载者之前处理该请求(即在Scrapy将请求发送到网站之前);
- 组件07:蜘蛛/爬虫中间件(Spider middlewares)
- 蜘蛛/爬虫中间件(Spider middlewares)是位于引擎和蜘蛛之间的特定功能的Hook,负责处理Spider的输入 (响应)和输出(数据项或者请求)。
- 蜘蛛/爬虫中间件(Spider middlewares)的几种情况:
- spider回调的输出后的处理:包含:更改/添加/删除请求或数据项;
- 开始请求的后处理;
- 处理spider异常;
- 对一些基于响应内容的请求调用errback,而不是回调
- 组件01:引擎(Scrapy Engine)
-
核心工作流程
- Scrapy的工作流程是按照爬取的数据设计的流程,并据此设计组件结构。(下图是来自Scrapy的官方文档)
- 流程01-获取请求
- 引擎从蜘蛛获取需要爬取的初始请求。
- 源:Spider
- 目标:Engine
- 数据:请求
- 流程02-请求调度安排
- 引擎调度爬取请求到调度器,并申请下一个需要爬取的爬取请求。
- 源:Engine
- 目标:Scheduler
- 数据:请求
- 引擎调度爬取请求到调度器,并申请下一个需要爬取的爬取请求。
- 流程03-调度爬取请求
- 引擎器返回下一个爬取请求给引擎。(为什么不直接爬取,而是需要经过调度器处理呢?调度的好处在于:多 任务爬取,还可以处理爬取请求与爬取过程的时间不一致的时间差。)
- 源:Scheduler
- 目标:Engine
- 数据:请求
- 引擎器返回下一个爬取请求给引擎。(为什么不直接爬取,而是需要经过调度器处理呢?调度的好处在于:多 任务爬取,还可以处理爬取请求与爬取过程的时间不一致的时间差。)
- 流程04-发送请求给下载器
- 引擎将请求发送到下载器,并通过下载器中间软件传递(process_request回调函数可以处理请求数据)。
- 源:Engine
- 目标:Downloader
- 数据:请求
- 引擎将请求发送到下载器,并通过下载器中间软件传递(process_request回调函数可以处理请求数据)。
- 流程05-下载器完成下载
- 一旦页面下载器完成页面下载,下载器将使用下载好的页面生成一个响应(使用该页面),并将其发送到引 擎,通过下载器中间软件(process_response回调函数完成下载后的页面数据处理)。
- 源:Downloader
- 目标:Engine
- 数据:响应
- 一旦页面下载器完成页面下载,下载器将使用下载好的页面生成一个响应(使用该页面),并将其发送到引 擎,通过下载器中间软件(process_response回调函数完成下载后的页面数据处理)。
- 流程06-数据项抽取
- 引擎从下载器接收响应并将其发送到spider进行处理,并通过spider中间件进行处理(process_spider_input 回调函数处理爬取的网页数据)。
- 源:Engine
- 目标:Spider
- 数据:响应
- 引擎从下载器接收响应并将其发送到spider进行处理,并通过spider中间件进行处理(process_spider_input 回调函数处理爬取的网页数据)。
- 流程07-返回抽取的数据与请求
- Spider处理响应(从爬取的网页中抽取需要的数据项),并通过spider中间件(process_spider_output回调 函数处理Spider处理过的数据)向引擎返回抽取的数据项或者新的附加请求。
- 源:Spider
- 目标:Engine
- 数据:数据项(附加的请求)
- Spider处理响应(从爬取的网页中抽取需要的数据项),并通过spider中间件(process_spider_output回调 函数处理Spider处理过的数据)向引擎返回抽取的数据项或者新的附加请求。
- 流程08-存储抽取的数据项
- 引擎将已处理的数据项发送到数据项管道,然后将已附加的请求发送到调度程序,并请求可能的下一个请求进 行爬取。
- 源:Engine
- 目标:Item Pipeline/Scheduler
- 数据:数据项/附加请求
- 引擎将已处理的数据项发送到数据项管道,然后将已附加的请求发送到调度程序,并请求可能的下一个请求进 行爬取。
- 流程09-结束爬取
- 重复01-08,直到调度器中没有请求调度为止。
- 引擎从蜘蛛获取需要爬取的初始请求。
三、Scrapy入门
这个入门是按照官方的教程组织。
不是上面介绍的每个组件都需要我们开发,实际只需要我们开发业务部分,爬虫的通用功能部分都封装到框架 中,所以我们需要一个框架的环境,并理解整个工作流程,并关注需要开发的部分,以及开发部分与整个框架组件 的关系。
- 创建一个爬虫项目
- 爬虫项目使用scrapy框架提供的一个工具创建:scrapy,该工具创建的项目会提供业务部分运行的环境与配 置。
- scrapy工具介绍
- 获取scrapy工具帮助
- 直接在终端输入scrapy,可以直接输出scrapy工具的帮助。 命令: 其中startproject命令项就是我们马上要使用来创建项目的。
- 获取startproject命令项帮助
- 使用scrapy工具创建一个爬虫项目
- 创建爬虫项目的两个重要参数:
- 项目名称
- 项目存放目录(可选,默认当前目录)
- $ scrapy startproject FirstScrapy
- 爬虫项目文件
- 可以查看创建的项目,其中的文件结合上面的组件与工作流程,大致也知道其用途与作用。
- 实现爬虫业务
- 因为在框架在开发,为了保证框架能顺利工作,需要按照设计的结构,继承scrapy.Spider类,并发起一个爬取 请求,并处理。
- 创建爬虫代码模块
- 爬虫中两个重要的属性
- name属性
- name属性,用来在执行爬虫的时候指定爬虫。属性类型是字符串。
- start_urls属性
- start_urls属性用来发起一个爬虫任务请求。属性类型是列表。
- name属性
- 在项目目录下的scrapy工具的帮助
- 与项目相关的命令有(6个):
- list:列出项目中爬虫列表。
- check:检查爬虫。
- crawl:启动爬虫任务。
- edit:编辑爬虫。
- fetch:获取。
- parse:解析。
- 运行爬虫
- scrapy crawl <脚本名称>
- check爬虫
- scrapy check <脚本名称>
- parse爬虫
- parse命令用来测试爬虫的parse函数。
- scrapy parse --spider=home https://ke.qq.com/course/list? mt=1001&st=2002&tt=3019&price_min=1
- parse命令的帮助:scrapy parse -h
- parse命令用来测试爬虫的parse函数。
- fetch爬虫
- 直接下载页面,并显示在终端。
- scrapy fetch https://ke.qq.com/course/list? mt=1001&st=2002&tt=3019&price_min=1
- 直接下载页面,并显示在终端。
- genspider生成爬虫
- genspider可以查看爬虫模板,创建爬虫,编辑爬虫等功能。其帮助如下:
- scrapy genspider -h
- 查看爬虫模板
- scrapy genspider -l
- 创建爬虫
- scrapy genspider -t crawl myspider <网站url>
- 创建并编辑爬虫
- scrapy genspider -e myspider <网站url>
- genspider可以查看爬虫模板,创建爬虫,编辑爬虫等功能。其帮助如下:
- view查看爬取页面
- scrapy view https://www.baidu.com
- shell交互式爬虫处理
- scrapy shell 'https://ke.qq.com/course/list? mt=1001&st=2002&tt=3019&price_min=1'
- settings获取settings.py中的配置
- settings指令用来获取与设置settings.py中的配置值。
- scrapy settings --get=SPIDER_MODULES
- settings指令用来获取与设置settings.py中的配置值。
- runspider运行爬虫文件
- 这个命令是直接执行爬虫代码文件,与crawl的区别在于,crawl执行的是爬虫项目spiders目录下的有爬虫名 的爬虫。
- scrapy runspider ./FirstScrapy/spiders/home_spider.py
- 这个命令是直接执行爬虫代码文件,与crawl的区别在于,crawl执行的是爬虫项目spiders目录下的有爬虫名 的爬虫。
- 爬虫中两个重要的属性
- 爬取目标