Scrapy-6.Settings

本文地址:http://www.itdecent.cn/p/5c2995ac8c25

Scrapy中,寫好了SpiderMiddleware等基本的處理邏輯后,還有許多其他的功能可以在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)先級從高到低排列:

  1. 命令行選項(最高優(yōu)先級)
  2. 每個SpiderSettings
  3. 項目的Settings
  4. 每個命令的默認Settings
  5. 默認的全局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模塊

項目的SettingsScrapy項目的標(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,middlewaresitem 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',
    }
    

    ScrapyRequest中默認的請求頭,將會在DefaultHeadersMiddleware中被填充。

  • DOWNLOAD_TIMEOUT

    默認值:180

    Downloader下載的最大超時時間。

    這個設(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

    默認值:16

    Downloader同時處理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

    默認值:0

    Downloader從同一網(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.memusage

    Scrapy最大允許使用的內(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)先級更高。

系列文章:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容