开发环境为 Python3.6,Scrapy 版本 2.4.x ,爬虫项目全部内容索引目录
看懂Python爬虫框架,所见即所得一切皆有可能
本章带你学习基于 Python3 的 Scrapy 爬虫框架 中数据爬取过程中解析Scrapy框架下settings配置文件的说明。
代码内容基于「Scrapy 爬虫框架」源码版本 2.4.0 ,更新内容会进行标记说明对应版本。
使用不同的机制填充设置,优先级从高到低排列的列表
# 使用-s(或--set)命令行选项显式覆盖一个(或多个)设置。
scrapy crawl myspider -s LOG_FILE=scrapy.log
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 设置
# shell 命令
scrapy startproject Amazon
BOT_NAME = 'Amazon'
# 默认创建不需要修改
SPIDER_MODULES = ['Amazon.spiders']
NEWSPIDER_MODULE = 'Amazon.spiders'
# 默认不需要修改
# USER_AGENT = 'Amazon (+http://www.yourdomain.com)'
# 是否遵循爬虫协议,
# 一般网站打开后缀加入robots.txt会有机器人协议的说明,
# 基本无视之,毕竟你遵循了协议就啥也爬不到。
ROBOTSTXT_OBEY = False # 不遵循协议
# 是否支持cookie,cookiejar进行操作cookie,默认开启
# COOKIES_ENABLED = False
# Telnet用于查看当前爬虫的信息,操作爬虫等...使用telnet ip port ,然后通过命令操作
# TELNETCONSOLE_ENABLED = False
# TELNETCONSOLE_HOST = '127.0.0.1'
# TELNETCONSOLE_PORT = [6023,]
# 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处理的并发请求数,默认值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
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
# 可以通过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
# DUPEFILTER_CLASS = 'step8_king.duplication.RepeatUrl'
# 启用或禁用中间件
# 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'