【Scrapy 框架翻译】设置(Settings) 篇
程序员文章站
2022-05-08 16:46:39
...
版本号:Scrapy 2.4
内容介绍
解析Scrapy框架下settings配置文件的说明。
优先级设置(降序)
使用不同的机制填充设置,优先级从高到低排列的列表
- 命令行选项
使用-s(或–set)命令行选项显式覆盖一个(或多个)设置。
scrapy crawl myspider -s LOG_FILE=scrapy.log
- 每个spider设置
class MySpider(scrapy.Spider):
name = 'myspider'
custom_settings = {
'SOME_SETTING': 'some value',
}
-
项目设置模块
项目设置模块是Scrapy项目的标准配置文件,将在其中填充大多数自定义设置。对于标准的Scrapy项目,这意味着您将settings.py在为项目创建的文件中添加或更改设置。 -
每个命令的默认设置
每个Scrapy工具命令可以具有其自己的默认设置,这些默认设置将覆盖全局默认设置。这些自定义命令设置default_settings在命令类的属性中指定。 -
默认全局设置
全局默认值位于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 设置部分全
基础配置
- 项目名称
默认的USER_AGENT由它来构成,也作为日志记录的日志名
也就是你执行创建项目命令
scrapy startproject Amazon
中的项目名称自动创建,不需要修改
BOT_NAME = 'Amazon'
- 应用路径
默认创建不需要修改
SPIDER_MODULES = ['Amazon.spiders']
NEWSPIDER_MODULE = 'Amazon.spiders'
- User-Agent请求头
默认不需要修改
#USER_AGENT = 'Amazon (+http://www.yourdomain.com)'
- 爬虫协议
是否遵循爬虫协议,一般网站打开后缀加入robots.txt会有机器人协议的说明,基本无视之,毕竟你遵循了协议就啥也爬不到。
ROBOTSTXT_OBEY = False # 不遵循协议
- Cookie操作
是否支持cookie,cookiejar进行操作cookie,默认开启
#COOKIES_ENABLED = False
- 查看信息记录
Telnet用于查看当前爬虫的信息,操作爬虫等…使用telnet ip port ,然后通过命令操作
#TELNETCONSOLE_ENABLED = False
#TELNETCONSOLE_HOST = '127.0.0.1'
#TELNETCONSOLE_PORT = [6023,]
- 请求头Headers
Scrapy发送HTTP请求默认使用的请求头,一般用于重新定向302使用,或者对不同的网站需要进行随机更换请求头的解决简单的反爬。建议重新创建一套随机更换请求头的方式,这里默认不要更改。
#DEFAULT_REQUEST_HEADERS = {
# 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
# 'Accept-Language': 'en',
#}
并发与延迟
- 总下载并发设置
下载器总共最大处理的并发请求数,默认值16
# CONCURRENT_REQUESTS = 32
- 单域名并设置
每个域名能够被执行的最大并发请求数目,默认值8
# CONCURRENT_REQUESTS_PER_DOMAIN = 16
- 单IP并发设置
能够被单个IP处理的并发请求数,默认值0,代表无限制 - 如果不为零,那CONCURRENT_REQUESTS_PER_DOMAIN会被忽略,即并发数的限制是按照每个IP来计算,而不是每个域名
- 该设置也影响DOWNLOAD_DELAY,如果该值不为零,那么DOWNLOAD_DELAY下载延迟是限制每个IP而不是每个域
#CONCURRENT_REQUESTS_PER_IP = 16
- 智能限速
对同一网址延迟请求的秒数,如果不设置则固定。
#DOWNLOAD_DELAY = 3
智能限速/自动节流
说明介绍
from scrapy.contrib.throttle import AutoThrottle
#http://scrapy.readthedocs.io/en/latest/topics/autothrottle.html#topics-autothrottle
设置目标:
- 比使用默认的下载延迟对抓取目标站点更好。
- 自动调整scrapy到最佳的爬取速度,所以用户无需自己调整下载延迟到最佳状态。开发人员只需要定义允许最大并发的请求,其余由该扩展组件自动完成。
实现方法:
- Scrapy下载延迟是通过计算建立TCP连接到接收到HTTP包头(header)之间的时间来测量的。
- 由于Scrapy可能在忙着处理spider的回调函数或者无法下载,因此在多任务环境下准确测量这些延迟比较困难。这些参数都需要提前设置。
限速算法:
- 自动限速算法基于以下规则调整下载延迟
- 当收到一个response,对目标站点的下载延迟=收到响应的延迟时间/AUTOTHROTTLE_TARGET_CONCURRENCY
- 下一次请求的下载延迟就被设置成:对目标站点下载延迟时间和过去的下载延迟时间的平均值
- 没有达到200个response则不允许降低延迟
- 下载延迟不能变的比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
爬取深度、方式
- 爬虫允许的最大深度
可以通过meta查看当前深度;0表示无深度
# DEPTH_LIMIT = 3
- 爬取基本原则
爬取时,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'
- 调度器队列
# SCHEDULER = 'scrapy.core.scheduler.Scheduler'
# from scrapy.core.scheduler import Scheduler
- 访问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爬虫框架scrapy实现downloader_middleware设置proxy代理功能示例
-
【Python Scrapy 爬虫框架】 5、利用 pipelines 和 settings 将爬取数据存储到 MongoDB
-
Yii2框架基础篇学习-控制器 yii 跨控制器调用方法 yii2 跨控制器调用 yii设置默认控制
-
【Scrapy 框架】「版本2.4.0源码」管道(Pipeline)详解篇
-
【Scrapy 框架翻译】物品(Items)详解篇
-
【Scrapy 框架翻译】链接提取器(Link Extractors) 篇
-
【Scrapy 框架翻译】物品加载(Item Loaders)详解篇
-
【Scrapy 框架翻译】爬虫页(Spiders)详解篇
-
【Scrapy 框架翻译】异常操作(Exceptions) 篇
-
【Scrapy 框架翻译】请求和回应(Requests and Responses) 篇