本文地址:http://www.itdecent.cn/p/5c2995ac8c25
在Scrapy中,寫好了Spider和Middleware等基本的處理邏輯后,還有許多其他的功能可以在Settings中來進行設(shè)定。
Settings允許你自行定義所有使用的Scrapy模塊,包括core,extensions,pipelines和spiders。
Settings本質(zhì)是提供了一個存儲key-value的全局命名空間,你可以從這個命名空間中拿出需要的配置值。并且Settings可以通過多種方法來進行傳遞。
指定Settings
使用Scrapy必須要告訴它使用哪些設(shè)置。可以使用環(huán)境變量SCRAPY_SETTINGS_MODULE來進行制定,而且SCRAPY_SETTINGS_MODULE需要在Python的路徑語法中,例如myproject.settings。
填充Settings
Scrapy設(shè)置的啟用和填充可以由不同的機制來執(zhí)行,并且每種機制都有不一樣的優(yōu)先級。以下是不同的幾種機制,優(yōu)先級從高到低排列:
- 命令行選項(最高優(yōu)先級)
- 每個
Spider的Settings - 項目的
Settings - 每個命令的默認
Settings - 默認的全局
Settings(最低優(yōu)先級)
以下是每種機制的詳細介紹:
1.命令行選項
在使用命令行時提供的參數(shù)擁有最高的優(yōu)先級,將會覆蓋所有其他方式設(shè)置的相同Settings選項。你可以使用-s(或者--set)來明確指定覆蓋一個或多個Settings。
例子:
scrapy crawl myspider -s LOG_FILE=scrapy.log
2.每個Spider的Settings
在每個Spider中,是可以定義這個Spider所特有的Settings的。只需要在Spider類中,定義好custom_settings這個類屬性即可。
例子:
class MySpider(scrapy.Spider):
name = 'myspider'
custom_settings = {
'SOME_SETTING': 'some value',
}
3.項目的Settings模塊
項目的Settings是Scrapy項目的標(biāo)準配置文件,我們大部分的設(shè)置都會在這個地方配置好。對于一個標(biāo)準的Scrapy項目來說,這意味著我們在settings.py這個文件中添加或者修改配置的字段。
這個文件會在創(chuàng)建項目時自動創(chuàng)建。
4.每個命令的默認Settings
每一個Scrapy命令都有各自的默認Settings,會覆蓋掉默認的全局設(shè)置。這些Settings設(shè)定在命令類的default_settings屬性中。
5.默認全局Settings
默認的全局變量設(shè)定在scrapy.settings.default_settings模塊中。
如何獲取Settings
在Scrapy中,我們常常需要去獲取Settings中的某一個值來進行使用,或者是將我們的自定義Settings寫到settings.py文件中,然后在代碼中進行獲取。
Scrapy提供了一些非常方便的鉤子和方法來獲得Settings。
在Spider中獲取Settings
在Spider中獲取Settings非常的方便,直接訪問self.settings即可:
class MySpider(scrapy.Spider):
name = 'myspider'
start_urls = ['http://example.com']
def parse(self, response):
print("Existing settings: %s" % self.settings.attributes.keys())
注意:settings屬性是在基礎(chǔ)的Spider類中的__init__()中設(shè)定的,這意味著如果你想要在__init__()中使用settings的話,那么你需要重寫from_crawler()方法。
在extensions,middlewares和item pipelines中獲取Settings
在extensions,middlewares和item pipelines中想要獲取Settings的話,那么就只能使用from_crawler()方法。
from_crawler()是一個類方法,這個方法一般用來生成當(dāng)前這個組件的實例,在調(diào)用的時候會傳入crawler參數(shù),通過這個crawler參數(shù)為橋梁,我們就可以獲取Settings了:
class MyExtension(object):
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'))
同樣要注意的是,由于from_crawler()是用來生成組件的實例的,所以最終需要return一個類的實例,然后把我們要獲得的Settings當(dāng)作參數(shù)傳遞到這個實例中去,最后再在__init__()方法中進行接收。
這就是通過from_crawler()獲取Settings的原理了。
內(nèi)置基礎(chǔ)設(shè)置(Built-in settings)
Scrapy中定義了許多基礎(chǔ)的默認全局Settings,以下是一些常見設(shè)置的默認值和作用范圍。
這些設(shè)置的默認范圍指的是只有啟用特定的組件,那么這條設(shè)置才會生效。
常見設(shè)置
-
BOT_NAME
默認值:
'scrapybot'這個
Scrapy項目的Bot名稱。將用于在默認狀態(tài)下構(gòu)造User-Agent,也用于日志記錄。當(dāng)使用
startproject命令創(chuàng)建項目時,將會自動使用項目名稱來填充這個設(shè)置。 -
DEFAULT_REQUEST_HEADERS
默認值:
{ 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Language': 'en', }Scrapy的Request中默認的請求頭,將會在DefaultHeadersMiddleware中被填充。 -
DOWNLOAD_TIMEOUT
默認值:
180Downloader下載的最大超時時間。這個設(shè)置可以在每個
Spider中使用download_timeout屬性進行設(shè)置,也可以在每個Request中可以使用Request.meta中的download_timeout字段進行設(shè)置。 -
ROBOTSTXT_OBEY
默認值:
False作用域:
scrapy.downloadermiddlewares.robotstxt如果設(shè)置為
True,那么Scrapy將會自動遵守robots.txt協(xié)議。注意:由于歷史原因,這個值在全局變量中為
False。但是使用startproject命令生成的settings.py中,這個設(shè)置的值默認為True。所以如果不希望遵守協(xié)議的話,那么需要手動到設(shè)置中將這個設(shè)置為False。 -
COOKIES_ENABLED
默認值:
True是否開啟cookies middleware。如果關(guān)閉這個設(shè)置的話,請求時將不會發(fā)送任何cookies到網(wǎng)站。
并發(fā)
-
CONCURRENT_ITEMS
默認值:
100在
Item的處理器中并發(fā)處理的最大Item數(shù)量。 -
CONCURRENT_REQUESTS
默認值:
16Downloader同時處理Request的最大數(shù)量。 -
CONCURRENT_REQUESTS_PER_DOMAIN
默認值:
8任何單個域名同時發(fā)起的最大
Request數(shù)量。用來控制單個域名的并發(fā)量。 -
CONCURRENT_REQUESTS_PER_IP
默認值:
0任何單個
IP同時發(fā)起的最大Request數(shù)量。如果這個值不為0的話,那么CONCURRENT_REQUESTS_PER_DOMAIN將會被忽略。也就是說,并發(fā)量的限制條件,要么只能使用IP,要么只能使用Domain。這一個設(shè)置同樣會影響
DOWNLOAD_DELAY,使其判斷標(biāo)準變?yōu)镮P。 -
DOWNLOAD_DELAY
默認值:
0Downloader從同一網(wǎng)站上訪問頁面應(yīng)該等待的時間。這個設(shè)置常常被用來控制爬取的速度,以免對網(wǎng)站造成太大的壓力。這個值的單位為秒,并且可以使用小數(shù)。這個值同樣被
RANDOMIZE_DOWNLOAD_DELAY所影響。在默認的情況下,Scrapy不會每次都等待一個固定的時間,而是使用一個范圍在0.5-1.5之間的值乘以DOWNLOAD_DELAY。當(dāng)
CONCURRENT_REQUESTS_PER_IP的值不為0時,延遲將按照每個IP判斷,而不再是Domain。這個設(shè)置可以在
Spider中通過download_delay屬性進行設(shè)置。 -
RANDOMIZE_DOWNLOAD_DELAY
默認值:
True如果啟用,那么
DOWNLOAD_DELAY等待的時間將會隨機乘以范圍在0.5-1.5之間的一個小數(shù)。這個設(shè)置的作用是使爬蟲的等待時間更有隨機性,更難以被檢測。
啟用組件
-
DOWNLOADER_MIDDLEWARES
默認值:
{} -
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, } -
EXTENSIONS
默認值:
{} -
EXTENSIONS_BASE
默認值:
{ '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, } -
ITEM_PIPELINES
默認值:
{} -
ITEM_PIPELINES_BASE
默認值:
{} -
SPIDER_MIDDLEWARES
默認值:
{} -
SPIDER_MIDDLEWARES_BASE
默認值:
{ 'scrapy.spidermiddlewares.httperror.HttpErrorMiddleware': 50, 'scrapy.spidermiddlewares.offsite.OffsiteMiddleware': 500, 'scrapy.spidermiddlewares.referer.RefererMiddleware': 700, 'scrapy.spidermiddlewares.urllength.UrlLengthMiddleware': 800, 'scrapy.spidermiddlewares.depth.DepthMiddleware': 900, }
記錄日志
在Scrapy中,使用的是Python標(biāo)準庫中的logging來進行日志記錄的,所以使用方式也基本相同。
-
LOG_ENABLED
默認值:
True是否開啟日志記錄。
-
LOG_ENCODING
默認值:
'utf-8'記錄日志使用的編碼。
-
LOG_FILE
默認值:
None日志輸出的文件路徑。
-
LOG_FORMAT
默認值:
'%(asctime)s [%(name)s] %(levelname)s: %(message)s'日志記錄的格式。
-
LOG_DATEFORMAT
默認值:
'%Y-%m-%d %H:%M:%S'記錄日志的時間格式。
-
LOG_LEVEL
默認值:
'DEBUG'輸出日志的最小級別,可用的級別有:CRITICAL, ERROR, WARNING, INFO, DEBUG。
-
LOG_STDOUT
默認值:
False如果設(shè)置為
True,將會把所有的標(biāo)準輸出重定向到日志中。例如print打印的信息和異常信息。
內(nèi)存控制
-
MEMDEBUG_ENABLED
默認值:
False是否開啟內(nèi)存調(diào)試。
-
MEMDEBUG_NOTIFY
默認值:
[]當(dāng)開啟內(nèi)存調(diào)試的時候,可以在這個列表中設(shè)置郵箱地址,那么內(nèi)存調(diào)試的報告將會發(fā)送到郵箱中。
例子:
MEMDEBUG_NOTIFY = ['user@example.com'] -
MEMUSAGE_ENABLED
默認值:
True作用域:
scrapy.extensions.memusage是否開啟內(nèi)存使用的擴展。這個擴展會一直跟蹤進程的峰值內(nèi)存使用(寫入到stats中),而且它可以在
Scrapy進程使用的內(nèi)存超過了限制的時候,中止掉進程,并且在這一切發(fā)生的時候使用email發(fā)出通知。 -
MEMUSAGE_LIMIT_MB
默認值:
0作用域:
scrapy.extensions.memusageScrapy最大允許使用的內(nèi)存,單位為MB,超過這個值,Scrapy進程將會被終止。如果值為0,那么將被不會進行檢查。 -
MEMUSAGE_CHECK_INTERVAL_SECONDS
默認值:
60.0作用域:
scrapy.extensions.memusage每隔多長時間檢查一次內(nèi)存的使用量,單位為秒。
-
MEMUSAGE_NOTIFY_MAIL
默認值:
False作用域:
scrapy.extensions.memusage接收內(nèi)存使用報告的郵箱地址。
-
MEMUSAGE_WARNING_MB
默認值:
0作用域:
scrapy.extensions.memusage使用內(nèi)存超過這個值時,將會發(fā)出email警告,單位為MB。如果值為0,那么將被不會進行檢查。
廣度優(yōu)先和深度優(yōu)先
-
DEPTH_LIMIT
默認值:
0作用域:
scrapy.spidermiddlewares.depth.DepthMiddleware對于任一網(wǎng)站,允許爬取的最大深度。如果值為0,則不會有任何限制。
-
DEPTH_PRIORITY
默認值:
0作用域:
scrapy.spidermiddlewares.depth.DepthMiddleware用來根據(jù)深度調(diào)整請求優(yōu)先級的值。
- 如果為0,則不會有任何優(yōu)先級的調(diào)整。
- 如果值為正數(shù),那么會降低優(yōu)先級,也就是說深度更深的請求將會排在爬取隊列的后方。這也意味著深度較淺的請求將會優(yōu)先爬取。這通常被用于廣度優(yōu)先爬?。˙FO)。
- 如果值為負數(shù),那么會提高優(yōu)先級,也就是說深度更深的請求會優(yōu)先爬取。這通常被用于深度優(yōu)先爬取(DFO)。
-
DEPTH_STATS
默認值:
True作用域:
scrapy.spidermiddlewares.depth.DepthMiddleware是否收集最大深度的統(tǒng)計數(shù)據(jù)。
-
DEPTH_STATS_VERBOSE
默認值:
False作用域:
scrapy.spidermiddlewares.depth.DepthMiddleware是否收集最大深度的詳細統(tǒng)計數(shù)據(jù)。如果啟用,那么每個深度請求的數(shù)量將會被收集到數(shù)據(jù)中。
重試和重定向
-
REDIRECT_ENABLED
默認值:
True是否啟用重定向middleware。
-
REDIRECT_MAX_TIMES
默認值:
20請求的最大重定向次數(shù)。重定向的次數(shù)超過這個值后,相應(yīng)將被原樣返回。
-
REDIRECT_PRIORITY_ADJUST
默認值:
+2作用域:
scrapy.downloadermiddlewares.redirect.RedirectMiddleware用來調(diào)整重定向的請求跟原始請求的優(yōu)先級:
- 值為正數(shù)表示重定向的請求優(yōu)先級更高。
- 值為負數(shù)表示原始請求優(yōu)先級更高。
-
RETRY_ENABLED
默認值:
True是否啟用重試middleware。
-
RETRY_TIMES
默認值:
2除了第一次請求外,最大的重試次數(shù)。
這個值也可以在
Request.meta中的max_retry_times字段進行設(shè)置。max_retry_times的優(yōu)先級比RETRY_TIMES的優(yōu)先級更高。 -
RETRY_HTTP_CODES
默認值:
[500, 502, 503, 504, 408]需要重試的響應(yīng)狀態(tài)碼。
-
RETRY_PRIORITY_ADJUST
默認值:
-1作用域:
scrapy.downloadermiddlewares.retry.RetryMiddleware用來調(diào)整重試的請求跟原始請求的優(yōu)先級:
- 值為正數(shù)表示重試的請求優(yōu)先級更高。
- 值為負數(shù)表示原始請求優(yōu)先級更高。
系列文章: