【Scrapy 框架】「版本2.4.0源码」设置(Settings) 详解篇

全部源码解析文章索引目录传送门

【Scrapy 框架】版本 2.4.0 源码篇:全部配置目录索引

内容介绍

解析Scrapy框架下settings配置文件的说明。

优先级设置(降序)

使用不同的机制填充设置,优先级从高到低排列的列表

  1. 命令行选项
    使用-s(或–set)命令行选项显式覆盖一个(或多个)设置。
scrapy crawl myspider -s LOG_FILE=scrapy.log
  1. 每个spider设置
class MySpider(scrapy.Spider):
    name = 'myspider'

    custom_settings = {
    
    
        'SOME_SETTING': 'some value',
    }
  1. 项目设置模块
    项目设置模块是Scrapy项目的标准配置文件,将在其中填充大多数自定义设置。对于标准的Scrapy项目,这意味着您将settings.py在为项目创建的文件中添加或更改设置。

  2. 每个命令的默认设置
    每个Scrapy工具命令可以具有其自己的默认设置,这些默认设置将覆盖全局默认设置。这些自定义命令设置default_settings在命令类的属性中指定。

  3. 默认全局设置
    全局默认值位于scrapy.settings.default_settings 模块中。

导入路径和类

2.4.0新功能,设置引用要由Scrapy导入的可调用对象

from mybot.pipelines.validate import ValidateMyItem
ITEM_PIPELINES = {
    
    
    # 通过 类名...
    ValidateMyItem: 300,
    # ...等于通过类的路径
    'mybot.pipelines.validate.ValidateMyItem': 300,
}

访问设置

class MySpider(scrapy.Spider):
    name = 'myspider'
    start_urls = ['http://example.com']

    def parse(self, response):
        print(f"Existing settings: {self.settings.attributes.keys()}")

可以通过在扩展程序,中间件和项目管道中scrapy.crawler.Crawler.settings 传递给from_crawler方法的Crawler属性访问设置。

class MyExtension:
    def __init__(self, log_is_enabled=False):
        if log_is_enabled:
            print("log is enabled!")

    @classmethod
    def from_crawler(cls, crawler):
        settings = crawler.settings
        return cls(settings.getbool('LOG_ENABLED'))

内置设置参考

由于无用设置较多,这里介绍常规设置。了解更多设置直接访问
Scrapy 2.4.0 设置部分全

基础配置

  1. 项目名称
    默认的USER_AGENT由它来构成,也作为日志记录的日志名

也就是你执行创建项目命令

scrapy startproject Amazon

中的项目名称自动创建,不需要修改

BOT_NAME = 'Amazon'
  1. 应用路径
    默认创建不需要修改
SPIDER_MODULES = ['Amazon.spiders']
NEWSPIDER_MODULE = 'Amazon.spiders'
  1. User-Agent请求头
    默认不需要修改
#USER_AGENT = 'Amazon (+http://www.yourdomain.com)'
  1. 爬虫协议
    是否遵循爬虫协议,一般网站打开后缀加入robots.txt会有机器人协议的说明,基本无视之,毕竟你遵循了协议就啥也爬不到。
ROBOTSTXT_OBEY = False  # 不遵循协议
  1. Cookie操作
是否支持cookie,cookiejar进行操作cookie,默认开启
#COOKIES_ENABLED = False
  1. 查看信息记录
    Telnet用于查看当前爬虫的信息,操作爬虫等…使用telnet ip port ,然后通过命令操作
#TELNETCONSOLE_ENABLED = False
#TELNETCONSOLE_HOST = '127.0.0.1'
#TELNETCONSOLE_PORT = [6023,]
  1. 请求头Headers
    Scrapy发送HTTP请求默认使用的请求头,一般用于重新定向302使用,或者对不同的网站需要进行随机更换请求头的解决简单的反爬。建议重新创建一套随机更换请求头的方式,这里默认不要更改。
#DEFAULT_REQUEST_HEADERS = {
    
    
#   'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
#   'Accept-Language': 'en',
#}

并发与延迟

  1. 总下载并发设置
    下载器总共最大处理的并发请求数,默认值16
# CONCURRENT_REQUESTS = 32
  1. 单域名并设置
    每个域名能够被执行的最大并发请求数目,默认值8
