Scrapy入门到放弃03:理解settings配置,监控scrapy引擎|8月更文挑战

简介: Scrapy入门到放弃03:理解settings配置,监控scrapy引擎|8月更文挑战

前言

代码未动,配置先行。本篇文章主要讲述一下Scrapy中的配置文件settings.py的参数含义,以及如何去获取一个爬虫程序的运行性能指标。

这篇文章无聊的一匹,没有代码,都是配置化的东西,但是呢不学还不行,属于Scrapy的枢纽,很关键。所以还请各位看官老爷耐得住这一章的寂寞。

settings.py

在我们创建一个Scrapy项目的时候,就会在项目下生成四个py文件,其中就有一个settings.py。其中大大小小配置也是有大几十个,这里只讲一些比较常见的,其他的还请移步官方文档。

官文配置参数说明url:

docs.scrapy.org/en/latest/t…

常见参数

下面也罗列了小几十个配置,大部分都其实使用默认值即可,最值得我们关注的,就是下面几个:

  1. DOWNLOAD_DELAY
  2. CONCURRENT_REQUESTS
  3. CONCURRENT_REQUESTS_PER_DOMAIN
  4. CONCURRENT_REQUESTS_PER_IP
  5. SPIDER_MIDDLEWARES
  6. DOWNLOADER_MIDDLEWARES
  7. ITEM_PIPELINES

那么,为什么说Settings是Scrapy的枢纽?

image.png

还记得我上篇文章画的架构图吗?还记得之前说过Scrapy的四大模块吗?每个模块在项目初始化时都是独立的,各个模块只有在Settings配置之后,请求、响应、数据才会在模块间流转。这一部分对应上面提到的配置5、6、7。

配置具体说明,详看下文:

