Scrapy 配置介紹及常見(jiàn)優(yōu)化配置
今天我們來(lái)看看 Scrapy 框架的相關(guān)配置項(xiàng)以及常見(jiàn)的一些優(yōu)化配置。涉及的文件主要是 scrapy 項(xiàng)目的 settings.py
文件和 Scrapy 源碼目錄下的 scrapy/settings/default_settings.py
文件。這些內(nèi)容會(huì)在我們每個(gè) Scrapy 爬蟲項(xiàng)目中都會(huì)用到,特別是在爬取海量數(shù)據(jù)時(shí)需要特別注意的地方。
1. Scrapy 的 settings.py
配置
從前面的學(xué)習(xí)中我們知道,settings.py
是 Scrapy 使用 startproject 命令生成的,這里的配置會(huì)默認(rèn)覆蓋 Scrapy 內(nèi)置的配置項(xiàng),這些默認(rèn)的配置項(xiàng)都位于 Scrapy 的 scrapy/settings/default_settings.py 中:
我們來(lái)看看 default_settings.py 中的一些默認(rèn)配置項(xiàng)。
-
AJAXCRAWL_ENABLED
:通用爬取經(jīng)常會(huì)抓取大量的 index 頁(yè)面;AjaxCrawlMiddleware 能幫助我們正確地爬取,AJAXCRAWL_ENABLED
配置正是開啟該中間件的開關(guān)。由于有些性能問(wèn)題,且對(duì)于特定爬蟲沒(méi)有什么意義,該中間默認(rèn)關(guān)閉; -
自動(dòng)限速擴(kuò)展 (AutoThrottle):這類配置主要是以 Scrapy 爬蟲以及正在抓取網(wǎng)站的負(fù)載來(lái)自動(dòng)優(yōu)化爬取速度。它能自動(dòng)調(diào)整 Scrapy 達(dá)到最佳的爬取速度,使用者無(wú)需自己設(shè)置下載延遲,只要設(shè)置好最大并發(fā)請(qǐng)求數(shù)即可。來(lái)看看有關(guān)該擴(kuò)展的配置項(xiàng):
AUTOTHROTTLE_ENABLED = False # 默認(rèn)關(guān)閉 AUTOTHROTTLE_DEBUG = False # 關(guān)閉調(diào)試 AUTOTHROTTLE_MAX_DELAY = 60.0 # 最高下載延遲 AUTOTHROTTLE_START_DELAY = 5.0 # 初始化下載延遲 AUTOTHROTTLE_TARGET_CONCURRENCY = 1.0 # Scrapy 同時(shí)請(qǐng)求目標(biāo)網(wǎng)站的平均請(qǐng)求數(shù)
下面四個(gè)配置用于設(shè)置爬蟲自動(dòng)關(guān)閉條件:
CLOSESPIDER_TIMEOUT
:一個(gè)整數(shù)值,單位為秒。如果一個(gè) spider 在指定的秒數(shù)后仍在運(yùn)行, 它將以closespider_timeout
的原因被自動(dòng)關(guān)閉。 如果值設(shè)置為0 (或者沒(méi)有設(shè)置),spiders 不會(huì)因?yàn)槌瑫r(shí)而關(guān)閉;CLOSESPIDER_ITEMCOUNT
:一個(gè)整數(shù)值,指定條目的個(gè)數(shù)。如果 spider 爬取條目數(shù)超過(guò)了設(shè)置的值, 并且這些條目通過(guò) item pipelines 傳遞,spider 將會(huì)以closespider_itemcount
的原因被自動(dòng)關(guān)閉;CLOSESPIDER_PAGECOUNT
:一個(gè)整數(shù)值,指定最大的抓取響應(yīng) (reponses) 數(shù)。 如果 spider 抓取數(shù)超過(guò)指定的值,則會(huì)以closespider_pagecount
的原因自動(dòng)關(guān)閉。 如果設(shè)置為0(或者未設(shè)置),spiders不會(huì)因?yàn)樽ト〉捻憫?yīng)數(shù)而關(guān)閉;CLOSESPIDER_ERRORCOUNT
:一個(gè)整數(shù)值,指定spider可以接受的最大錯(cuò)誤數(shù)。 如果spider生成多于該數(shù)目的錯(cuò)誤,它將以closespider_errorcount
的原因關(guān)閉。 如果設(shè)置為0(或者未設(shè)置),spiders不會(huì)因?yàn)榘l(fā)生錯(cuò)誤過(guò)多而關(guān)閉;
以上四個(gè)參數(shù)在 default_settings.py 中設(shè)置的默認(rèn)值都是0
并發(fā)相關(guān),的設(shè)置會(huì)較大影響 Scrapy 爬蟲的性能。下面是默認(rèn)的配置值,其中都已經(jīng)進(jìn)行了詳細(xì)的注釋說(shuō)明:
# pipelines中并發(fā)處理items數(shù)
CONCURRENT_ITEMS = 100
# scrapy中并發(fā)下載請(qǐng)求數(shù)
CONCURRENT_REQUESTS = 16
# 對(duì)任何單個(gè)域執(zhí)行的并發(fā)請(qǐng)求的最大數(shù)量
CONCURRENT_REQUESTS_PER_DOMAIN = 8
# 將對(duì)任何單個(gè)IP執(zhí)行的并發(fā)請(qǐng)求的最大數(shù)量。如果非零
CONCURRENT_REQUESTS_PER_IP = 0
Cookie相關(guān)配置:
# 是否啟用cookiesmiddleware。如果關(guān)閉,cookies將不會(huì)發(fā)送給web server
COOKIES_ENABLED = True
# 如果啟用,Scrapy將記錄所有在request(cookie 請(qǐng)求頭)發(fā)送的cookies及response接收到的cookies(set-cookie接收頭),這也會(huì)間接影響性能,因此默認(rèn)關(guān)閉。
COOKIES_DEBUG = False
請(qǐng)求深度相關(guān)配置,比如 DEPTH_LIMIT
設(shè)置請(qǐng)求允許的最大深度。如果為 0 ,則表示不受限;DEPTH_STATS_VERBOSE
參數(shù)控制是否收集詳細(xì)的深度統(tǒng)計(jì)信息;如果啟用此選項(xiàng),則在統(tǒng)計(jì)信息中收集每個(gè)深度的請(qǐng)求數(shù)。DEPTH_PRIORITY
參數(shù)用于根據(jù)深度調(diào)整請(qǐng)求優(yōu)先級(jí)。來(lái)看看他們的默認(rèn)設(shè)置:
DEPTH_LIMIT = 0
DEPTH_STATS_VERBOSE = False
DEPTH_PRIORITY = 0
DNS 相關(guān)配置。DNSCACHE_ENABLED
用于控制是否啟用 DNS 緩存,DNSCACHE_SIZE
參數(shù)設(shè)置緩存大小,DNS_TIMEOUT
處理 DNS 查詢超時(shí)時(shí)間;我們來(lái)具體看看 default_settings.py 中的默認(rèn)配置:
DNSCACHE_ENABLED = True
DNSCACHE_SIZE = 10000
# 緩存解析器
DNS_RESOLVER = 'scrapy.resolver.CachingThreadedResolver'
DNS_TIMEOUT = 60
下載器相關(guān)。這部分的配置比較多,也是主要影響性能的地方。我們對(duì)一些關(guān)鍵的配置進(jìn)行說(shuō)明,具體如下:
DOWNLOAD_DELAY
:下載器在從同一網(wǎng)站下載連續(xù)頁(yè)面之前應(yīng)等待的時(shí)間,通過(guò)該配置可以限制爬蟲的爬取速度。此外,該設(shè)置也受RANDOMIZE_DOWNLOAD_DELAY 設(shè)置(默認(rèn)情況下啟用)的影響。DOWNLOAD_TIMEOUT
:下載超時(shí)時(shí)間;DOWNLOAD_MAXSIZE
:下載器將下載的最大響應(yīng)大?。?/li>DOWNLOAD_HANDLERS_BASE
:處理不同類型下載的下載器;DOWNLOAD_FAIL_ON_DATALOSS
:數(shù)據(jù)丟失后是否繼續(xù)下載;DOWNLOADER_MIDDLEWARES
和DOWNLOADER_MIDDLEWARES_BASE
:分別表示自定義的下載中間件類和默認(rèn)的下載中間件類;DOWNLOADER_STATS
:是否啟用下載器統(tǒng)計(jì)信息收集。
來(lái)看看 default_settings.py 中的默認(rèn)配置,具體如下:
DOWNLOAD_DELAY = 0
DOWNLOAD_HANDLERS = {}
DOWNLOAD_HANDLERS_BASE = {
'data': 'scrapy.core.downloader.handlers.datauri.DataURIDownloadHandler',
'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',
}
DOWNLOAD_TIMEOUT = 180 # 3mins
DOWNLOAD_MAXSIZE = 1024 * 1024 * 1024 # 1024m
DOWNLOAD_WARNSIZE = 32 * 1024 * 1024 # 32m
DOWNLOAD_FAIL_ON_DATALOSS = True
DOWNLOADER = 'scrapy.core.downloader.Downloader'
DOWNLOADER_HTTPCLIENTFACTORY = 'scrapy.core.downloader.webclient.ScrapyHTTPClientFactory'
DOWNLOADER_CLIENTCONTEXTFACTORY = 'scrapy.core.downloader.contextfactory.ScrapyClientContextFactory'
DOWNLOADER_CLIENT_TLS_CIPHERS = 'DEFAULT'
# Use highest TLS/SSL protocol version supported by the platform, also allowing negotiation:
DOWNLOADER_CLIENT_TLS_METHOD = 'TLS'
DOWNLOADER_CLIENT_TLS_VERBOSE_LOGGING = False
DOWNLOADER_MIDDLEWARES = {}
DOWNLOADER_MIDDLEWARES_BASE = {
# Engine side
'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,
# Downloader side
}
DOWNLOADER_STATS = True
DUPEFILTER_CLASS
:指定去重類;
DUPEFILTER_CLASS = 'scrapy.dupefilters.RFPDupeFilter'
自定義擴(kuò)展和內(nèi)置擴(kuò)展配置:
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,
}
文件存儲(chǔ)相關(guān):
FILES_STORE_S3_ACL = 'private'
FILES_STORE_GCS_ACL = ''
FTP 服務(wù)配置, Scrapy 框架內(nèi)置 FTP 下載程序。我們可以指定 FTP 的相關(guān)參數(shù):
FTP_USER = 'anonymous'
FTP_PASSWORD = 'guest'
FTP_PASSIVE_MODE = True
HTTP 緩存相關(guān)配置。Scrapy 的 HttpCacheMiddleware
組件(默認(rèn)情況下沒(méi)有啟用)提供了一個(gè)底層的對(duì)HTTP請(qǐng)求和響應(yīng)的緩存。如果啟用的話(把HTTPCACHE_ENABLED
設(shè)置為True
),它會(huì)緩存每個(gè)請(qǐng)求和對(duì)應(yīng)的響應(yīng)。來(lái)看看和其相關(guān)的配置和含義:
# 是否啟用http緩存
HTTPCACHE_ENABLED = False
# 緩存數(shù)據(jù)目錄
HTTPCACHE_DIR = 'httpcache'
HTTPCACHE_IGNORE_MISSING = False
# 緩存存儲(chǔ)的插件
HTTPCACHE_STORAGE = 'scrapy.extensions.httpcache.FilesystemCacheStorage'
# 緩存過(guò)期時(shí)間
HTTPCACHE_EXPIRATION_SECS = 0
HTTPCACHE_ALWAYS_STORE = False
# 緩存忽略的Http狀態(tài)碼
HTTPCACHE_IGNORE_HTTP_CODES = []
HTTPCACHE_IGNORE_SCHEMES = ['file']
HTTPCACHE_IGNORE_RESPONSE_CACHE_CONTROLS = []
HTTPCACHE_DBM_MODULE = 'dbm'
# 設(shè)置緩存策略,DummyPolicy是所有請(qǐng)求均緩存,下次在請(qǐng)求直接訪問(wèn)原來(lái)的緩存即可
HTTPCACHE_POLICY = 'scrapy.extensions.httpcache.DummyPolicy'
# 是否啟用緩存數(shù)據(jù)壓縮
HTTPCACHE_GZIP = False
Item 和 Item pipelines相關(guān)配置:
# ITEM處理器
ITEM_PROCESSOR = 'scrapy.pipelines.ItemPipelineManager'
# 自定義的 item pipelines
ITEM_PIPELINES = {}
ITEM_PIPELINES_BASE = {}
日志相關(guān)的配置:
# 啟動(dòng)日志功能
LOG_ENABLED = True
# 日志編碼
LOG_ENCODING = 'utf-8'
# 日志格式器
LOG_FORMATTER = 'scrapy.logformatter.LogFormatter'
# 日志格式
LOG_FORMAT = '%(asctime)s [%(name)s] %(levelname)s: %(message)s'
# 日志時(shí)間格式
LOG_DATEFORMAT = '%Y-%m-%d %H:%M:%S'
LOG_STDOUT = False
# 日志級(jí)別
LOG_LEVEL = 'DEBUG'
# 指定日志輸出文件
LOG_FILE = None
LOG_SHORT_NAMES = False
郵件配置:在 Scrapy 中提供了郵件功能,該功能使用十分簡(jiǎn)便且采用了 Twisted 非阻塞模式,避免了對(duì)爬蟲的影響。我們只需要在 Scrapy 中進(jìn)行簡(jiǎn)單的設(shè)置,就能通過(guò) API 發(fā)送郵件。郵件的默認(rèn)配置項(xiàng)如下:
MAIL_HOST = 'localhost'
MAIL_PORT = 25
MAIL_FROM = 'scrapy@localhost'
MAIL_PASS = None
MAIL_USER = None
我們現(xiàn)在可以簡(jiǎn)單的使用下 Scrapy 給我們提供的郵件類,來(lái)利用它給我們自己發(fā)送一封郵件。首先需要找下自己的 qq 郵箱或者其他郵箱,開啟 POP3/SMTP服務(wù),然后我們可以得到一個(gè)授權(quán)碼。這個(gè)就是我們登陸這個(gè)郵箱服務(wù)的密碼。然后我們配置 settings.py 中的相應(yīng)項(xiàng):
MAIL_HOST = 'smtp.qq.com'
MAIL_PORT = 25
MAIL_FROM = '2894577759@qq.com'
MAIL_PASS = '你的授權(quán)碼'
MAIL_USER = '2894577759@qq.com'
接下來(lái)我們?cè)?scrapy shell 中來(lái)調(diào)用相應(yīng)的郵件接口,發(fā)送郵件:
(scrapy-test) [root@server china_pub]# scrapy shell --nolog
[s] Available Scrapy objects:
[s] scrapy scrapy module (contains scrapy.Request, scrapy.Selector, etc)
[s] crawler <scrapy.crawler.Crawler object at 0x7f1c3d4e9100>
[s] item {}
[s] settings <scrapy.settings.Settings object at 0x7f1c3d4e6dc0>
[s] Useful shortcuts:
[s] fetch(url[, redirect=True]) Fetch URL and update local objects (by default, redirects are followed)
[s] fetch(req) Fetch a scrapy.Request and update local objects
[s] shelp() Shell help (print this help)
[s] view(response) View response in a browser
>>> from scrapy.mail import MailSender
>>> mailer = MailSender().from_settings(settings)
>>> mailer.send(to=["2894577759@qq.com"], subject="這是一個(gè)測(cè)試", body="來(lái)自百度云主機(jī)發(fā)送的一封郵件", cc=["2894577759@qq.com"])
<Deferred at 0x7f1c3c4d1c40>
內(nèi)存相關(guān)參數(shù):
MEMDEBUG_ENABLED = False # enable memory debugging
MEMDEBUG_NOTIFY = [] # send memory debugging report by mail at engine shutdown
MEMUSAGE_CHECK_INTERVAL_SECONDS = 60.0
# 是否啟用內(nèi)存使用擴(kuò)展
MEMUSAGE_ENABLED = True
# 在關(guān)閉Scrapy之前允許的最大內(nèi)存量,為0則不檢查
MEMUSAGE_LIMIT_MB = 0
# 要達(dá)到內(nèi)存限制時(shí)通知的電子郵件列表
MEMUSAGE_NOTIFY_MAIL = []
# 在發(fā)送警告電子郵件通知之前,要允許的最大內(nèi)存量(以兆字節(jié)為單位)。如果為零,則不會(huì)產(chǎn)生警告
MEMUSAGE_WARNING_MB = 0
調(diào)度器相關(guān)配置:
# 調(diào)度器類
SCHEDULER = 'scrapy.core.scheduler.Scheduler'
# 指定調(diào)度器的三種隊(duì)列類
SCHEDULER_DISK_QUEUE = 'scrapy.squeues.PickleLifoDiskQueue'
SCHEDULER_MEMORY_QUEUE = 'scrapy.squeues.LifoMemoryQueue'
SCHEDULER_PRIORITY_QUEUE = 'scrapy.pqueues.ScrapyPriorityQueue'
# 正在處理響應(yīng)數(shù)據(jù)的軟限制(以字節(jié)為單位),如果所有正在處理的響應(yīng)的大小總和高于此值,Scrapy不會(huì)處理新的請(qǐng)求
SCRAPER_SLOT_MAX_ACTIVE_SIZE = 5000000
spider 中間件相關(guān)配置,有我們熟悉的 SPIDER_MIDDLEWARES
和 SPIDER_MIDDLEWARES_BASE
,表示自定義的 Spider 中間件和 Scrapy 內(nèi)置的 Spider 中間件;
SPIDER_MIDDLEWARES = {}
SPIDER_MIDDLEWARES_BASE = {
# Engine side
'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,
# Spider side
}
指定模板文件目錄,這個(gè)在使用 scrapy startproject 項(xiàng)目名
命令創(chuàng)建項(xiàng)目時(shí),對(duì)應(yīng)的模板文件所在的目錄:
TEMPLATES_DIR = abspath(join(dirname(__file__), '..', 'templates'))
USER_AGENT
:設(shè)置請(qǐng)求頭的 User-Agent
參數(shù),用來(lái)模擬瀏覽器。我們通常都會(huì)添加一個(gè)瀏覽器的 User-Agent
值,防止爬蟲直接被屏蔽;
Scrapy 的大體配置就是這些,還有一些沒(méi)有介紹到的參數(shù),課后可以仔細(xì)查看官方文檔進(jìn)行了解。
2. 常見(jiàn)的優(yōu)化配置參數(shù)
首先 scrapy 框架有一個(gè)命令 (bench) 來(lái)幫助我們測(cè)試本地環(huán)境的效率,它會(huì)在本地創(chuàng)建一個(gè) HTTP 服務(wù)器,并以最大可能的速度進(jìn)行爬取,這個(gè)模擬的 Spider 只會(huì)做跟進(jìn)連接操作,而不做其他處理。我們來(lái)實(shí)際看看這個(gè)命令的執(zhí)行效果:
(scrapy-test) [root@server qidian_yuepiao]# scrapy bench
# ...
2020-07-25 23:35:07 [scrapy.statscollectors] INFO: Dumping Scrapy stats:
{'downloader/request_bytes': 127918,
'downloader/request_count': 278,
'downloader/request_method_count/GET': 278,
'downloader/response_bytes': 666962,
'downloader/response_count': 278,
'downloader/response_status_count/200': 278,
'elapsed_time_seconds': 11.300798,
'finish_reason': 'closespider_timeout',
'finish_time': datetime.datetime(2020, 7, 25, 15, 35, 7, 370135),
'log_count/INFO': 21,
'memusage/max': 48553984,
'memusage/startup': 48553984,
'request_depth_max': 12,
'response_received_count': 278,
'robotstxt/request_count': 1,
'robotstxt/response_count': 1,
'robotstxt/response_status_count/200': 1,
'scheduler/dequeued': 277,
'scheduler/dequeued/memory': 277,
'scheduler/enqueued': 5540,
'scheduler/enqueued/memory': 5540,
'start_time': datetime.datetime(2020, 7, 25, 15, 34, 56, 69337)}
2020-07-25 23:35:07 [scrapy.core.engine] INFO: Spider closed (closespider_timeout)
在上面的執(zhí)行日志中,我們可以很清楚的看到該命令會(huì)搜索 settings.py 中的配置并打印項(xiàng)目的基本信息以及啟用的擴(kuò)展、下載中間件、Spider 中間件以及相應(yīng)的 item pipelines。接下來(lái)是做的一些本地環(huán)境測(cè)試,測(cè)試顯示的是每分鐘平均能抓取1440個(gè)頁(yè)面,當(dāng)然實(shí)際的爬蟲程序中需要有較多的處理,比如抽取頁(yè)面數(shù)據(jù)、過(guò)濾、去重以及保存到數(shù)據(jù)庫(kù)中,這些都是會(huì)消耗一定時(shí)間的。
現(xiàn)在來(lái)介紹一下 settings.py 中比較常見(jiàn)的一個(gè)優(yōu)化配置:
-
并發(fā)控制:settings.py 中的
CONCURRENT_REQUESTS
參數(shù)用來(lái)確定請(qǐng)求的并發(fā)數(shù),默認(rèn)給的是16。而這個(gè)參數(shù)往往不適用于本地環(huán)境,我們需要進(jìn)行調(diào)整。調(diào)整的方法是一開始設(shè)置一個(gè)比較大的值,比如100,然后進(jìn)行測(cè)試,得到 Scrapy 的并發(fā)請(qǐng)求數(shù)與 CPU 使用率之間的關(guān)系,我們選擇大概使得 CPU 使用率在 80%~90% 對(duì)應(yīng)的并發(fā)數(shù),這樣能使得 Scrapy 爬蟲充分利用 CPU 進(jìn)行網(wǎng)頁(yè)爬取; -
關(guān)閉 Cookie :這也是一個(gè)常見(jiàn)的優(yōu)化策略。對(duì)于一些網(wǎng)站的請(qǐng)求,比如起點(diǎn)網(wǎng)、京東商城等, 不用登錄都可以任意訪問(wèn)數(shù)據(jù)的,沒(méi)有必要使用 Cookie,使用 Cookie 而會(huì)增加 Scrapy 爬蟲的工作量。直接設(shè)置
COOKIES_ENABLED = False
即可關(guān)閉 Cookie; -
設(shè)置 Log 級(jí)別:將默認(rèn)的 DEBUG 級(jí)別調(diào)整至 INFO 級(jí)別,減少不必要的日志打??;
-
關(guān)閉重試:默認(rèn)情況下 Scrapy 會(huì)對(duì)失敗的請(qǐng)求進(jìn)行重試,這種操作會(huì)減慢數(shù)據(jù)的爬取效率,因?yàn)閷?duì)于海量的請(qǐng)求而言,丟失的數(shù)個(gè)甚至數(shù)百個(gè)請(qǐng)求都無(wú)關(guān)緊要;反而不必要的嘗試會(huì)影響爬蟲爬取效率;生產(chǎn)環(huán)境的做法最好是直接關(guān)閉,即
RETRY_ENABLED = False
; -
減少下載超時(shí)時(shí)間:對(duì)于響應(yīng)很慢的網(wǎng)站,在超時(shí)時(shí)間結(jié)束前,Scrapy 會(huì)持續(xù)等到響應(yīng)返回,這樣容易造成資源浪費(fèi)。因此一個(gè)常見(jiàn)的優(yōu)化策略是,減少超時(shí)時(shí)間,盡量讓響應(yīng)慢的請(qǐng)求釋放資源。相應(yīng)的參數(shù)設(shè)置示例如下:
DOWNLOAD_TIMEOUT = 3
-
關(guān)閉重定向:除非對(duì)重定向內(nèi)容感興趣,否則可以考慮關(guān)閉重定向。關(guān)閉操作
REDIRECT_ENABLED = False
; -
自動(dòng)調(diào)整爬蟲負(fù)載:我們啟用這個(gè)可以自動(dòng)調(diào)節(jié)服務(wù)器負(fù)載的擴(kuò)展程序,設(shè)置相關(guān)的參數(shù),可以一定程度上優(yōu)化爬蟲的性能;
AUTOTHROTTLE_ENABLED = False # 默認(rèn)不啟用,可以設(shè)置為True并調(diào)整下面相關(guān)參數(shù) AUTOTHROTTLE_DEBUG = False AUTOTHROTTLE_MAX_DELAY = 60.0 AUTOTHROTTLE_START_DELAY = 5.0 AUTOTHROTTLE_TARGET_CONCURRENCY = 1.0
3. 小結(jié)
本小節(jié)中我們首先介紹了 settings.py 中的相關(guān)配置參數(shù),先了解這些基礎(chǔ)的配置的含義,然后才知道如何選擇較合適的參數(shù),這些對(duì)于 Scrapy 爬蟲性能有著較大的影響。當(dāng)然這些性能變化可能在我們編寫的實(shí)驗(yàn)性爬蟲中無(wú)法體現(xiàn),但是對(duì)于真正的爬蟲公司而言,這些參數(shù)的調(diào)優(yōu)對(duì)他們而言至關(guān)重要,甚至能決定公司的核心競(jìng)爭(zhēng)力。為此,我們需要積極儲(chǔ)備相關(guān)知識(shí),說(shuō)不定會(huì)在未來(lái)有一天用的上。