settings.py ファイルは、Scrapy フレームワークでクロール関連の設定を構成するために使用されるファイルです。Scrapy では、グローバル変数の設定、ダウンロード遅延の構成、ua プールの構成、エージェントの設定、およびその他のクローラー関連の構成項目を含む、settings.py ファイルを変更することによって、クローラーの動作をカスタマイズできます。以下は、settings.py ファイルの詳細な説明と使用例です。
1. グローバル変数を設定する
settings.py ファイルでは、クロール プロセス全体で使用できるいくつかのグローバル変数を定義できます。たとえば、USER_AGENT 変数を定義して、リクエストの User-Agent ヘッダー情報を設定できます。
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
2. ダウンロード遅延の構成
settings.py ファイルで、DOWNLOAD_DELAY パラメーターを設定してクロール速度を制御することにより、ダウンロード遅延を構成できます。DOWNLOAD_DELAY の単位は秒で、1 以上の値を設定できます。例えば:
DOWNLOAD_DELAY = 1
3. UA プールを構成する
Web サイトがクローラーを識別できないようにするために、ユーザー エージェント プールをセットアップし、各リクエストで送信するユーザー エージェントをランダムに選択させることができます。USER_AGENT_POOL は、settings.py ファイルで次のように設定できます。
USER_AGENT_POOL = [
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3',
'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Firefox/78.0',
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebK...
]
次に、Spider でユーザー エージェントをランダムに選択して、リクエストを送信します。
from scrapy import Spider
from scrapy.utils.project import get_project_settings
from scrapy.utils.httpobj import urlparse_cached
class MySpider(Spider):
name = 'my_spider'
def __init__(self, name=None, **kwargs):
self.settings = get_project_settings()
def start_requests(self):
# ...
yield scrapy.Request(url, headers={'User-Agent': self.settings['USER_AGENT_POOL'][random.randint(0, len(self.settings['USER_AGENT_POOL'])-1)]})
4. プロキシを設定する プロキシを
介してクロールする必要がある場合は、settings.py ファイルで PROXIES パラメータを設定できます。例えば:
PROXIES = [
'http://proxy1.example.com:8888',
'http://proxy2.example.com:8888',
'http://proxy3.example.com:8888',
]
次に、リクエストを送信するエージェントを Spider でランダムに選択します。
from scrapy import Spider
from scrapy.utils.project import get_project_settings
from scrapy.utils.httpobj import urlparse_cached
class MySpider(Spider):
name = 'my_spider'
def __init__(self, name=None, **kwargs):
self.settings = get_project_settings()
def start_requests(self):
# ...
yield scrapy.Request(url, meta={'proxy': self.settings['PROXIES'][random.randint(0, len(self.settings['PROXIES'])-1)]})
5. その他のクローラー関連の設定項目
settings.py ファイルでは、ログ レベル、保存パス、クロールの深さなど、他のクローラー関連の設定項目も設定できます。一般的な構成項目の一部を次に示します。
# 日志级别
LOG_LEVEL = 'INFO'
# 爬虫名称
BOT_NAME = 'my_bot'
# 爬取深度限制
DEPTH_LIMIT = 3
# 是否遵循robots.txt
ROBOTSTXT_OBEY = True
# 是否启用缓存
HTTPCACHE_ENABLED = True
# 缓存过期时间
HTTPCACHE_EXPIRATION_SECS = 0
# 缓存存储路径
HTTPCACHE_DIR = 'httpcache'
# 缓存存储方式
HTTPCACHE_STORAGE = 'scrapy.extensions.httpcache.FilesystemCacheStorage'
これらは settings.py ファイル内の一般的な構成項目の一部にすぎません。必要に応じてさらに構成項目を追加または変更できます。さらに考えられる構成項目は次のとおりです。
6. カスタム拡張機能を有効にして構成する
Scrapy フレームワークを使用すると、開発者はカスタム拡張機能を作成してクローラの機能を強化できます。これらの拡張機能は、settings.py ファイルの EXTENSIONS パラメーターを使用して有効にし、構成できます。たとえば、カスタム拡張機能 MyExtension を有効にして構成するには、次のようにします。
EXTENSIONS = {
'myextension.MyExtension': 500,
}
7. 再試行回数の構成
クロール処理中にリクエストが失敗する場合がありますが、RETRY_TIMES パラメータと RETRY_HTTP_CODES パラメータを設定することで、自動再試行回数と HTTP 応答ステータス コードを制御できます。たとえば、最大再試行回数を 3 に設定し、500 と 502 が発生した場合にのみ再試行するには、次のようにします。
RETRY_TIMES = 3
RETRY_HTTP_CODES = [500, 502]
8. 同時リクエスト数の設定
リクエストを同時に送信することでクロール効率を向上させることができ、CONCURRENT_REQUESTS パラメータを設定することで同時リクエスト数を設定できます。たとえば、同時に 10 個のリクエストを送信するように設定するには:
CONCURRENT_REQUESTS = 10
9. ダウンローダー ミドルウェアとクローラー ミドルウェアの構成
Scrapy フレームワークは、リクエストと応答の処理中にカスタム操作を行うためのダウンローダー ミドルウェアとクローラー ミドルウェアを提供します。これらのミドルウェアは、DOWNLOADER_MIDDLEWARES パラメーターと SPIDER_MIDDLEWARES パラメーターを構成することで有効にして構成できます。たとえば、カスタム ダウンローダー ミドルウェア MyDownloaderMiddleware とクローラー ミドルウェア MySpiderMiddleware を有効にして構成するには、次のようにします。
DOWNLOADER_MIDDLEWARES = {
'myproject.middlewares.MyDownloaderMiddleware': 543,
}
SPIDER_MIDDLEWARES = {
'myproject.middlewares.MySpiderMiddleware': 543,
}
10. リクエスト ヘッダー情報の構成
DEFAULT_REQUEST_HEADERS パラメーターを設定することで、デフォルトのリクエスト ヘッダー情報を構成できます。たとえば、リファラーとクッキーを設定します。
DEFAULT_REQUEST_HEADERS = {
'Referer': 'http://www.example.com',
'Cookie': 'session_id=xxxxx',
}
11. リダイレクトを有効にするかどうかの構成
REDIRECT_ENABLED パラメーターを構成することで、リクエストのリダイレクトを有効にするかどうかを制御できます。たとえば、リダイレクトを無効にするには:
REDIRECT_ENABLED = False
12. 重複排除フィルタの構成
Scrapy フレームワークには、クロールされた URL をフィルタリングするための重複排除フィルタが組み込まれています。使用する重複排除フィルターは、DUPEFILTER_CLASS パラメーターを構成することで選択できます。たとえば、Redis ベースの重複排除フィルターを使用すると、次のようになります。
DUPEFILTER_CLASS = 'scrapy_redis.dupefilter.RFPDupeFilter'
これらは、settings.py ファイルで使用できる構成項目のほんの一部です。実際のニーズに応じて、Scrapy フレームワークが提供するさまざまな機能に従って settings.py ファイルをカスタマイズして、クローラのニーズを満たすことができます。