# CONCURRENT_REQUESTS_PER_DOMAIN = 16
  1. 单IP并发设置
    能够被单个IP处理的并发请求数,默认值0,代表无限制
  2. 如果不为零,那CONCURRENT_REQUESTS_PER_DOMAIN会被忽略,即并发数的限制是按照每个IP来计算,而不是每个域名
  3. 该设置也影响DOWNLOAD_DELAY,如果该值不为零,那么DOWNLOAD_DELAY下载延迟是限制每个IP而不是每个域
#CONCURRENT_REQUESTS_PER_IP = 16
  1. 智能限速
    对同一网址延迟请求的秒数,如果不设置则固定。
#DOWNLOAD_DELAY = 3

智能限速/自动节流

说明介绍

from scrapy.contrib.throttle import AutoThrottle 
#http://scrapy.readthedocs.io/en/latest/topics/autothrottle.html#topics-autothrottle

设置目标:

  1. 比使用默认的下载延迟对抓取目标站点更好。
  2. 自动调整scrapy到最佳的爬取速度,所以用户无需自己调整下载延迟到最佳状态。开发人员只需要定义允许最大并发的请求,其余由该扩展组件自动完成。

实现方法:

  1. Scrapy下载延迟是通过计算建立TCP连接到接收到HTTP包头(header)之间的时间来测量的。
  2. 由于Scrapy可能在忙着处理spider的回调函数或者无法下载,因此在多任务环境下准确测量这些延迟比较困难。这些参数都需要提前设置。

限速算法:

  1. 自动限速算法基于以下规则调整下载延迟
  2. 当收到一个response,对目标站点的下载延迟=收到响应的延迟时间/AUTOTHROTTLE_TARGET_CONCURRENCY
  3. 下一次请求的下载延迟就被设置成:对目标站点下载延迟时间和过去的下载延迟时间的平均值
  4. 没有达到200个response则不允许降低延迟
  5. 下载延迟不能变的比DOWNLOAD_DELAY更低或者比AUTOTHROTTLE_MAX_DELAY更高

配置使用:

#开启True,默认False
AUTOTHROTTLE_ENABLED = True
#起始的延迟
AUTOTHROTTLE_START_DELAY = 5
#最小延迟
DOWNLOAD_DELAY = 3
#最大延迟
AUTOTHROTTLE_MAX_DELAY = 10
#每秒并发请求数的平均值,不能高于 CONCURRENT_REQUESTS_PER_DOMAIN或CONCURRENT_REQUESTS_PER_IP,调高了则吞吐量增大强奸目标站点,调低了则对目标站点更加”礼貌“
#每个特定的时间点,scrapy并发请求的数目都可能高于或低于该值,这是爬虫视图达到的建议值而不是硬限制
AUTOTHROTTLE_TARGET_CONCURRENCY = 16.0
#调试
AUTOTHROTTLE_DEBUG = True
CONCURRENT_REQUESTS_PER_DOMAIN = 16
CONCURRENT_REQUESTS_PER_IP = 16

爬取深度、方式

  1. 爬虫允许的最大深度
    可以通过meta查看当前深度;0表示无深度
# DEPTH_LIMIT = 3
  1. 爬取基本原则
    爬取时,0表示深度优先Lifo(默认);1表示广度优先FiFo
# 后进先出,深度优先
# DEPTH_PRIORITY = 0
# SCHEDULER_DISK_QUEUE = 'scrapy.squeue.PickleLifoDiskQueue'
# SCHEDULER_MEMORY_QUEUE = 'scrapy.squeue.LifoMemoryQueue'

# 先进先出,广度优先
# DEPTH_PRIORITY = 1
# SCHEDULER_DISK_QUEUE = 'scrapy.squeue.PickleFifoDiskQueue'
# SCHEDULER_MEMORY_QUEUE = 'scrapy.squeue.FifoMemoryQueue'
  1. 调度器队列
# SCHEDULER = 'scrapy.core.scheduler.Scheduler'
# from scrapy.core.scheduler import Scheduler
  1. 访问URL去重
# DUPEFILTER_CLASS = 'step8_king.duplication.RepeatUrl'

