「Scrapy 爬虫框架」设置(Settings) 详解

文章目录

  • 内容介绍
  • 优先级设置(降序)
  • 导入路径和类
  • 访问设置
  • 内置设置参考
  • 基础配置
  • 并发与延迟
  • 智能限速/自动节流
  • 爬取深度、方式
  • 中间件、Pipelines、扩展
  • 缓存

内容介绍

开发环境为 Python3.6,Scrapy 版本 2.4.x ,爬虫项目全部内容索引目录

看懂Python爬虫框架,所见即所得一切皆有可能

本章带你学习基于 Python3Scrapy 爬虫框架 中数据爬取过程中解析Scrapy框架下settings配置文件的说明。

代码内容基于「Scrapy 爬虫框架」源码版本 2.4.0 ,更新内容会进行标记说明对应版本。

优先级设置(降序)

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

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

    custom_settings = {
     
        'SOME_SETTING': 'some value',
    }
  • 3. 项目设置模块

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

  • 4. 每个命令的默认设置

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

  • 5. 默认全局设置

全局默认值位于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由它来构成,也作为日志记录的日志名,也就是你执行创建项目命令,自动创建,不需要修改。
# shell 命令
scrapy startproject Amazon
BOT_NAME = 'Amazon'
  • 2. 应用路径
# 默认创建不需要修改
SPIDER_MODULES = ['Amazon.spiders']
NEWSPIDER_MODULE = 'Amazon.spiders'
  • 3.User-Agent请求头
# 默认不需要修改
# USER_AGENT = 'Amazon (+http://www.yourdomain.com)'
  • 4. 爬虫协议
# 是否遵循爬虫协议,
# 一般网站打开后缀加入robots.txt会有机器人协议的说明,
# 基本无视之,毕竟你遵循了协议就啥也爬不到。
ROBOTSTXT_OBEY = False  # 不遵循协议
  • 5. Cookie操作
# 是否支持cookie,cookiejar进行操作cookie,默认开启
# COOKIES_ENABLED = False
  • 6. 查看信息记录
# Telnet用于查看当前爬虫的信息,操作爬虫等...使用telnet ip port ,然后通过命令操作
# TELNETCONSOLE_ENABLED = False
# TELNETCONSOLE_HOST = '127.0.0.1'
# TELNETCONSOLE_PORT = [6023,]
  • 7. 请求头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
  • 2. 单域名并设置
# 每个域名能够被执行的最大并发请求数目,默认值8
# CONCURRENT_REQUESTS_PER_DOMAIN = 16
  • 3. 单IP并发设置
# 能够被单个IP处理的并发请求数,默认值0,代表无限制
# 如果不为零,那CONCURRENT_REQUESTS_PER_DOMAIN会被忽略,即并发数的限制是按照每个IP来计算,而不是每个域名
# 该设置也影响DOWNLOAD_DELAY,如果该值不为零,那么DOWNLOAD_DELAY下载延迟是限制每个IP而不是每个域
# CONCURRENT_REQUESTS_PER_IP = 16
  • 4. 智能限速
# 对同一网址延迟请求的秒数,如果不设置则固定。
# DOWNLOAD_DELAY = 3

智能限速/自动节流

from scrapy.contrib.throttle import AutoThrottle 
#http://scrapy.readthedocs.io/en/latest/topics/autothrottle.html#topics-autothrottle
  • 1.设置目标
1. 比使用默认的下载延迟对抓取目标站点更好。
2. 自动调整scrapy到最佳的爬取速度,所以用户无需自己调整下载延迟到最佳状态。开发人员只需要定义允许最大并发的请求,其余由该扩展组件自动完成。
  • 2.实现方法
1. Scrapy下载延迟是通过计算建立TCP连接到接收到HTTP包头(header)之间的时间来测量的。
2. 由于Scrapy可能在忙着处理spider的回调函数或者无法下载,因此在多任务环境下准确测量这些延迟比较困难。这些参数都需要提前设置。
  • 3.限速算法
1. 自动限速算法基于以下规则调整下载延迟
2. 当收到一个response,对目标站点的下载延迟=收到响应的延迟时间/AUTOTHROTTLE_TARGET_CONCURRENCY
3. 下一次请求的下载延迟就被设置成:对目标站点下载延迟时间和过去的下载延迟时间的平均值
4. 没有达到200个response则不允许降低延迟
5. 下载延迟不能变的比DOWNLOAD_DELAY更低或者比AUTOTHROTTLE_MAX_DELAY更高
  • 4.配置使用
#开启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
  • 2. 爬取基本原则
# 爬取时,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'
  • 3. 调度器队列
# SCHEDULER = 'scrapy.core.scheduler.Scheduler'
# from scrapy.core.scheduler import Scheduler
  • 4. 访问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'

你可能感兴趣的:(Python,爬虫基础和项目管理,python,scrapy,爬虫,设置,settings)