20天学会爬虫之Scrapy框架介绍
什么是Scrapy
Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。
框架就是将平常写爬虫的request (异步调度和处理)、下载器(多线程的 Downloader)、解析器(selector)和 twisted(异步处理)封装到了一起,够成了框架。而且使用起来更加方便,爬取速度更快。
Scrapy框架的应用领域有很多,例如网络爬虫开发、数据挖掘、自动化测试等,其最初是为了页面抓取(网络抓取)所设计的,也可以应用在获取API所返回的数据或者通用的网络爬虫。官方网址是https://scrapy.org/
Scrapy的安装
Windows系统:
pip install scrapy
如果安装过程中出错
错误信息如下:
则需要安装Microsoft Visual C++14,如果报错不是Microsoft Visual C++14比如Microsoft Visual C++15则对应安装即可。
如果安装过程中过提示安装Twisted安装失败,则需要来到这个网址:https://www.lfd.uci.edu/~gohlke/pythonlibs/自行下载wheel文件,
可能需要下载的是:pyOpenSSL、Twisted、PyWin32,可以根据安装时,报错的提示信息有针对性的下载。
下载之后放到一个固定的目录中,进入下载的目录。执行 pip3 install xxxxxx.whl (注意xxxxxx代表的是你下载的wheel的名字)
然后再次执行:pip install scrapy
Linux和mac系统直接:pip3 install scrapy
scrapy工作流程
Scrapy工作流程的图:
在图中,Scrapy引擎是架构的核心部分,调度器、管道、下载器和Spiders等组件都通过引擎来调控。在Scrapy引擎和下载器中间通过中间件传递信息,在下载中间件中,可以插入自定义代码扩展Scrapy的功能,例如实现IP池的应用。引擎和Spiders之间也是通过爬虫中间件来传递信息,同样可以自定义扩展功能。
其中:
Scrapy引擎负责控制整个数据处理流程,处于整个Scrapy框架中心位置,协调调度器、管道、中间件、下载器、爬虫。
调度器负责存储等待爬取的网址,确定网址优先级,相当于一个队列存储,同时也会过滤一些重复的网址。
下载器实现对等待爬取的网页资源进行高速下载,该组件通过网络进行大量数据传输,下载对应的网页资源后将数据传递给Scrapy引擎,再由引擎传递给爬虫处理。
下载中间件用于处理下载器与Scrapy引擎之间的通信,自定义代码可以轻松扩展Scrapy框架的功能
Spiders是实现Scrapy框架爬虫的核心部分。每个爬虫负责一个或多个指定的网站。爬虫组件负责接收Scrapy引擎中的Response响应,接收到响应后分析处理,提取对应重要信息
爬虫中间件是处理爬虫组件和Scrapy引擎之间通信的组件,可以自定义代码扩展Scrapy功能
管道用于接收从爬虫组件中提取的管道,接收到后进行清洗、验证、存储等系列操作
因此其流程可以描述如下:
爬虫中起始的url构造成request对象-->爬虫中间件-->引擎-->调度器
调度器把request-->引擎-->下载中间件--->下载器
下载器发送请求,获取response响应---->下载中间件---->引擎--->爬虫中间件--->爬虫
爬虫提取url地址,组装成request对象---->爬虫中间件--->引擎--->调度器,重复步骤2
爬虫提取数据--->引擎--->管道处理和保存数据
每部分的具体作用
scrapy常用命令
scrapy后面可以跟不同的命令,可以使用scrapy --help进行查看,Scrapy框架中命令分为全局命令和项目命令,全局命令不需要进入Scrapy项目即可在全局中直接运行,项目命令必须在Scrapy项目中才可以运行。
其中:
全局命令:
fetch命令是用来检查spider下载页面的方式
runspider命令通过Scrapy中的runspider命令可以直接运行一个爬虫文件
settings命令是用来获取Scrapy的配置信息。
shell命令可以启动Scrapy的交互终端
version命令用于查看Scrapy的版本信息
项目命令:
Scarpy的项目命令主要有bench、check、crawl、edit、genspider、list、parse。Scrapy全局命令可以在项目内外使用,而项目命令只能在Scrapy爬虫项目中使用。
bench命令可以测试本地硬件的性能。
genspider命令可以创建Scrapy爬虫文件,这是一种快速创建爬虫文件的方法
check命令可以实现对爬虫文件的测试
crawl命令可以启动某个爬虫
list命令可以列出当前可使用的爬虫文件
parse命令可以获取指定的URL网址,并使用对应的爬虫文件分析处理
scrapy开发步骤
创建项目:
scrapy startproject 爬虫项目名字
生成一个爬虫:
scrapy genspider <爬虫名字> <允许爬取的域名>
提取数据:
根据网站结构在spider中实现数据采集相关内容
保存数据:
使用pipeline进行数据后续处理和保存
创建项目
使用Scrapy创建一个爬虫项目,首先需要进入存储爬虫项目的文件夹,例如在“D:\python_spider”目录中创建爬虫项目,如图所示。
当然如果你是Linux或者mac系统也需要进入存储爬虫项目的文件夹,然后新建项目
创建之后的爬虫项目myproject目录结构如下:
项目名字/
scrapy.cfg:
项目名字/
__init__.py
items.py
pipelines.py
settings.py
spiders/
__init__.py
scrapy.cfg 项目的主配置信息。(真正爬虫相关的配置信息在settings.py文件中)
items.py 设置数据存储模板,用于结构化数据,如:Django的Model
pipelines 数据持久化处理
settings.py 配置文件,如:递归的层数、并发数,延迟下载等
spiders 爬虫目录,如:创建文件,编写爬虫解析规则
生成一个爬虫spider
进入刚才创建的爬虫项目myproject目录
然后执行: scrapy genspider 应用名称 爬取网页的起始url (见下图的3部分)
编写爬虫
在生成一个爬虫执行完毕后,会在项目的spiders中生成一个应用名的py爬虫文件
打开文件进行代码编写,大家看到的是默认的格式,可以在parse方法中完善爬虫代码
保存数据
数据的保存需要使用管道pipline,在pipelines.py文件中定义对数据的操作
定义一个管道类
重写管道类的process_item方法
process_item方法处理完item之后必须返回给引擎
然后在settings.py配置启用管道
ITEM_PIPELINES = {
'myproject.pipelines.MyprojectPipeline': 400,
}
配置项中键为使用的管道类,管道类使用.进行分割,第一个为项目目录,第二个为文件,第三个为定义的管道类。
配置项中值为管道的使用顺序,设置的数值约小越优先执行,该值一般设置为1000以内。
运行scrapy
命令:在项目目录下执行scrapy crawl <爬虫名字>
示例:scrapy crawl qiubai
当然本次只是给大家描述了一下爬虫中使用scrapy的基本步骤,20天学会爬虫后面会接连介绍scrapy的使用,敬请期待哦!