vlambda博客
学习文章列表

大名鼎鼎的爬虫框架: Scrapy!


说到爬虫框架,就一定得提提scrapy这个明星框架了,目前Python中最受欢迎的爬虫框架之一,简单、方便、易上手。


大名鼎鼎的爬虫框架: Scrapy!



1 Scrapy基本简介



Scrapy是python开发的一个快速、高层次、轻量级的屏幕抓取和web抓取的python爬虫框架,主要用于抓取特定web站点的信息并从中提取特定结构的数据。



大名鼎鼎的爬虫框架: Scrapy!


它的应用领域很多,比如网络爬虫开发、数据挖掘、数据监测。自动化测试等。


scrapy吸引人的一点在于它是一个框架,但任何人都可以根据需求方便的修改,也提供了多种类型爬虫的基类,如BaseSpider、sitemap爬虫等。



大名鼎鼎的爬虫框架: Scrapy!
功 能
大名鼎鼎的爬虫框架: Scrapy!


  • 高性能的持久化存储

  • 异步的数据下载

  • 高性能的数据解析

  • 分布式


大名鼎鼎的爬虫框架: Scrapy!
优 点
大名鼎鼎的爬虫框架: Scrapy!


  • Scrapy很容易扩展,快速和功能强大。

  • 这是一个跨平台应用程序框架(在Windows,Linux,Mac OS和BSD)。

  • Scrapy请求调度和异步处理。

  • Scrapy附带了一个名为Scrapyd的内置服务,它允许使用JSON Web服务上传项目和控制蜘蛛。

  • 能够刮削任何网站,即使该网站不具有原始数据访问API。



2 Scrapy基本使用



大名鼎鼎的爬虫框架: Scrapy!
安 装
大名鼎鼎的爬虫框架: 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
4error: 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。


大名鼎鼎的爬虫框架: Scrapy!



4 运行流程



  1. 引擎从调度器中取出一个URL链接(url)用来接下来的爬取;


  2. 引擎把URL封装成一个Request请求传给下载器,下载器把资源下下来,并封装成应答包Response;


  3. 爬虫解析Response;


  4. 若是解析出实体(Item),则交给实体管道(pipelines)进行进一步的处理;


  5. 若是解析出的是链接(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,用于调度

大名鼎鼎的爬虫框架: Scrapy!

路径二:


  • Engine从Scheduler处获得下一个要爬取的请求;

  • Engine将爬取请求Requests发送给Downloader;

  • 爬取网页之后,Downloader进行下载,形成相应的Response对象,通过中间件发给Engine;

  • Engine将收到的响应通过中间件发送给Spider处理;


大名鼎鼎的爬虫框架: Scrapy!


路径三:


  • Spider处理响应后产生爬取项Item和新的爬取请求Requests给Engine;

  • Engine将爬取项发送给Item Pipeline进行整理;

  • Engine将爬取请求发送给Scheduler进行下一次调度;


大名鼎鼎的爬虫框架: Scrapy!


综上:用户只需要将自己的爬取请求输入到对应的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选项可以获得。


大名鼎鼎的爬虫框架: Scrapy!



Pipeline流水线处理模块



Pipelines流水线处理模块由多个Pipeline类组成,一个Pipeline处理模块包含三个方法/函数


大名鼎鼎的爬虫框架: Scrapy!


其中,process_item函数一般将得到的item返回,方便其他流水线处理模块处理。


流水线处理模块需要在settings.py工程配置文件中注册并设置优先级,为字典格式,格式样例:


ITEM_PIPELINES = { 'demo.pipelines.DemoPipeline': 300, 'demo.pipelines.QuotePipeline': 100}


模块类名称<project_name>.pipelines.<Pipeline_name>,后为优先级,越小越优先。


小结:


中间件定义完要在settings文件内启用;


爬虫文件名和爬虫名称不能相同,spiders目录内不能存在相同爬虫名称的项目文件;


理解了scrapy的整个结构后,各部分的功能还是比较好理解的,复杂的场景还是用的上的,多学一点也没有坏处。



大名鼎鼎的爬虫框架: Scrapy!

END



最后:


大名鼎鼎的爬虫框架: Scrapy!


欢迎关注「Python新手快速入门


每天5分钟,学习一个Python小Tip!助力你成为更优秀的Python学习者~