Scrapy
- Scrapy是纯python实现的一个为了爬取网站数据、提取结构性数据而编写的应用框架。
- Scrapy使用了Twisted异步网络框架来处理网络通讯,可以加快我们的下载速度,并且包含了各种中间件接口,可以灵活的完成各种需求
1、安装
2、认识scrapy框架
2.1 scrapy架构图

Scrapy Engine(引擎) : 负责Spider 、ItemPipeline 、Downloader 、Scheduler 中间的通讯,信号、数据传递等。
Scheduler(调度器) : 它负责接受引擎 发送过来的Request请求,并按照一定的方式进行整理排列,入队列,当引擎 需要时,交还给引擎 。
Downloader(下载器) :负责下载Scrapy Engine(引擎) 发送的所有Requests请求,并将其获取到的Responses交还给Scrapy Engine(引擎) ,由引擎 交给Spider 来处理
Spider(爬虫) :它负责处理所有Responses,从中分析提取数据,获取Item字段需要的数据,并将需要跟进的URL提交给引擎 ,再次进入Scheduler(调度器)
Item Pipeline(管道) :它负责处理Spider 中获取到的Item,并进行进行后期处理(详细分析、过滤、存储等)的地方.
Downloader Middlewares(下载中间件) :你可以当作是一个可以自定义扩展下载功能的组件
Spider Middlewares(Spider中间件) :可以理解为是一个可以自定扩展和操作引擎 和Spider 中间通信 的功能组件(比如进入Spider 的Responses和从Spider 出去的Requests)
2.2 Scrapy运行的大体流程:
1.引擎从spider拿到第一个需要处理的URL,并将request请求交给调度器。
2.调度器拿到request请求后,按照一定的方式进行整理排列,入队列,并将处理好的request请求返回给引擎。
3.引擎通知下载器,按照下载中间件的设置去下载这个request请求。
4.下载器下载request请求,并将获取到的response按照下载中间件进行处理,然后后交还给引擎 ,由引擎 交给spider 来处理。对于下载失败的request,引擎会通知调度器进行记录,待会重新下载。
5.spider拿到response,并调用回调函数(默认调用parse函数)去进行处理,并将提取到的Item数据和需要跟进的URL交给引擎。
6.引擎将item数据交给管道进行处理,将需要跟进的URL交给调度器,然后开始循环,直到调度器中不存在任何request,整个程序才会终止。
2.3 制作scrapy爬虫步骤:
1.创建项目:通过(scrapy startproject 项目名)来创建一个项目
2.明确目标:编写items.py文件,定义提取的Item
3.制作爬虫:编写spiders/xx.py文件,爬取网站并提取Item
4.存储内容:编写pipelines.py文件,设计管道来存储提取到的Item(即数据)
3、入门教程
3.1 创建项目在开始爬虫之前,第一步需要创建一个项目。先进入打算存储代码的目录,运行以下命令:
scrapy startproject myProject
其中myProject为项目名,运行上述命令后,在当前目录下会创建一个myProject目录,该目录包含以下内容:
.
├── myProject
│ ├── __init__.py
│ ├── items.py
│ ├── middlewares.py
│ ├── pipelines.py
│ ├── settings.py
│ └── spiders
│ └── __init__.py
└── scrapy.cfg
scrapy.cfg:项目的配置文件
myProject/items.py:项目中的目标文件
myProject/middlewares.py:项目中的中间件文件
myProject/pipelines.py:项目中的管道文件
myProject/settings.py:项目中的设置文件
myProject/spiders:放置spider代码的目录
3.2 明确目标(定义Item)
我们打算抓取网站http://www.itcast.cn/channel/teacher.shtml里所有老师的姓名、职称、入职时间和个人简介:
- 首先打开myProject/items.py文件
- Item是保存爬取到的数据的容器,其使用方法和python字典类似
- 创建一个scrapy.Item 类, 并且定义类型为 scrapy.Field的类属性来定义一个Item(类似于ORM的映射关系)
- 创建一个MyprojectItdK>yf РТFVb&5VW7B6V&WVW7B7FW"ТW6W%&6U4U%>XiW6W"vV&7B66VvWBw&7Br6Т&&6&7B>Xi Т&WVW7BFW'2FFVfV%W6W"vV6W%>W6W"vV&WVW7BFw&GG&vusr7G"&w>KyJK>yf&SУFcУ6WGFih~KnXУb673&66У&R673''W6#Т>zhyJ6W0Ф4U5$BfPРТ>K[nDT0РТ>k{Xz[{XiyNKK{NKn{ФD%Dt$U2Тv&BFFv&W2&DF$FFv&RsSC2Т>k{XU4U"tTХU4U%Т$6F&Rvw2bvcCG&FVRB423s#B423s#B4"Ss#sF6V"2b"$6F&Rvw2bG&FVBtG&FVB43#B4"Ss#sB423s#B423s#B43sSB4C3#""$6F&Rrvw2RB4C3##B4"Ss#sFB42CSb"$vw3Svw2RvV$BDRvV6f&&6#r3Ff#3"$SV2vV$BDRvV6f&&$vw3Svw2RV3'c&RvV6s#R$vw3Svw2R'cvV6sRf&Vf"$ccSvV6s3#"V6RТУFcУjX[>KFjni67&yNKyJyNih~z[K{NZIyX[5Fjni7&KyJXh^Z{J.zKK^XNih~zhn{~{XyNyX[>ih~z[ZJ~Z^YZIiJ
|