Scrapy 框架
1、框架简介
Scrapy 框架是一个爬虫框架,提取结构性的数据。其可以应用在数据挖掘,信息处理等方面。提供了许多的爬虫的基类,帮我们更简便使用爬虫。基于Twisted
该框架是一个第三方的框架,许多功能已经被封装好(比如:下载功能)
1.1 Scrapy 框架构成
Scrapy 框架由五部分构成:
引擎、下载器、爬虫、调度器、管道(item和pipeline)
以上五部分我们只需要关系其中的两部分:爬虫和管道
- spiders:蜘蛛或爬虫,我们分析网页的地方,我们主要的代码写在这里
- 管道:包括item和pipeline,用于处理数据
- 引擎:用来处理整个系统的数据流,触发各种事务(框架的核心)
- 下载器:用于下载网页内容,并且返回给蜘蛛(下载器基于Twisted的高效异步模型)
- 调度器:用来接收引擎发过来的请求,压入队列中等处理任务
- 其他部分
1.2 Scrapy结构
一、核心部分:引擎、调度器、下载器
这些部分的代码在工程中是不体现的,这些部分的代码我们安装scrapy的那个目录下面
- 引擎:协调各个部件之间进行工作,并且驱动整个系统的工作
- 调度器:接收引擎的调度,把外界的url取出放在调度队列中进行调度
- 下载器:由调度器来调度下载器取下载指定的url内容
二、自定义部分:
- 爬虫:爬虫有两大功能,即提供给调度器起始url,对下载器的响应体进行处理
- 管道:爬虫分析完数据以后,会将这些数据放入管道,然后管道可以进行进一步的处理或者存储
三、组件部分:(主要用于扩展和自定义scrapy爬虫的功能)
- 中间件
- items文件
- 其他组件
【scrapy的运行流程】
1)从终端键入scrapy crawl xxx ,来驱动引擎开始工作
2)引擎首先加载scrapy运行的依赖包(如lxml、twisted等),加载完这些底层的依赖包以后,引擎就可以正常工作了
3)引擎加载settings文件,从中读取当前工程的配置信息,根据配置信息去进行后去工作
4)引擎加载扩展库,对当前的scrapy的功能进行扩展
5)加载下载中间件
6)加载爬虫中间件
7)加载管道组件
8)以上7步都是准备阶段,当准备阶段工作完成以后,爬虫就可以开启工作了;根据键入的指令中的xxx这个爬虫名字,我们来找到对应的爬虫类,把这个爬虫类初始化
9)引擎从爬虫对象中的start_urls属性中提取出起始url,然后检测是否在allowed_domains中,如果在则将这个url加入到调度器的调度队列中,否则直接忽略
10)调度器对调度队列中的url进行出队,然后以异步的方式创建下载器对象进下载(如果下载器开启的个数超过了最大并发数,则后面的url就需要等待)
11)下载器将url请求(请求的过程需要经过n层下载中间件的过滤),并且获得响应,然后通过回调将响应数据传递给爬虫对象,有爬虫对象对这个响应数据进行处理
12)爬虫将解析的数据用可迭代的容器返回到引擎中,由引擎迭代
13)如果管道已经开启,引擎会按照管道的优先级次序将每次迭代数据依次进入到管道中,由管道进行处理
14)管道处理结束以后,如果最后一个管道将数据返回给引擎则数据就会由引擎销毁,否则数据就会直接在最后一个管道中销毁
15)引擎关闭并且将系统工作情况输出
2、Scrapy 框架安装
首先安装依赖库Twisted,用pip安装或用pip3
pip install twisted
一般安装失败是因为网络延迟
可以使用国内的镜像源安装
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple twisted
如果用pip安装失败
在这个网址 http://www.lfd.uci.edu/~gohlke/pythonlibs#twisted 下面去寻找符合你的python版本和系统版本的Twisted
然后将依赖包放在指定的目录下,记住这个路径
【注意】路径名不能有中文,不能用管理员进入cmd,电脑系统用户路径不能是中文,否则可能导致安装失败
然后再安装scrapy框架
pip install scrapy
同样,如果安装失败,重复上面类似的安装步骤
路径名不能有中文,如果安装失败,可以选择用虚拟机的Linux
3、用Scrapy 框架创建项目
3.1 用Scrapy 框架创建第一个项目
项目的创建和django类似
用黑屏终端创建项目,先进入项目放置的路径
指令:scrapy startproject 项目名
使用pycharm打开这个项目,项目中有一些已经创建好的文件
项目创建后,这是一个空工程,里面是没有爬虫的,我们需要通过指令来创建一个爬虫,比如爬取糗事百科
在pycharm的Terminal终端输入命令:
scrapy genspider myspider qiushibaike.com
scrapy genspider +爬虫名+网站域名(www后开始的才是域名)
项目目录结构
MyfirstPro
MyfirstPro
spiders 爬虫目录(写代码位置)
__init__.py
myspider.py 爬虫文件,以后的爬虫代码写在这里
__init__.py
items.py 定义数据结构地方
middlewares.py 中间件
pipelines.py 管道文件
settings.py 项目配置文件
scrapy.cfg scrapy配置文件(不用管,但千万别删)
整个项目的基本结构就是如此
创建一个爬虫,爬虫名字叫 budejie 用scrapy框架去爬取百思不得姐这个网站,网站域名为 budejie.com
所以创建这个爬虫的命令为
scrapy genspider budejie budejie.com
3.2 项目流程与内容
首先看一下爬虫文件,此时还没有在此文件中写任何内容,简单介绍一下该文件中的内容
budejie .py
# -*- coding: utf-8 -*-
import scrapy
class BudejieSpider(scrapy.Spider):
# 这个类是Spider的派生类,是一个基础模板的爬虫
# 这个类的作用:
# 1)引擎被启动以后,在开启调度之前首先要从这个类的对象中提取起始url
# 2)下载器下载完成以后,会通过一个回调方法把响应对象传递给这个类对象来进行下一步的解析
name = 'budejie'
# name属性是爬虫的名字,这个爬虫在当前工程中的唯一标识,我们在启动引擎的时候,需要将爬虫名字加在后面,
# 以告诉引擎当前我们使用是哪个爬虫,引擎就会根据爬虫的名字取相应的对象中提取起始url,并且调度下载,然后还要根据爬虫名字将数据回调
allowed_domains = ['budejie.com']
# 允许访问的域名,引擎在从start_urls中提取了url之后,要对比提取的url是否在allowed_domains中,
# 如果在则允许调度,如果不在直接剔除
start_urls = ['http://budejie.com/']
# 这个列表用于给引擎提供起始url
# 这个函数是一个回调函数,下载器下载完数据以后就会回调这个函数,把下载下来的响应内容同参数response传递过来
def parse(self, response):
pass
用一下parse函数,把pass去掉,修改为 print(response) ,打印一下response
在pycharm的Terminal终端输入命令
scrapy crawl budejie
该命令的含义是:驱动引擎,通过的 name = ‘budejie’ 让引擎找到这个爬虫文件
命令运行后在终端打印了一大推的日志(这个不是response的内容,response的内容只有一点)
如果能将此日志弄明白,scrapy的运行原理就很好理解了
- 首先,通过scrapy crawl budejie这个命令,找到了budejie这个爬虫,用它驱动了scrapy引擎底层的一些活动,引擎驱动以后,打印了日志
- Scrapy 1.6.0 started 表示Scrapy 1.6.0的引擎驱动了,然后加载底层的驱动工具
- 引擎加载settings文件,从中读取当前工程的配置信息,根据配置信息去进行后去工作
查看一下setting .py 配置文件里的内容,这时候很多都还是注释的状态,后面根据项目需手动去配置
这个文件中的内容需要重点掌握,爬虫的配置相关
setting .py
# -*- coding: utf-8 -*-
# Scrapy settings for MyfirstPro project
#
# For simplicity, this file contains only settings considered important or
# commonly used. You can find more settings consulting the documentation:
#
# https://doc.scrapy.org/en/latest/topics/settings.html
# https://doc.scrapy.org/en/latest/topics/downloader-middleware.html
# https://doc.scrapy.org/en/latest/topics/spider-middleware.html
# settings文件:用于整个工程的所有配置信息的设置
# scrapy工程运行起来以后,首先读取这个settings文件
BOT_NAME = 'MyfirstPro' # 工程名
SPIDER_MODULES = ['MyfirstPro.spiders']
# 爬虫模板,默认爬虫模板在当前工程目录的spiders子目录中
NEWSPIDER_MODULE = 'MyfirstPro.spiders'
# 新建的爬虫模板,默认在当前工程目的spiders子目录下面
# spiders子目录里面用于定义一系列的爬虫文件
# Crawl responsibly by identifying yourself (and your website) on the user-agent
#USER_AGENT = 'MyfirstPro (+http://www.yourdomain.com)' # 配置用户代理
# Obey robots.txt rules
ROBOTSTXT_OBEY = True #是否遵从robot.txt协议,默认遵守
# Configure maximum concurrent requests performed by Scrapy (default: 16)
# 最大的请求并发数,默认是16个
#CONCURRENT_REQUESTS = 32
# Configure a delay for requests for the same website (default: 0)
# See https://doc.scrapy.org/en/latest/topics/settings.html#download-delay
# See also autothrottle settings and docs
#DOWNLOAD_DELAY = 3 # 下载时延
# The download delay setting will honor only one of:
#CONCURRENT_REQUESTS_PER_DOMAIN = 16
#CONCURRENT_REQUESTS_PER_IP = 16
# Disable cookies (enabled by default)
#COOKIES_ENABLED = False # 是否开启cookie处理,默认是开启的
# Disable Telnet Console (enabled by default)
#TELNETCONSOLE_ENABLED = False
# Override the default request headers:
#DEFAULT_REQUEST_HEADERS = {
# 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
# 'Accept-Language': 'en',
#}
# Enable or disable spider middlewares
# See https://doc.scrapy.org/en/latest/topics/spider-middleware.html
# 爬虫中间件
#SPIDER_MIDDLEWARES = {
# 'MyfirstPro.middlewares.MyfirstproSpiderMiddleware': 543,
#}
# Enable or disable downloader middlewares
# See https://doc.scrapy.org/en/latest/topics/downloader-middleware.html
# 下载中间件
#DOWNLOADER_MIDDLEWARES = {
# 'MyfirstPro.middlewares.MyfirstproDownloaderMiddleware': 543,
#}
# Enable or disable extensions
# See https://doc.scrapy.org/en/latest/topics/extensions.html
# 扩展库(文件)
#EXTENSIONS = {
# 'scrapy.extensions.telnet.TelnetConsole': None,
#}
# Configure item pipelines
# See https://doc.scrapy.org/en/latest/topics/item-pipeline.html
# 管道
#ITEM_PIPELINES = {
# 'MyfirstPro.pipelines.MyfirstproPipeline': 300,
# 管道组件可以设置多个,所以管道组件(ITEM_PIPELINES)需要用一个字典来表示
# 字典的键代表组件位置,字典的值代表这个位置的组件的优先级,数组越小优先级越高,
# 数据先从优先级高的组件经过,然后向优先级低组件传递
#}
# Enable and configure the AutoThrottle extension (disabled by default)
# See https://doc.scrapy.org/en/latest/topics/autothrottle.html
#AUTOTHROTTLE_ENABLED = True
# The initial download delay
#AUTOTHROTTLE_START_DELAY = 5
# The maximum download delay to be set in case of high latencies
#AUTOTHROTTLE_MAX_DELAY = 60
# The average number of requests Scrapy should be sending in parallel to
# each remote server
#AUTOTHROTTLE_TARGET_CONCURRENCY = 1.0
# Enable showing throttling stats for every response received:
#AUTOTHROTTLE_DEBUG = False
# Enable and configure HTTP caching (disabled by default)
# See https://doc.scrapy.org/en/latest/topics/downloader-middleware.html#httpcache-middleware-settings
#HTTPCACHE_ENABLED = True
#HTTPCACHE_EXPIRATION_SECS = 0
#HTTPCACHE_DIR = 'httpcache'
#HTTPCACHE_IGNORE_HTTP_CODES = []
#HTTPCACHE_STORAGE = 'scrapy.extensions.httpcache.FilesystemCacheStorage'
- 引擎加载扩展库,对当前的scrapy的功能进行扩展
这个扩展文件可以在lib文件夹中找到
这个扩展文件的作用是对引擎的内容做支撑的,简单了解就行
这些是一些中间件的信息,了解就行,不用深究
-
加载下载中间件
这个后面会深入解析,中间件下载的过程中经过的处理文件 -
加载爬虫中间件
-
加载管道组件
现在为空 -
以上7步都是准备阶段,当准备阶段工作完成以后,爬虫就可以开启工作了;根据键入的指令中的xxx这个爬虫名字,我们来找到对应的爬虫类,把这个爬虫类初始化,接下来引擎去爬虫类里提取内容
在爬取之前,访问了robot协议,然后通过调度器调度,下载器下载,通过budejie .py的回调函数,
返回了print(response)的内容,然后爬虫关闭,因为这里没用让爬虫文件做过多内容,只是打印了response的内容而已,爬虫关闭的原因是结束
然后返回了一些状态信息,爬虫结束的一些信息