Scrapy框架已经自学了大半个月了,今天开始总结下这方面的笔记。这个框架在抓取静态页面上的数据,的确是非常强大。不仅是因为其天生异步,而且里面的逻辑性也非常紧密。没事看看其源码,会使得你对python语法有更深的认识。
Scrapy简介
Scrapy
是一个开源的爬虫框架,目前在Python爬虫领域基本处于一家独大的地位,只要说起Python的开源爬虫框架,那基本指的都是Scrapy
。在Scrapy
的官网上,则宣称的是Scrapy
是一个快速、简单、容易扩展的爬虫框架。Scrapy
确实是容易扩展的,通过各种管道(Pipeline)和中间件(Middleware),能够非常方便的扩展Scrapy
的功能。但其实相对来说,做一些简单的、抓取量小的任务时,Scrapy
是比较笨重的,这种任务更适合使用Requests
去做。
而如果你抓取的数据量较大的话,使用Scrapy
是非常合适的,因为底层是基于Twisted
,所以Scrapy
是天生异步的,就基本不用再去额外的考虑并发的问题了。同时它提供了对于爬虫来说非常全面的功能,而且扩展功能跟二次定制也很方便。配合类似于Scrapy-redis
之类的库也可以很简单的实现分布式的爬虫。
安装
本人使用的Ubuntu16.04,这里介绍下在Ubuntu下的安装。scrapy安装需要依赖其他的库,为了方便库管理,我新建了一个虚拟环境,并进入输入以下指令
sudo apt-get install python-dev python-pip libxml2-dev libxslt1-dev zlib1g-dev libffi-dev libssl-dev python3-dev
依赖库安装完成后,便可以通过pip安装scrapy
pip install scrapy
基础使用
- 新建项目
在我们要保存项目的目录下,执行下面命令来创建项目。项目名必填,项目目录默认会在当前目录下创建一个与项目名同名的目录。
scrapy startproject <项目名> [项目目录]
项目结构如下:
projectname/
scrapy.cfg # 部署的配置文件
projectname/ # 项目的Python模块,导入自己代码的话需要从这里导入
spiders/ # 一个将会存放你的爬虫的目录
__init__.py
__init__.py
items.py # 配置Item的文件
middlewares.py # 配置中间件的文件
pipelines.py # 配置管道的文件
settings.py # 项目的配置文件
- 启动爬虫
scrapy项目的启动必须使用命令行,不是单纯地在pycharm上运行。命令行如下:
scrapy crawl <name>
name是项目spider目录下自定义的,具有唯一标识性,在后面会谈及。
- 启动srapy shell
scrapy shell启动会默认加载项目,方便我们调式。推荐用pip下载个ipython,下载完成后,这个shell会默认去使用ipython。启动方式是在项目根目录下,运行下面命令:
scrapy shell <url>
上面的url可以是网址,也可以是本地文件的路径。进入shell后,还可以通过fetch(url)命令,更换url。
- 自动创建spiders下的文件
我们自定义的文件爬虫是在spiders目录下创建,当然我们可以通过命令行来创建:
scrapy genspider [-t template] <name> <domain>
name既是文件的名字,也是类里的name属性的值。domain参数是类里start_urls属性的值。
下面我们来创建以下,输入指令如:scrapy genspider demo "https:www.baidu.com" ,这时可以发现spiders目录下多了一个demo.py文件,如下图所示:
name就是我们启动文件所使用到的属性值。allowed_domains属性是运行发送请求的域名,start_urls是最先发送的请求地址。parse方法是必须的,用于解析请求返回的response,并返回item或request对象。
运作流程
Scrapy的运作流程由各个组件一起完成,它们各自相互配合,架构清晰。下面先分别介绍各个组件的功能。
组件
- Spider
爬虫,这个部分常常由我们自己编写,在Spider
中需要定义网页抓取和解析的所有流程和规则。
- Engine
引擎,整个爬虫系统的数据流程处理,都由Engine
来进行触发 ,是Scrapy
的核心。
- Scheduler
调度器,负责维护Request的队列,将Engine
传递过来的Request放入队列之中,并在Engine
请求时将一个Request交给Engine
。
- Item Pipeline
数据管道,负责处理在Spider
中得到的Item
。这个Pipeline
主要用处就是清洗数据,处理数据,存储数据。
- Downloader
下载器,根据接收到的Request,去下载相应的网页内容,并生成Response返回给Spider
。
- Item
数据,也就是在Spider
中抓取网页并解析后,我们最终要获得的数据结果,在Scrapy
中专门定义了这样一个数据结构用于保存抓取到的数据。格式和使用方式与字典类似。
- Spider Middleware
爬虫中间件,处于Spider
和Engine
之间。
- Downloader Middleware
下载器中间件,处于Downloader
与Engine
之间。
运作流程
Engine
首先会打开一个起始url,并找到相对应的Spider
来处理这个url访问返回的响应结果。- 在
Spider
的处理过程中,会将接下来要访问的url包装成Request,Engine
会将Request从Spider
取出,交给Scheduler
进行调度。 Engine
从Scheduler
获取一个Request。Engine
将获取到的Request经由下载器中间件(Downloader Middleware)发送给Downloader
进行下载并生成相应的Response。Engine
从Downloader
获取一个Response。Engine
将获取的Response经由爬虫中间件(Spider Middleware)发送给相对应的Spider
,由Spider
来对Response进行解析。在解析过程中,可能会产生两种产物,一种是Item
,一种是Request。产生的Request会再次沿着步骤1的流程运行下去,而产生的Item
则会进入下一步。Engine
从Spider
获取一个Item
。Engine
将获取的Item
发送给Item Pipeline
进行相对应的存储、清洗等处理。Item Pipeline
处理的过程中,同样可能会生成新的Request,这时候生成的Request会直接放入Scheduler
中,从步骤3再次执行下去。
下一篇笔记是Spider