この記事は、scrapy 2.6 バージョンの説明に基づいています。
序文
半月にわたるパラメーター調整の後、Scrapy で一般的に使用される構成と練習方法をいくつか整理しました (すべて血と涙の TAT からの教訓)
設定手順
settings.py の共通設定
データベース接続、サードパーティの秘密キー、メール構成/Webhook およびその他の情報などのグローバル構成をこの場所に配置することをお勧めします。スパイダー関連の構成をこのファイルに配置することは推奨されません。
ROBOTSTXT_OBEY = False
CONCURRENT_REQUESTS = 16
CONCURRENT_REQUESTS_PER_DOMAIN = 16
CONCURRENT_REQUESTS_PER_IP = 16
DOWNLOAD_DELAY = 0
URLLENGTH_LIMIT = 2083
RETRY_ENABLED = True
COOKIES_ENABLED = True
REDIRECT_ENABLED = True
USER_AGENT = None
LOG_LEVEL = 'DEBUG'
LOG_FORMAT = '%(asctime)s [%(name)s] %(levelname)s: %(message)s'
LOG_FILE = None
LOGSTATS_INTERVAL = 60.0
EXTENSIONS = {
}
ITEM_PIPELINES = {
}
DEFAULT_REQUEST_HEADERS = {
}
SPIDER_MIDDLEWARES = {
}
蜘蛛/
すべてのスパイダーは BaseSpider を継承し、コンストラクターを書き換えて構成からスパイダーを初期化します。
同時実行の最大数、IP 同時実行の最大数、Cookie や追加の設定を有効にするかどうかなど、単一の Spider に関連する設定を Spider の Custom_settings に入れることをお勧めします。
import scrapy
class BaseSpider(scrapy.Spider):
def __init__(self, settings):
pass
@classmethod
def from_crawler(cls, crawler, *args, **kwargs):
spider = cls(crawler.settings, *args, **kwargs)
spider._set_crawler(crawler)
return spider
class DemoSpider(BaseSpider):
name = 'DemoSpider'
handle_httpstatus_list = []
custom_settings = {
'RETRY_ENABLED': False,
}
def __init__(self, settings):
super().__init__(settings)
ミドルウェア.py
すべての SpiderMiddleware は BaseSpiderMiddleware から継承し、DownloaderMiddleware は BaseDownloaderMiddleware から継承し、構成からミドルウェアを初期化するようにコンストラクターを書き換えます。
import signals
from utils import get_single_name
class BaseSpiderMiddleware:
"""
基础爬虫中间件, 含settings参数的构造方法
"""
def __init__(self, settings=None):
self.settings = settings
@classmethod
def from_crawler(cls, crawler):
s = cls(crawler.settings)
crawler.signals.connect(s.spider_opened, signal=signals.spider_opened)
return s
def process_spider_input(self, response, spider):
return None
def process_spider_output(self, response, result, spider):
for i in result:
yield i
def process_spider_exception(self, response, exception, spider):
spider.logger.warn('SpiderMiddleware %s, Spider %s, process exception: %s' % (get_single_name(self), spider.name, exception))
def process_start_requests(self, start_requests, spider):
for r in start_requests:
yield r
def spider_opened(self, spider):
spider.logger.info('SpiderMiddleware %s, Spider opened: %s' % (get_single_name(self), spider.name))
class BaseDownloaderMiddleware:
"""
基础下载中间件, 含settings参数的构造方法
"""
def __init__(self, settings=None):
self.settings = settings
@classmethod
def from_crawler(cls, crawler):
s = cls(crawler.settings)
crawler.signals.connect(s.spider_opened, signal=signals.spider_opened)
return s
def process_request(self, request, spider):
return None
def process_response(self, request, response, spider):
return response
def process_exception(self, request, exception, spider):
spider.logger.warn('DownloadMiddleware %s, Spider %s, process exception: %s' % (get_single_name(self), spider.name, exception))
def spider_opened(self, spider):
spider.logger.info('DownloadMiddleware: %s, Spider opened: %s' % (get_single_name(self), spider.name))
パイプライン.py
すべての Pipeline は BasePipeline を継承し、コンストラクターを書き換えて構成から Pipeline を初期化します。
構成読み込みパイプラインの初期化により、管理と保守が容易になります。
import signals
from utils import get_single_name
class BasePipeline:
"""
基础管道, 含settings参数的构造方法
"""
def __init__(self, settings=None):
self.settings = settings
@classmethod
def from_crawler(cls, crawler):
s = cls(crawler.settings)
crawler.signals.connect(s.spider_opened, signal=signals.spider_opened)
return s
def process_item(self, item, spider):
return item
def spider_opened(self, spider):
spider.logger.info('Pipeline: %s, Spider opened: %s' % (get_single_name(self), spider.name))
ユーティリティ/
追加の処理ツールをいくつか保管
__init__.py
def get_single_name(tp):
pass