中间件、Pipelines、扩展

# 启用或禁用中间件
# See http://scrapy.readthedocs.org/en/latest/topics/spider-middleware.html
#SPIDER_MIDDLEWARES = {
    
    
#    'Amazon.middlewares.AmazonSpiderMiddleware': 543,
#}

# 启用或禁用下载器中间件,这里需要使用,否则抓取内容无法使用
# See http://scrapy.readthedocs.org/en/latest/topics/downloader-middleware.html
DOWNLOADER_MIDDLEWARES = {
    
    
   'Amazon.middlewares.DownMiddleware': 543,
}

DOWNLOADER_MIDDLEWARES_BASE = {
    
    
    'scrapy.downloadermiddlewares.robotstxt.RobotsTxtMiddleware': 100,
    'scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware': 300,
    'scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware': 350,
    'scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware': 400,
    'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': 500,
    'scrapy.downloadermiddlewares.retry.RetryMiddleware': 550,
    'scrapy.downloadermiddlewares.ajaxcrawl.AjaxCrawlMiddleware': 560,
    'scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware': 580,
    'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 590,
    'scrapy.downloadermiddlewares.redirect.RedirectMiddleware': 600,
    'scrapy.downloadermiddlewares.cookies.CookiesMiddleware': 700,
    'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 750,
    'scrapy.downloadermiddlewares.stats.DownloaderStats': 850,
    'scrapy.downloadermiddlewares.httpcache.HttpCacheMiddleware': 900,
}

DOWNLOAD_HANDLERS_BASE = {
    
    
    'file': 'scrapy.core.downloader.handlers.file.FileDownloadHandler',
    'http': 'scrapy.core.downloader.handlers.http.HTTPDownloadHandler',
    'https': 'scrapy.core.downloader.handlers.http.HTTPDownloadHandler',
    's3': 'scrapy.core.downloader.handlers.s3.S3DownloadHandler',
    'ftp': 'scrapy.core.downloader.handlers.ftp.FTPDownloadHandler',
}

# 启用或禁用扩展
# See http://scrapy.readthedocs.org/en/latest/topics/extensions.html
EXTENSIONS = {
    
    
    'scrapy.extensions.corestats.CoreStats': 0,
    'scrapy.extensions.telnet.TelnetConsole': 0,
    'scrapy.extensions.memusage.MemoryUsage': 0,
    'scrapy.extensions.memdebug.MemoryDebugger': 0,
    'scrapy.extensions.closespider.CloseSpider': 0,
    'scrapy.extensions.feedexport.FeedExporter': 0,
    'scrapy.extensions.logstats.LogStats': 0,
    'scrapy.extensions.spiderstate.SpiderState': 0,
    'scrapy.extensions.throttle.AutoThrottle': 0,
}

# 配置项目管道
# See http://scrapy.readthedocs.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {
    
    
   # 'Amazon.pipelines.CustomPipeline': 200,
}

缓存

启用缓存目的用于将已经发送的请求或相应缓存下来,以便以后使用

from scrapy.downloadermiddlewares.httpcache import HttpCacheMiddleware
from scrapy.extensions.httpcache import DummyPolicy
from scrapy.extensions.httpcache import FilesystemCacheStorage
# 是否启用缓存策略
# HTTPCACHE_ENABLED = True

# 缓存策略:所有请求均缓存,下次在请求直接访问原来的缓存即可
# HTTPCACHE_POLICY = "scrapy.extensions.httpcache.DummyPolicy"
# 缓存策略:根据Http响应头:Cache-Control、Last-Modified 等进行缓存的策略
# HTTPCACHE_POLICY = "scrapy.extensions.httpcache.RFC2616Policy"

# 缓存超时时间
# HTTPCACHE_EXPIRATION_SECS = 0

# 缓存保存路径
# HTTPCACHE_DIR = 'httpcache'

# 缓存忽略的Http状态码
# HTTPCACHE_IGNORE_HTTP_CODES = []

# 缓存存储的插件
# HTTPCACHE_STORAGE = 'scrapy.extensions.httpcache.FilesystemCacheStorage'

猜你喜欢

转载自blog.csdn.net/qq_20288327/article/details/113521524