すべてのソースコード分析記事インデックスディレクトリポータル
[Scrapy Framework]バージョン2.4.0ソースコード:すべての構成ディレクトリインデックス
記事のディレクトリ
前書き
Scrapyフレームワークの下の設定構成ファイルの説明を解析します。
優先順位設定(降順)
さまざまなメカニズムを使用して設定を設定し、優先度リストを高から低に並べ替えます
- コマンドラインオプション
-s(または-set)コマンドラインオプションを使用して、1つ(または複数)の設定を明示的にオーバーライドします。
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()}")
設定には、拡張機能、ミドルウェア、およびプロジェクトパイプラインのCrawlerプロパティのfrom_crawlerメソッドに渡されるscrapy.crawler.Crawler.settingsを介してアクセスできます。
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'))
内蔵設定リファレンス
無駄な設定が多いので、こちらが一般的な設定です。設定の詳細を確認し、Scrapy2.4.0設定セクションに直接移動して
ください
基本構成
- プロジェクト名
デフォルトのUSER_AGENTはそれで構成され、ログレコードのログ名としても使用されます
つまり、createprojectコマンドを実行します
scrapy startproject Amazon
のプロジェクト名は自動的に作成され、変更する必要はありません
BOT_NAME = 'Amazon'
- アプリケーションパス
はデフォルトで変更なしで作成されます
SPIDER_MODULES = ['Amazon.spiders']
NEWSPIDER_MODULE = 'Amazon.spiders'
- User-Agentリクエストヘッダー
はデフォルトで変更する必要はありません
#USER_AGENT = 'Amazon (+http://www.yourdomain.com)'
- クローラープロトコルクローラープロトコル
に従うかどうかにかかわらず、通常、ウェブサイトはサフィックスを開いてrobots.txtを追加しますが、基本的に無視されるロボットプロトコルの説明があります。結局のところ、プロトコルに従うと、何でもクロールできます。
ROBOTSTXT_OBEY = False # 不遵循协议
- クッキー操作
是否支持cookie,cookiejar进行操作cookie,默认开启
#COOKIES_ENABLED = False
- 情報レコードの表示
Telnetは、現在のクローラー情報の表示、クローラーの操作などに使用されます。telnetipポートを使用してから、コマンドを使用して操作します。
#TELNETCONSOLE_ENABLED = False
#TELNETCONSOLE_HOST = '127.0.0.1'
#TELNETCONSOLE_PORT = [6023,]
- ヘッダー
Scrapyは、HTTPリクエストを送信するためにScrapyが使用するデフォルトのリクエストヘッダーです。これは通常、リダイレクト302、またはさまざまなWebサイトのリクエストヘッダーをランダムに置き換える必要がある単純なアンチクロールソリューションに使用されます。ランダムに変更されるリクエストヘッダーのセットを再作成することをお勧めします。これは、デフォルトではここでは変更されません。
#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同時設定単一IP
で処理できる同時要求の数。デフォルト値は0で、無制限を意味します。 - ゼロでない場合、CONCURRENT_REQUESTS_PER_DOMAINは無視されます。つまり、同時数の制限は、各ドメイン名ではなく、各IPに従って計算されます。
- この設定はDOWNLOAD_DELAYにも影響します。値がゼロでない場合、DOWNLOAD_DELAYのダウンロード遅延は各ドメインではなく各IPに制限されます。
#CONCURRENT_REQUESTS_PER_IP = 16
- スマートレート制限
同じURLのリクエストを遅らせる秒数。設定されていない場合、修正されます。
#DOWNLOAD_DELAY = 3
インテリジェントな制限速度/自動スロットル
説明はじめに
from scrapy.contrib.throttle import AutoThrottle
#http://scrapy.readthedocs.io/en/latest/topics/autothrottle.html#topics-autothrottle
目標を設定します:
- デフォルトのダウンロード遅延を使用するよりも、ターゲットサイトをクロールすることをお勧めします。
- スクレイプを最適なクロール速度に自動的に調整するため、ユーザーが自分でダウンロード遅延を最適な状態に調整する必要はありません。開発者は、許可される最大同時リクエストを定義するだけでよく、残りは拡張コンポーネントによって自動的に行われます。
実装:
- Scrapyダウンロードの遅延は、TCP接続を確立してからHTTPヘッダーを受信するまでの時間を計算することで測定されます。
- Scrapyはスパイダーコールバック関数の処理でビジー状態であるか、ダウンロードできない可能性があるため、マルチタスク環境でこれらの遅延を正確に測定することは困難です。これらのパラメータは事前に設定する必要があります。
速度制限アルゴリズム:
- 自動速度制限アルゴリズムは、次のルールに基づいてダウンロード遅延を調整します
- 応答を受信した場合、ターゲットサイトへのダウンロード遅延=応答を受信する遅延時間/ AUTOTHROTTLE_TARGET_CONCURRENCY
- 次のリクエストのダウンロード遅延は、ターゲットサイトのダウンロード遅延時間と過去のダウンロード遅延時間の平均に設定されます。
- 200応答に達しない場合、遅延を減らすことはできません。
- ダウンロード遅延は、DOWNLOAD_DELAYより小さくまたはAUTOTHROTHLE_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
這う深さと方法
- クローラーが
許可する最大深度現在の深度はメタを介して表示できます。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
- URL重複排除にアクセスする
# 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'