目录
前言
本教程适用于有python基础的人。
一、Scrapy是什么?
Scrapy 是用 Python 实现的一个为了爬取网站数据、提取结构性数据而编写的应用框架。
二、架构图
Scrapy架构图(绿线是数据流向)。
- Scrapy Engine(引擎): 负责Spider、ItemPipeline、Downloader、Scheduler中间的通讯,信号、数据传递等。
- Scheduler(调度器): 它负责接受引擎发送过来的Request请求,并按照一定的方式进行整理排列,入队,当引擎需要时,交还给引擎。
- Downloader(下载器):负责下载Scrapy Engine(引擎)发送的所有Requests请求,并将其获取到的Responses交还给Scrapy Engine(引擎),由引擎交给Spider来处理。
- Spider(爬虫):它负责处理所有Responses,从中分析提取数据,获取Item字段需要的数据,并将需要跟进的URL提交给引擎,再次进入Scheduler(调度器)。
- Item Pipeline(管道):它负责处理Spider中获取到的Item,并进行进行后期处理(详细分析、过滤、存储等)的地方。
- Downloader Middlewares(下载中间件):你可以当作是一个可以自定义扩展下载功能的组件。
- Spider Middlewares(Spider中间件):你可以理解为是一个可以自定扩展和操作引擎和Spider中间通信的功能组件(比如进入Spider的Responses和从Spider出去的Requests)。
三、安装
windows安装 ,通过 pip 安装 Scrapy 框架:
pip install Scrapy
Ubuntu安装,先安装非 Python 的依赖:
sudo apt-get install python-dev python-pip libxml2-dev libxslt1-dev zlib1g-dev libffi-dev libssl-dev
再通过 pip 安装 Scrapy 框架:
sudo pip install scrapy
安装后,只要在命令终端输入 scrapy,提示类似以下结果,代表已经安装成功。
四、使用scrapy
1.创建scrapy项目
进入一个目录,输入以下指令,即可创建一个新的scrapy项目:
scrapy startproject demo
其中,demo为项目名,创建后可以看到有一个以demo命名的文件夹,目录结构如下:
demo/
scrapy.cfg
demo/
__init__.py
items.py
pipelines.py
settings.py
spiders/
__init__.py
各个文件大致作用如下:
- scrapy.cfg: 项目的主配置信息(真正配置在settings.py文件中)。
- demo/: 项目的Python模块,将会从这里引用代码。
- demo/items.py: 项目的目标文件,设置数据存储模板,用于结构化数据。
- demo/pipelines.py: 项目的管道文件,数据的持久化处理。
- demo/settings.py: 项目的设置文件,如:递归的层数、并发数、延迟下载等。
- demo/spiders/: 存储爬虫代码目录,编写爬虫解析规则的地方。
2.新建一个爬虫程序
在刚才建立好的目录下,打开终端输入如下指令:
scrapy genspider titleSpider "www.baidu.com"
其中titleSpider为爬虫程序的名字,后面的"www.baidu.com"为爬虫程序的起始url地址。此时会在demo项目下的demo文件夹中的spider文件下,创建一个titleSpider.py程序,此程序就是我们的基本爬虫程序,且文件中自动生成了三个强制的属性和一个方法,此文件解析如下:
import scrapy
class TitleSpider(scrapy.Spider):
#这个爬虫的识别名称,必须是唯一的,在不同的爬虫必须定义不同的名字
name = 'titleSpider'
#搜索的域名范围,也就是爬虫的约束区域,规定爬虫只爬取这个域名下的网页,不存在的URL会被忽略
allowed_domains = ['www.baidu.com']
#爬取的URL列表。爬虫从这里开始抓取数据,所以,第一次下载的数据将会从这些urls开始。其他子URL将会从这些起始URL中继承性生成
start_urls = ['http://www.baidu.com/']
#解析的方法,每个初始URL完成下载后将被调用,调用的时候传入从每一个URL传回的Response对象来作为唯一参数
#主要作用:负责解析返回的网页数据(response.body),提取结构化数据(生成item)生成需要下一页的URL请求。
def parse(self, response):
pass
了解文件的作用后,我们做一些小修改,目的是让程序最简单的跑起来,看到初步的效果,以下修改后的作用为爬取百度网页的title:
import scrapy
class TitleSpider(scrapy.Spider):
name = 'titleSpider'
allowed_domains = ['www.baidu.com']
start_urls = ['http://www.baidu.com/']
def parse(self, response):
# 获取网站标题
context = response.xpath('/html/head/title/text()')
# 提取网站标题
title = context.extract_first()
print(title)
pass
同时我们要对settings.py文件做一些修改,否则看不到效果,约在20行:
ROBOTSTXT_OBEY = False #忽略或者不遵守robots协议
这里只是快速为了看到演示效果,平常使用时还是希望大家自觉遵守robots协议。
3.运行爬虫程序
有两种运行方式:
1.通过终端直接运行
在项目的目录打开终端,然后输入如下指令:
scrapy crawl titleSpider
其中titleSpider为刚才建立的爬虫程序名字,如果不想看到框架的日志打印,则使用下面的指令:
scrapy crawl titleSpider --nolog
2.使用IDE运行
在项目根目录下(与scrapy.cfg同级)创建一个py文件,如:start.py,然后在文件里写入如下指令:
from scrapy.cmdline import execute
# 本程序为爬虫起始入口,直接运行本程序即可运行爬虫
execute(['scrapy', 'crawl', 'titleSpider','--nolog'])
如此,每次我们通过IDE运行start.py文件即可让程序运行起来。
运行程序后看到如下打印即表示我们已经成功了运行了一个最简单的爬虫程序:
今天先写到这,后续再写加上item的使用和pipeline的数据持久化使用实例。