初识Scrapy爬虫框架
Scrapy
是一个为了爬取网站数据,提取结构性数据而编写的应用框架,非常出名,非常强悍。所谓的框架就是一个已经被集成了各种功能(高性能异步下载,队列,分布式,解析,持久化等)的具有很强通用性的项目模板。对于框架的学习,重点是要学习其框架的特性、各个功能的用法即可。
介绍
Scrapy
主要包括了以下组件:
- 引擎(
Scrapy
)
用来处理整个系统的数据流处理, 触发事务(框架核心) - 调度器(
Scheduler
)
用来接受引擎发过来的请求, 压入队列中, 并在引擎再次请求的时候返回. 可以想像成一个URL
(抓取网页的网址或者说是链接)的优先队列, 由它来决定下一个要抓取的网址是什么, 同时去除重复的网址 - 下载器(
Downloader
)
用于下载网页内容, 并将网页内容返回给蜘蛛(Scrapy
下载器是建立在twisted
这个高效的异步模型上的) - 爬虫(
Spiders
)
爬虫是主要干活的, 用于从特定的网页中提取自己需要的信息, 即所谓的实体(Item
)。用户也可以从中提取出链接,让Scrapy
继续抓取下一个页面 - 项目管道(
Pipeline
)
负责处理爬虫从网页中抽取的实体,主要的功能是持久化实体、验证实体的有效性、清除不需要的信息。当页面被爬虫解析后,将被发送到项目管道,并经过几个特定的次序处理数据。 - 下载器中间件(
Downloader Middlewares
)
位于Scrapy
引擎和下载器之间的框架,主要是处理Scrapy
引擎与下载器之间的请求及响应。 - 爬虫中间件(
Spider Middlewares
)
介于Scrapy
引擎和爬虫之间的框架,主要工作是处理蜘蛛的响应输入和请求输出。 - 调度中间件(
Scheduler Middewares
)
介于Scrapy
引擎和调度之间的中间件,从Scrapy
引擎发送到调度的请求和响应。
Scrapy
运行流程大概如下:
- 引擎从调度器中取出一个链接(
URL
)用于接下来的抓取 - 引擎把
URL
封装成一个请求(Request
)传给下载器 - 下载器把资源下载下来,并封装成应答包(
Response
) - 爬虫解析
Response
- 解析出实体(
Item
),则交给实体管道进行进一步的处理 - 解析出的是链接(
URL
),则把URL交给调度器等待抓取
安装
linux
1 | pip3 install scrapy |
windows
安装wheel
1 | pip3 install wheel |
下载`
http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted
该页面下载与你php
版本对应的twisted
安装twisted
进入下载的twisted
目录,安装twisted
文件
1 | pip install traits-5.1.2-cp37-cp37m-win_amd64.whl |
安装pywin32
1 | pip install pywin32 |
安装scrapy
1 | pip install scrapy |
使用
创建项目
1 | scrapy startproject 你的项目名称 |
自动创建目录:
1 | ┌┈┈ 你的项目名称/ |
文件说明:
scrapy.cfg
项目的配置信息,主要为Scrapy
命令行工具提供一个基础的配置信息。(真正爬虫相关的配置信息在settings.py
文件中)items.py
设置数据存储模板,用于结构化数据,如:Django
的Model
pipelines
数据处理行为,如:一般结构化的数据持久化settings.py
配置文件,如:递归的层数、并发数,延迟下载等spiders
爬虫目录,如:创建文件,编写爬虫规则
注意:一般创建爬虫文件时,以网站域名命名
创建爬虫
进入刚才的项目目录,即cd your_project_name
1 | scrapy genspider 应用名称 爬取网页的起始url |
如:scrapy genspider diandian www.diandian100.cn
编写爬虫
上述代码执行后,将在你的spiders
目录中生成一个diandian.py
的爬虫文件
1 | import scrapy |
执行爬虫
scrapy crawl 爬虫名称
:该种执行形式会显示执行的日志信息scrapy crawl 爬虫名称 --nolog
:该种执行形式不会显示执行的日志信息
1 | scrapy crawl 应用名称 |
递归的访问
以上的爬虫仅仅是爬去初始页,而我们爬虫是需要源源不断的执行下去,直到所有的网页被执行完毕
1 | # -*- coding: utf-8 -*- |
持久化
指令持久化
基于终端指令的持久化存储 ,保证爬虫文件的parse方法中有可迭代类型对象(通常为列表or字典)的返回,该返回值可以通过终端指令的形式写入指定格式的文件中进行持久化操作。执行输出指定格式进行存储:将爬取到的数据写入不同格式的文件中进行存储。
1 | scrapy crawl 爬虫名称 -o xxx.json |
管道持久化
scrapy
框架中已经为我们专门集成好了高效、便捷的持久化操作功能,我们直接使用即可。要想使用·的持久化操作功能,我们首先来认识如下两个文件:
items.py
:数据结构模板文件。定义数据属性。pipelines.py
:管道文件。接收数据(items
),进行持久化操作。
持久化流程
1.爬虫文件爬取到数据后,需要将数据封装到items
对象中。
2.使用yield
关键字将items
对象提交给pipelines
管道进行持久化操作。
3.在管道文件中的process_item
方法中接收爬虫文件提交过来的item
对象,然后编写持久化存储的代码将item
对象中存储的数据进行持久化存储
4.settings.py
配置文件中开启管道
持久化示例
文件持久化
爬虫文件diandian.py
1 | # -*- coding: utf-8 -*- |
items.py
1 | import scrapy |
管道文件:pipelines.py
1 | class StudyPipeline(object): |
配置文件:settings.py
1 | # 开启管道 |
数据库持久化
上述实例中, 在管道文件里将item
对象中的数据值存储到了磁盘中,如果将~数据写入mysql
数据库的话,只需要将上述案例中的管道文件修改成如下形式:
管道文件:pipelines.py
1 | #导入数据库的类 |
配置文件:settings.py
1 | ITEM_PIPELINES = { |
redis
持久化
上例中,在管道文件里将item
对象中的数据值存储到了磁盘中,如果将item
数据写入redis
数据库的话,只需要将上述案例中的管道文件修改成如下形式 。
管道文件:pipelines.py
1 | import redis |
配置文件:settings.py
1 | ITEM_PIPELINES = { |