第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

首頁(yè) 慕課教程 Scrapy 入門教程 Scrapy 入門教程 Scrapy 配置介紹及常見(jiàn)優(yōu)化配置

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 中:
圖片描述

Scrapy的默認(rèn)配置文件

我們來(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_MIDDLEWARESDOWNLOADER_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>

圖片描述

調(diào)用 Scrapy 的郵件接口發(fā)送郵件

內(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_MIDDLEWARESSPIDER_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)有一天用的上。