# Scrapy settings for ScrapyDemo project
# 自动生成的配置,无需关注,不用修改
BOT_NAME = 'ScrapyDemo'
SPIDER_MODULES = ['ScrapyDemo.spiders']
NEWSPIDER_MODULE = 'ScrapyDemo.spiders'
# 设置UA,但不常用,一般都是在MiddleWare中添加
USER_AGENT = 'ScrapyDemo (+http://www.yourdomain.com)'
# 遵循robots.txt中的爬虫规则,很多人喜欢False,当然我也喜欢....
ROBOTSTXT_OBEY = True
# 对网站并发请求总数,默认16
CONCURRENT_REQUESTS = 32
# 相同网站两个请求之间的间隔时间,默认是0s。相当于time.sleep()
DOWNLOAD_DELAY = 3
# 下面两个配置二选一,但其值不能大于CONCURRENT_REQUESTS,默认启用PER_DOMAIN
# 对网站每个域名的最大并发请求,默认8
CONCURRENT_REQUESTS_PER_DOMAIN = 16
# 默认0,对网站每个IP的最大并发请求,会覆盖上面PER_DOMAIN配置,
# 同时DOWNLOAD_DELAY也成了相同IP两个请求间的间隔了
CONCURRENT_REQUESTS_PER_IP = 16
# 禁用cookie,默认是True,启用
COOKIES_ENABLED = False
# 请求头设置,这里基本上不用
DEFAULT_REQUEST_HEADERS = {
#   'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
#   'Accept-Language': 'en',
#}
# 配置启用Spider MiddleWares,Key是class,Value是优先级
SPIDER_MIDDLEWARES = {
    'ScrapyDemo.middlewares.ScrapydemoSpiderMiddleware': 543,
}
# 配置启用Downloader MiddleWares
DOWNLOADER_MIDDLEWARES = {
    'ScrapyDemo.middlewares.ScrapydemoDownloaderMiddleware': 543,
}
# 配置并启用扩展,主要是一些状态监控
EXTENSIONS = {
    'scrapy.extensions.telnet.TelnetConsole': None,
}
# 配置启用Pipeline用来持久化数据
ITEM_PIPELINES = {
   'ScrapyDemo.pipelines.ScrapydemoPipeline': 300,
}
# 禁止控制台使用telnet连接scrapy获取状态,默认是启用。我们使用默认值即可
TELNETCONSOLE_ENABLED = False
# Telnet终端使用的端口范围。默认: [6023, 6073],如果设置为 None 或 0 , 则使用动态分配的端口
# TELNETCONSOLE_PORT
# telnet账号,默认:scrapy
TELNETCONSOLE_USERNAME = None
# telnet密码:默认会自动生成一个密码
TELNETCONSOLE_PASSWORD
# Telnet终端监听的接口(interface)。默认: '127.0.0.1'
TELNETCONSOLE_HOST = '127.0.0.1'
# AutoThrottle是限速节流算法
# 让爬虫程序自适应download_delay和concurrent并发
AUTOTHROTTLE_ENABLED = True
# 爬虫程序启动时,开始对网站发起请求的延迟
AUTOTHROTTLE_START_DELAY = 5
# 请求到响应的最大允许的延迟时间,必须大于download_delay
AUTOTHROTTLE_MAX_DELAY = 60
# 并行发送到每个远程服务器的平均请求数,小于CONCURRENT_REQUESTS_PER_DOMAIN和CONCURRENT_REQUESTS_PER_IP
AUTOTHROTTLE_TARGET_CONCURRENCY = 1.0
# 为每个响应启用显示限制统计信息
AUTOTHROTTLE_DEBUG = False
# HttpCache主要是将每次的请求和响应缓存到本地,可以离线进行处理
# 配置启用HTTP Cache,默认不启用
HTTPCACHE_ENABLED = True
# 缓存的过期时间,0为永不过期
HTTPCACHE_EXPIRATION_SECS = 0
# 缓存目录名称
HTTPCACHE_DIR = 'httpcache'
# 设置不需要缓存的状态码请求
HTTPCACHE_IGNORE_HTTP_CODES = []
# 此类将缓存保存到本地文件系统,还可以使用其他类保存到数据库
HTTPCACHE_STORAGE = 'scrapy.extensions.httpcache.FilesystemCacheStorage'

像上面的Telnet配置使用默认即可,一般AutoThrottle限速算法和Http Cache用的也少,当然还有一些log日志、retry请求重试功能,这里就不一一列举了。

局部配置定义

settings.py中的配置,属于全局配置,是项目中所有爬虫共享的。改了一个,其他的爬虫也会受影响。

所以很多时候我们都会在爬虫程序内,定义字典类型的custom_settings成员变量,来实现局部配置。

custom_settings = {
        'DOWNLOAD_DELAY': 10
    }

这样DOWNLOAD_DELAY为10这个配置,只在当前程序中生效。

那这局部配置在什么时候用的多?

我用的最多的地方,就是使用Scrapy-Splash插件的时候,因为要发起的是SplashRequest,而不是之前的Request,所以要进行单独的配置。为了不改变全局配置、影响其他爬虫,通常在程序内定义这些配置。 image.png

这个后面Scrapy-Splash插件会讲。

启动时配置

我们在启动爬虫时,可以使用-s来指定配置。

scrapy crawl [spiderName] -s DOWNLOAD_DELAY=10

程序中获取配置

我们通常也将数据库的用户、密码、ip等信息配置在settings中,然后通过crawler对象来获取。该对象提供对所有Scrapy核心组件的访问,可以debug看一下。

image.png

如图,可以通过crawler访问到settings配置、engine引擎、信号量signals、状态stat等。这里我们先只关注settings。

这里写一段代码,验证局部配置、启动时配置、以及配置三个功能。

import scrapy
class DouLuoDaLuSpider(scrapy.Spider):
    name = 'DouLuoDaLu'
    allowed_domains = ['v.qq.com']
    start_urls = ['https://v.qq.com/detail/m/m441e3rjq9kwpsc.html']
    # 自定义配置
    custom_settings = {
        'DOWNLOAD_DELAY': 10
    }
    def parse(self, response):
        # 获取配置
        delay = self.crawler.settings.get('DOWNLOAD_DELAY')
        print(delay)

DOWNLOAD_DELAY在全局配置中我修改为3,如果没有在程序中定义custom_settings,则输出为3。

当我们定义custom_settings之后,启动程序,输出如下: image.png

这里输出的就是10,是程序内的配置,覆盖了全局配置。当我们使用以下命令在启动爬虫时指定延迟为11。

scrapy crawl DouLuoDaLu -s DOWNLOAD_DELAY=11

image.png

则输出为11,覆盖了程序内变量。所以,我们也得出一个结论,同一配置的优先级为:

启动时配置 > 程序内配置 > 全局配置

引擎状态监控

关于引擎的定义:

Scrapy engine which controls the Scheduler, Downloader and Spiders

引擎状态是指现在调度器中有多少请求排队、下载器中有多少个请求正在下载、有多少响应在被处理等等,而监控是通过telnet来实现。

我的Scrapy中全局配置都是默认的,为了直观,我这里都使用局部配置。这里我发起100 * 10次请求,模拟一个一直运行的爬虫,代码如下:

import scrapy
from scrapy import Request
class DouLuoDaLuSpider(scrapy.Spider):
    name = 'DouLuoDaLu'
    allowed_domains = ['v.qq.com']
    start_urls = ['https://v.qq.com/detail/m/m441e3rjq9kwpsc.html']
    custom_settings = {
        'DOWNLOAD_DELAY': 6,
        'CONCURRENT_REQUESTS': 32,
        'CONCURRENT_REQUESTS_PER_DOMAIN': 8,
        # 账号默认就是scrapy
        # 'TELNETCONSOLE_USERNAME' = 'scrapy'
        'TELNETCONSOLE_PASSWORD': 'scrapy'
    }
    def start_requests(self):
        for i in range(0, 100):
            yield Request(url=self.start_urls[0], callback=self.parse, dont_filter=True)
    def parse(self, response):
        for i in range(0, 10):
            yield Request(url=self.start_urls[0], callback=self.parse, dont_filter=True)

启动爬虫之后,使用以下命令进入telnet。

# telnet终端监听端口配置为*TELNETCONSOLE_PORT*,默认为6023。
telnet localhost 6023

输入账号和密码: image.png

进入交互页面,输入est(),输出引擎状态指标。

image.png

主要监控一下五个指标:

  1. engine.downloader.active:下载器中等待下载的请求,对应最大并发数。设置中为32,这里也是32,说明下载器已经满了,其他请求进不来了。
  2. engine.slot.scheduler.mqs:内存调度队列。进不去下载器的请求就只能在调度器中等待了,这里有28个请求在等待。
  3. engine.slot.scheduler.dqs:磁盘调度队列,可以设置,将请求放于磁盘之中。
  4. engine.scraper.slot.active:正在被处理的响应数量
  5. engine.scraper.slot.itemproc_size:pipeline处理的Item数量

同时也可以在交互命令中暂停、恢复、停止引擎。

engine.pause()
engine.unpause()
engine.stop()

当引擎被暂停或停止,下载器处理完队列中的请求之后,便处于空闲状态。

结语

本篇文章主要讲了一些基本的配置和Telnet引擎监控,主要目的还是为了将Scrapy架构掰扯清楚,后面用的时候才能了然于胸。

后面的文章接着写其他模块,下一篇讲MiddleWare中间件,下下篇就是Pipeline,下下下篇打算写一个完整的样例,将各个模块整合起来。期待下一次相遇。

公众号:入门到放弃之路,期待您的关注。


相关文章
|
2天前
|
存储 缓存 关系型数据库
MySQL事务日志-Redo Log工作原理分析
事务的隔离性和原子性分别通过锁和事务日志实现,而持久性则依赖于事务日志中的`Redo Log`。在MySQL中,`Redo Log`确保已提交事务的数据能持久保存,即使系统崩溃也能通过重做日志恢复数据。其工作原理是记录数据在内存中的更改,待事务提交时写入磁盘。此外,`Redo Log`采用简单的物理日志格式和高效的顺序IO,确保快速提交。通过不同的落盘策略,可在性能和安全性之间做出权衡。
1517 4
|
29天前
|
弹性计算 人工智能 架构师
阿里云携手Altair共拓云上工业仿真新机遇
2024年9月12日,「2024 Altair 技术大会杭州站」成功召开,阿里云弹性计算产品运营与生态负责人何川,与Altair中国技术总监赵阳在会上联合发布了最新的“云上CAE一体机”。
阿里云携手Altair共拓云上工业仿真新机遇
|
5天前
|
人工智能 Rust Java
10月更文挑战赛火热启动,坚持热爱坚持创作!
开发者社区10月更文挑战,寻找热爱技术内容创作的你,欢迎来创作!
501 19
|
2天前
|
存储 SQL 关系型数据库
彻底搞懂InnoDB的MVCC多版本并发控制
本文详细介绍了InnoDB存储引擎中的两种并发控制方法:MVCC(多版本并发控制)和LBCC(基于锁的并发控制)。MVCC通过记录版本信息和使用快照读取机制,实现了高并发下的读写操作,而LBCC则通过加锁机制控制并发访问。文章深入探讨了MVCC的工作原理,包括插入、删除、修改流程及查询过程中的快照读取机制。通过多个案例演示了不同隔离级别下MVCC的具体表现,并解释了事务ID的分配和管理方式。最后,对比了四种隔离级别的性能特点,帮助读者理解如何根据具体需求选择合适的隔离级别以优化数据库性能。
179 1
|
8天前
|
JSON 自然语言处理 数据管理
阿里云百炼产品月刊【2024年9月】
阿里云百炼产品月刊【2024年9月】,涵盖本月产品和功能发布、活动,应用实践等内容,帮助您快速了解阿里云百炼产品的最新动态。
阿里云百炼产品月刊【2024年9月】
|
21天前
|
存储 关系型数据库 分布式数据库
GraphRAG:基于PolarDB+通义千问+LangChain的知识图谱+大模型最佳实践
本文介绍了如何使用PolarDB、通义千问和LangChain搭建GraphRAG系统,结合知识图谱和向量检索提升问答质量。通过实例展示了单独使用向量检索和图检索的局限性,并通过图+向量联合搜索增强了问答准确性。PolarDB支持AGE图引擎和pgvector插件,实现图数据和向量数据的统一存储与检索,提升了RAG系统的性能和效果。
|
9天前
|
Linux 虚拟化 开发者
一键将CentOs的yum源更换为国内阿里yum源
一键将CentOs的yum源更换为国内阿里yum源
451 5
|
7天前
|
存储 人工智能 搜索推荐
数据治理,是时候打破刻板印象了
瓴羊智能数据建设与治理产品Datapin全面升级,可演进扩展的数据架构体系为企业数据治理预留发展空间,推出敏捷版用以解决企业数据量不大但需构建数据的场景问题,基于大模型打造的DataAgent更是为企业用好数据资产提供了便利。
314 2
|
23天前
|
人工智能 IDE 程序员
期盼已久!通义灵码 AI 程序员开启邀测,全流程开发仅用几分钟
在云栖大会上,阿里云云原生应用平台负责人丁宇宣布,「通义灵码」完成全面升级,并正式发布 AI 程序员。
|
25天前
|
机器学习/深度学习 算法 大数据
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
2024“华为杯”数学建模竞赛,对ABCDEF每个题进行详细的分析,涵盖风电场功率优化、WLAN网络吞吐量、磁性元件损耗建模、地理环境问题、高速公路应急车道启用和X射线脉冲星建模等多领域问题,解析了问题类型、专业和技能的需要。
2608 22
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析