本文地址:https://www.jianshu.com/p/4cccd00072f8
图标.png
简介
Scrapy
是一个开源的爬虫框架,目前在Python爬虫领域基本处于一家独大的地位,只要说起Python的开源爬虫框架,那基本指的都是Scrapy
。
在Scrapy
的官网上,则宣称的是Scrapy
是一个快速、简单、容易扩展的爬虫框架。Scrapy
确实是容易扩展的,通过各种管道(Pipeline)和中间件(Middleware),能够非常方便的扩展Scrapy
的功能。但其实相对来说,做一些简单的、抓取量小的任务时,Scrapy
是比较笨重的,这种任务更适合使用Requests
去做。
而如果你抓取的数据量较大的话,使用Scrapy
是非常合适的,因为底层是基于Twisted
,所以Scrapy
是天生异步的,就基本不用再去额外的考虑并发的问题了。同时它提供了对于爬虫来说非常全面的功能,而且扩展功能跟二次定制也很方便。配合类似于Scrapy-redis
之类的库也可以很简单的实现分布式的爬虫。
安装
在Linux以及Mac系统上,安装Scrapy
非常方便,使用pip安装即可:
pip install Scrapy
但是如果在windows系统上安装的话,会遇到一个非常麻烦的问题,Scrapy
的依赖库Twisted
安装不上,会导致安装失败。这个问题可以用以下办法解决。
到下面这个网址去下载
Twisted
已经编译好的wheel文件安装,安装好后再使用pip安装Scrapy
。https://www.lfd.uci.edu/~gohlke/pythonlibs/
wheel文件的安装方法请自行百度。
架构
Scrapy
的整体运行流程如下图所示:
架构图.png
组件
Scrapy
的很大一个优点就是其组织架构清晰,整体结构由一个个组件构成,每个组件负责各自的功能。
其主要的运行流程中有如下几个最主要的组件:
Engine
引擎,整个爬虫系统的数据流程处理,都由
Engine
来进行触发 ,是Scrapy
的核心。Scheduler
调度器,负责维护Request的队列,将
Engine
传递过来的Request放入队列之中,并在Engine
请求时将一个Request交给Engine
。Downloader
下载器,根据接收到的Request,去下载相应的网页内容,并生成Response返回给
Spider
。Spider
爬虫,这个部分常常由我们自己编写,在
Spider
中需要定义网页抓取和解析的所有流程和规则。Item
数据,也就是在
Spider
中抓取网页并解析后,我们最终要获得的数据结果,在Scrapy
中专门定义了这样一个数据结构用于保存抓取到的数据。格式和使用方式与字典类似。Item Pipeline
数据管道,负责处理在
Spider
中得到的Item
。这个Pipeline
主要用处就是清洗数据,处理数据,存储数据。Downloader Middleware
下载器中间件,处于
Downloader
与Engine
之间。Spider Middleware
爬虫中间件,处于
Spider
和Engine
之间。
数据流
在Scrapy
中,数据流基本由Engine
控制,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再次执行下去。
使用方式
Scrapy
的主要使用方式是命令行,例如,开始一个Scrapy
爬虫的第一步是创建一个Scrapy
项目,而这一步需要使用命令行来完成,在命令行中输入以下命令:
scrapy startproject projectname
projectname
则是你创建的项目的名称,命令执行之后会在当前目录下生成一个如下结构的目录:
projectname/
scrapy.cfg # 部署的配置文件
projectname/ # 项目的Python模块,导入自己代码的话需要从这里导入
spiders/ # 一个将会存放你的爬虫的目录
__init__.py
__init__.py
items.py # 配置Item的文件
middlewares.py # 配置中间件的文件
pipelines.py # 配置管道的文件
settings.py # 项目的配置文件
这个目录相当于是一个Scrapy
给你定制好的模板,节省了我们许多的时间,我们只需要按照Scrapy
的规则在相应的文件中编写代码,就可以很快速的完成一个爬虫项目。
在创建好了项目后,就要开始编写爬虫了,同样的,Scrapy
提供了一个命令,能让我们快速的生成一个Spider
模板放到spiders
目录中,cd到项目目录中,输入以下命令:
scrapy genspider spidername mydomain.com
spidername
指的是你创建的Spider
名称,mydomain.com
则是你这个爬虫抓取目标的域名。
命令执行后会在spiders
目录下生成一个如下的spidername.py
文件:
# -*- coding: utf-8 -*-
import scrapy
class SpidernameSpider(scrapy.Spider):
name = 'spidername'
allowed_domains = ['mydomain.com']
start_urls = ['http://mydomain.com/']
def parse(self, response):
pass
这就是一个标准的Spider
模板了,具体如何在这个模版中编写Spider
,在之后的文章中会详细讲到。
在写好Spider
之后,就可以使用命令来运行这个Spider
了:
scrapy crawl spidername
从这里开始,你的爬虫就可以欢快的开始运行了。
系列文章: