Scrapy框架的基本使用
- Scrapy框架简介
- Scrapy框架的运作流程
- 安装Scrapy框架
- Scrapy框架的基本操作
- Scrapy常用命令
Scrapy框架简介
Scrapy框架主要包含以下组件:
- Scrapy Engine(引擎):负责Spiders、Item Pipeline、Downloader、Scheduler之间的通信,包括信号和数据的传递等。
- Scheduler(调度器):负责接受引擎发过来的Request请求,并按照一定的方式进行整理排队和入队,当引擎需要时,交还给引擎。
- Downloader(下载器):负责下载Scrapy Engine发送的所有Request(请求),并将获取到的Responses(响应)交还给Scrapy Engine,由Scrapy Engine交给Spider来处理。
- Spider(爬虫):负责处理所有Responses,从中分析提取数据,获取Item字段需要的数据,并将需要跟进的URL提交给引擎,再次进入Scheduler。
- Item Pipline(管道):负责处理Spider中获取到的Item数据,并进行后期处理(详细分析、过滤、存储等)。
- Downloader Middlewares(下载中间件):是一个可以自定义扩展下载功能的组件。
- Spider Middlewares(Spider中间件):是一个可以自定义扩展Scrapy Engine和Spiders中间通信的功能组件(例如:进入Spiders的Responses和从Spiders出去的Requsets)。
这些组件的合作,共同完成整个爬取任务。
Scrapy框架的运作流程
Scrapy的运作流程由引擎控制,其过程如下:
1)引擎向Spiders请求一个或多个要爬取的URL
2)引擎从Spiders中获取到第一个要爬取的URL,封装成Request并给调度器
3)引擎向调度器请求第一个要爬取的Request
4)调度器返回第一个要爬取的Request给引擎,引擎将Request通过下载中间件转发给下载器
5)一旦页面下载完毕,下载器便会生成一个该页面的Response,并通过下载中间件发送给引擎,如果这个Request下载失败,下载器将失败的信号返回给引擎,然后引擎告诉调度器,待会再进行下载
6)引擎从下载中间件中接受到Response并通过Spider中间件发送给Spider处理
7)Spider处理Response并返回爬取到的Item及新的Request给调度器
8)引擎将爬取到的Item给Item Pipline进行处理,并将这个Requset发送给调度器进行处理
9)从第2步开始重复,直到调度器中没有更多的Request
安装Scrapy框架
直接通过命令进行安装:pip install scrapy -i https://pypi.douban.com/simple
后面加的时豆瓣源,安装的速度可以快一点。
输入【scrapy】显示如下界面就说明安装成功了
此时为了更加方便的使用我们的Scrapy框架,使下载速度更加流畅通顺,我们还需要安装【Twisted】异步网络框架来处理网络通信。
Twisted异步网络框架的下载安装
将Twisted安装文件下载到本地后,复制我们需要安装的版本的名字,在下载的Twisted文件夹中进入终端输入:pip install Twisted‑20.3.0‑cp39‑cp39‑win_amd64.whl
当显示这个界面时说明已经安装完成了
此时我们还需要安装【itemadapter】这个在我们创建框架的时候能用上,直接使用:pip install itemadapter -i https://pypi.douban.com/simple
命令进行安装
Scrapy框架的基本操作
使用Scrapy框架制作爬虫一般需要一下步骤:
1)新建项目(Scrapy startproject xxx
):创建一个新的爬虫项目
2)明确目标(编写items.py):明确想要爬取的目标
3)制作爬虫(spiders/xxspiser.py):制作爬虫,开始爬取网页
4)存储数据(pipelines.py):存储爬取内容(一般通过管道进行)
- 新建项目
新建一个文件夹,右击打开终端输入scrapy startproject testScrapy(这是项目名称)
显示以下界面说明成功了
此时我们打开文件夹会出现下面这些.py
文件
下面简单介绍以下这些文件的作用:
1) spiders
:存储爬虫代码的目录
2) items.py
:实体文件,用于定义项目的目标实体
3) middlewares.py
:中间文件,用于定义Spider中间件
4) pipelines.py
:管道文件,用于定义项目使用的管道
5) settings.py
:设置文件,用于存储项目的设置信息
- 明确爬取目标
下面以知乎网页为例,爬取用户的名字和简介:
Scrapy使用Item(实体)来表示要爬取的数据。Item定义结构化数据字段,类似于Python中的字典dict,但是提供了一些额外的保护以减少错误。
Scrapy框架提供了基类scrapy.Item用来表示实体数据,一般需要创建一个继承自scrapy.Item的子类,并为该子类添加类型为scrapy.Field的类属性来表示爬虫项目的实体数据(可以理解成类似于ORM的映射关系)。
在Pycharm中打开mySpider目录下的items.py文件,可以看到Scrapy框架已经在items.py文件中自动生成了继承自scrapy.Item的MyspiderItem类。用户只需要修改MyspiderItem类的定义,为他添加属性即可。代码如下:
import scrapy
class TestscrapyItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
# 创建属性name,为用户名
name = scrapy.Field
# 创建属性title,为简介
title = scrapy.Field
- 制作Spiders爬取网页
使用Scrapy框架制作爬虫的第三步就是制作Spiders,也就是负责爬取和提取数据的爬虫。通常把制作Spiders分为3个步骤实现,分别是创建爬虫、运行爬虫以爬取网页和提取数据。
1)创建爬虫
首先要在项目中创建一个爬虫,创建爬虫的命令格式如下:
scrapy genspider 爬虫名称“爬虫域”
在创建爬虫的命令,需要为爬虫起一个名称,并规定该爬虫要爬取的网页域范围,也就是爬取域。
打开终端,来到当前目录的子目录spiders中,使用创建爬虫的命令创建一个名为itcast的爬虫,并指定爬取域的范围为zhihu.com
代码如下:
scrapy genspider zhihui “zhihui.com”
这是执行完命令后的反馈
此时spiders文件中会增加一个刚刚命名的 zhihui
的.py
文件
我们可以自己创建zhihui.py
文件中的代码,只是使用命令可以免去编写固定代码的麻烦,从代码中可以看到自动创建的爬虫类名称ZhihuiSpider,它继承自scrapy.Spider类。scrapy.Spider是Scrapy提供的爬虫基类,用户创建的爬虫类都需要从该类继承,爬虫类中需要定义三个属性(name、allowed_domains、start_urls)和一个方法(parse)
1)name属性:表示这个爬虫的识别名称。爬虫的名称必须是唯一的,不同的爬虫需要定义不同的名称。
2)allow_domains属性:表示爬虫搜索的域名范围,也就是爬虫的约束区域。该属性规定爬虫只能爬取这个域名下的网页,不在该域名下的URL会被忽略。
3)start_urls属性:表示爬取的起始URL元组或列表。爬虫第一次下载的数据将会从这个URL开始,其他URL将会从这些起始URL中继承性的生成。
4)parse(self,response)方法:用于解析网络响应。该方法在每个初始URL完成下载后被调用,调用时传入从该URL返回的Response对象作为唯一的参数。
parse()方法主要有解析返回的网页数据(response.body),提取结构化数据(生成item)和生成访问下一页数据的URL请求。
下面对生成的ZhihuiSpider类进行自定义修改,首先将start_urls的值修改为需要爬取的第一个URL:
# 这是个元组,括号的逗号不能省略,列表也可以
start_urls = ("https://www.zhihu.com/question/594331966/answer/2980422269",)
然后我们修改parse()方法,在该方法中将响应信息转换成文本,保存在test.html文件中:
2)运行爬虫
ZhihuiSpider类的代码修改完成后,就可以运行zhihui爬虫来爬取网页。运行爬虫的命令格式如下:
scrapy crawl 爬虫名称
在终端中进入zhihui.py文件所在的目录,输入scrapy crawl zhihui
,这里的zhihui就是使用scrapy genspider命令时确定的爬虫名称。
显示以下界面说明成功了
-
提取数据
前面两个步骤已经成功爬取到了网页源码,下面就可以从源代码中提取数据,要提取数据首先需要观察页面源代码,定位目标数据,分析和了解目标数据的展示结构,之后,我们就可以使用我们的Scrapy支持的Xpath解析方式进行数据提取,这时需要修改parse()方法,修改完成之后,在命令行使用scrapy crawl zhihui
再次运行爬虫,就可以看到控制台打印出获取到的讲师的信息。 -
永久性存储数据
使用Scrapy框架制作爬虫的最后一步就是将获取到的目标数据进行永久性的存储,Scrapy保存数据最简单的方法有四种:
# 输出JSON格式,默认为Unicode编码
scrapy crawl 项目名 -o 文件名.json
# 输出JSON Lines格式,默认为Unicode编码
scrapy crawl 项目名 -o 文件名.jsonl
# 输出CSV格式,使用逗号表达式,可用Excel打开
scrapy crawl 项目名 -o 文件名.csv
# 输出XML格式
scrapy crawl 项目名 -o 文件名.xml
如果要对导出数据的编码格式进行设置,可以在Scrapy的管道(Item Pipeline)中进行。
Scrapy常用命令
命令用途 | 命令格式 |
---|---|
创建项目 | scrapy startproject 项目名称 |
创建爬虫 | scrapy genspider 爬虫域 |
运行爬虫 | scrapy crawl 爬虫名称 |
保存数据 | scrapy crawl 爬虫名称 -o 文件名.格式 |