大名鼎鼎的爬虫框架: Scrapy!
说到爬虫框架,就一定得提提scrapy这个明星框架了,目前Python中最受欢迎的爬虫框架之一,简单、方便、易上手。
1 Scrapy基本简介
Scrapy是python开发的一个快速、高层次、轻量级的屏幕抓取和web抓取的python爬虫框架,主要用于抓取特定web站点的信息并从中提取特定结构的数据。
它的应用领域很多,比如网络爬虫开发、数据挖掘、数据监测。自动化测试等。
scrapy吸引人的一点在于它是一个框架,但任何人都可以根据需求方便的修改,也提供了多种类型爬虫的基类,如BaseSpider、sitemap爬虫等。
高性能的持久化存储
异步的数据下载
高性能的数据解析
分布式
Scrapy很容易扩展,快速和功能强大。
这是一个跨平台应用程序框架(在Windows,Linux,Mac OS和BSD)。
Scrapy请求调度和异步处理。
Scrapy附带了一个名为Scrapyd的内置服务,它允许使用JSON Web服务上传项目和控制蜘蛛。
能够刮削任何网站,即使该网站不具有原始数据访问API。
2 Scrapy基本使用
有两种方法:
使用pip安装:pip install Scrapy;
使用Anaconda安装:
windows+r >>> cmd >>> conda install scrapy >>> 回车;
由于Scrapy相关依赖较多,在安装过程中可能会碰到下面这些问题,安装不上的同学可以参考一下:
(1)ImportError: No module named w3lib.http
解决:pip install w3lib
(2)ImportError: No module named twisted
解决:pip install twisted
(3)ImportError: No module named lxml.HTML
解决:pip install lxml
(4)error: libxml/xmlversion.h: No such file or directory
解决:apt-get install libxml2-dev libxslt-dev
apt-get install Python-lxml
(5)ImportError: No module named cssselect
解决:pip install cssselect
(6)ImportError: No module named OpenSSL
解决:pip install pyOpenSSL
下面讲讲Scrapy框架学习最重要的部分;
3 Scrapy整体架构
下面这张图大家应该都不陌生了,很多有关scrapy框架的介绍中都会出现,能够看懂这张图并理解的话基本掌握Scrapy框架没多大问题了。
基本结构:5+2框架,5个模块,2个中间件;
最简单的单个网页爬取流程是spiders > scheduler > downloader > spiders > item pipeline。
4 运行流程
引擎从调度器中取出一个URL链接(url)用来接下来的爬取;
引擎把URL封装成一个Request请求传给下载器,下载器把资源下下来,并封装成应答包Response;
爬虫解析Response;
若是解析出实体(Item),则交给实体管道(pipelines)进行进一步的处理;
若是解析出的是链接(URL),则把URL交给Scheduler等待抓取;
4 各组件作用
1)ScrapyEngine (引擎)
负责Scheduler、Downloader、Spiders、Item Pipeline中间的通讯信号和数据的传递,此组件相当于爬虫的“大脑”,是整个爬虫的调度中心。
2)Scheduler(调度器)
简单地说就是一个队列,负责接收引擎发送过来的 request请求,然后将请求排队,当引擎需要请求数据的时候,就将请求队列中的数据交给引擎。
初始的爬取URL和后续在页面中获取的待爬取的URL将放入调度器中,等待爬取,同时调度器会自动去除重复的URL(如果特定的URL不需要去重也可以通过设置实现,如post请求的URL)。
3)下载器(Downloader)
负责下载引擎发送过来的所有 request请求,并将获得的 response交还给引擎,再由引擎将 response交管给 Spiders来进行解析。
4)Spiders(爬虫)
它负责处理所有responses,从中分析提取数据,获取Item字段需要的数据,并将需要跟进的URL提交给引擎,再次进入Scheduler(调度器)。
5)Item Pipeline(项目管道)
就是我们封装去重类、存储类的地方,负责处理 Spiders中获取到的数据并且进行后期的处理,过滤或者存储等等。
当页面被爬虫解析所需的数据存入Item后,将被发送到项目管道(Pipeline),并经过几个特定的次序处理数据,最后存入本地文件或存入数据库。
6)Downloader Middlewares(下载中间件)
可以当做是一个可自定义扩展下载功能的组件,是在引擎及下载器之间的特定钩子(specific hook),处理Downloader传递给引擎的response。
通过设置下载器中间件可以实现爬虫自动更换user-agent、IP等功能。
7)Spider Middlewares(爬虫中间件)
Spider中间件是在引擎及Spider之间的特定钩子(specific hook),处理spider的输入(response)和输出(items及requests)。
自定义扩展、引擎和Spider之间通信功能的组件,通过插入自定义代码来扩展Scrapy功能。
5 数据流的路径
数据流(Data flow)的三个路径:
路径一:
Engine从Spider出获得爬取请求Requests
Engine将爬取请求转发给Scheduler,用于调度
路径二:
Engine从Scheduler处获得下一个要爬取的请求;
Engine将爬取请求Requests发送给Downloader;
爬取网页之后,Downloader进行下载,形成相应的Response对象,通过中间件发给Engine;
Engine将收到的响应通过中间件发送给Spider处理;
路径三:
Spider处理响应后产生爬取项Item和新的爬取请求Requests给Engine;
Engine将爬取项发送给Item Pipeline进行整理;
Engine将爬取请求发送给Scheduler进行下一次调度;
综上:用户只需要将自己的爬取请求输入到对应的Spider中,同时将自己对文件的加工请求写入到对应的Item Pipeline中,所以一般使用scrapy框架都只修改Spider和Item Pipeline。
6 信息提取方法
Scrapy爬虫支持多种HTML信息提取方法,这些方法主要放置在Spider模块下。
Beautiful Soup (引用BeautifulSoup库,并将Response.body作为分析材料进行文档分析)
lxml
re
XPath Selector
CSS Selector
7 常用工具命令
A、查看帮助
scrapy -h
scrapy <command> -h
B、有两种命令:全局命令、项目命令
第一种:全局命令不需要依靠Scrapy项目就可以在全局中直接运行;
settings #可以查看Scrapy对应的配置信息
runspider #通过Scrapy中的runspider命令我们可以实现不依托Scrapy的爬虫项目,直接运行一个爬虫文件。
shell #主要是可以启动Scrapy的交互终端。经常在开发以及调试的时候用到,使用Scrapy的交互终端可以在不启动Scrapy爬虫的情况下,对网站响应进行调试。
fetch #主要用来显示爬虫爬取的过程
view #下载完毕后直接弹出浏览器,以此可以分辨出哪些数据是ajax请求
version #可以直接显示Scrapy的版本相关信息(加上-v 可以查看相关的其他版本信息)
startproject #主要就是创建项目用
第二种:项目命令必须要在Scrapy项目中才可运行;
Project-only commands #项目文件下
crawl #启动某个爬虫,启动格式是"scrapy crawl 爬虫名"
check #检测项目中有无语法错误
list #列出当前可使用的爬虫文件
edit #可以直接打开对应编辑器对爬虫文件进行编辑,在windows中我们一般使用Python IDE 或者Pycharm直接对爬虫项目进行管理和编辑。
parse #使我们可实现获取指定的URL网址,并使用对应的爬虫文件进行处理和分析。
bench #测试本地硬件的性能
genspide#主要是创建Scrapy爬虫文件,是一种快速创建爬虫文件的方式。
在命令的必要参数前可增加选项,下面介绍部分全局选项,各命令的特殊选项输入命令后加上-h选项可以获得。
8 Pipeline流水线处理模块
Pipelines流水线处理模块由多个Pipeline类组成,一个Pipeline处理模块包含三个方法/函数。
其中,process_item函数一般将得到的item返回,方便其他流水线处理模块处理。
流水线处理模块需要在settings.py工程配置文件中注册并设置优先级,为字典格式,格式样例:
ITEM_PIPELINES = {
'demo.pipelines.DemoPipeline': 300,
'demo.pipelines.QuotePipeline': 100
}
模块类名称<project_name>.pipelines.<Pipeline_name>,后为优先级,越小越优先。
小结:
中间件定义完要在settings文件内启用;
爬虫文件名和爬虫名称不能相同,spiders目录内不能存在相同爬虫名称的项目文件;
理解了scrapy的整个结构后,各部分的功能还是比较好理解的,复杂的场景还是用的上的,多学一点也没有坏处。
END
最后:
欢迎关注「Python新手快速入门」
每天5分钟,学习一个Python小Tip!助力你成为更优秀的Python学习者~