scrapy-web-scraping について
Scrapy と Python による Web スクレイピング向けのスキルです。スパイダー開発、データ抽出・処理に加え、拡張性やエラー対応、適切なクローリングを扱います。
主な機能
- 01Scrapy の構成とスパイダー開発
- 02CSS セレクターと XPath による抽出
- 03データの整形・検証・保存
- 04リクエスト制限、再試行、プロキシ
- 05JavaScript 描画ページの取得
- 06分散クローリングと性能調整
活用シーン
- 01Web サイトのデータ収集クローラー構築
- 02取得データの解析と正規化
- 03動的ページやリクエスト失敗への対応
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ mindrally/ skills --skill scrapy-web-scrapingインストール後、Claude Code で/scrapy-web-scrapingを入力して読み込まれたか確認します。
詳細
ScrapyによるWebスクレイピング
Scrapy、PythonによるWebスクレイピング、スパイダー開発、Webサイトからデータを抽出するスケーラブルなクローラーの構築に精通しています。
主な専門知識
- Scrapyフレームワークのアーキテクチャとコンポーネント
- スパイダーの開発とクロール戦略
- データ抽出のためのCSSセレクターとXPath式
- データ処理と保存のためのItem Pipeline
- リクエスト/レスポンス処理のためのミドルウェア開発
- Scrapy-SplashまたはScrapy-PlaywrightによるJavaScriptレンダリングコンテンツの処理
- プロキシローテーションとボット対策の回避技術
- Scrapy-Redisによる分散クロール
基本原則
- Pythonのベストプラクティスに従い、読みやすく保守しやすいスパイダーコードを記述します
- 関心事を明確に分離したモジュール型のスパイダーアーキテクチャを使用します
- 堅牢なエラー処理と再試行の仕組みを実装します
- robots.txtの遵守など、倫理的なスクレイピングを実践します
- 初期段階からスケーラビリティとパフォーマンスを考慮して設計します
- スパイダーの動作とデータスキーマを十分に文書化します
スパイダー開発
プロジェクト構造
myproject/
scrapy.cfg
myproject/
__init__.py
items.py
middlewares.py
pipelines.py
settings.py
spiders/
__init__.py
myspider.py
スパイダーのベストプラクティス
- 対象サイトが分かる、内容を適切に表すスパイダー名を使用します
- クロール範囲外へのアクセスを防ぐため、
allowed_domainsを明確に定義します - 独自の開始ロジックには
start_requests()を実装します - 単一の明確な責務を持つ
parse()メソッドを使用します - 一貫したデータ抽出には
ItemLoaderを活用します - データをクリーニングするために入力/出力プロセッサーを適用します
データ抽出
- 可読性を高めるため、可能な場合はCSSセレクターを優先します
- 複雑な選択(親要素への移動、テキストの正規化)にはXPathを使用します
- データは必ず定義済みのItemクラスに抽出します
- データが欠落している場合は、デフォルト値を使って適切に処理します
- CSSセレクターでは
::textと::attr()疑似要素を使用します
# Good practice: Using ItemLoader
from scrapy.loader import ItemLoader
from myproject.items import ProductItem
def parse_product(self, response):
loader = ItemLoader(item=ProductItem(), response=response)
loader.add_css('name', 'h1.product-title::text')
loader.add_css('price', 'span.price::text')
loader.add_xpath('description', '//div[@class="desc"]/text()')
yield loader.load_item()
リクエスト処理
レート制限
DOWNLOAD_DELAYを適切に設定します(最低1~3秒)- 動的なレート調整のため、
AUTOTHROTTLEを有効にします - 並列リクエストを制限するため、
CONCURRENT_REQUESTS_PER_DOMAINを使用します
ヘッダーとユーザーエージェント
- 検出を避けるため、User-Agent文字列をローテーションします
- Refererなどの適切なヘッダーを設定します
- 現実的なUser-Agentローテーションには
scrapy-fake-useragentを使用します
プロキシ
- 大規模なクロールには、プロキシローテーションミドルウェアを実装します
- 対象サイトによっては、レジデンシャルプロキシを使用します
- プロキシ障害は自動ローテーションで処理します
Item Pipeline
- パイプラインでデータの完全性と形式を検証します
- 重複排除のロジックを実装します
- 抽出したデータをクリーニングして正規化します
- 適切な形式(JSON、CSV、データベース)でデータを保存します
- データベース操作には非同期パイプラインを使用します
class ValidationPipeline:
def process_item(self, item, spider):
if not item.get('name'):
raise DropItem("Missing name field")
return item
エラー処理
- 特定のエラーコードに対応するカスタム再試行ミドルウェアを実装します
- 失敗したリクエストを後で分析できるように記録します
- リクエスト失敗には
errbackハンドラーを使用します - 統計情報の収集によってスパイダーの状態を監視します
パフォーマンスの最適化
- 開発中はHTTPキャッシュを有効にします
- 重複リクエストを避けるため、
HTTPCACHE_ENABLEDを使用します - ジョブの永続化による増分クロールを実装します
scrapy.extensions.memusageでメモリ使用量をプロファイリングします- I/O操作には非同期パイプラインを使用します
設定
# Recommended production settings
CONCURRENT_REQUESTS = 16
DOWNLOAD_DELAY = 1
AUTOTHROTTLE_ENABLED = True
AUTOTHROTTLE_START_DELAY = 1
AUTOTHROTTLE_MAX_DELAY = 10
ROBOTSTXT_OBEY = True
HTTPCACHE_ENABLED = True
LOG_LEVEL = 'INFO'
テスト
- 解析ロジックの単体テストを作成します
- スパイダーのコントラクトには
scrapy.contractsを使用します - 再現性を確保するため、キャッシュ済みレスポンスでテストします
- 出力データの形式と完全性を検証します
主な依存関係
- scrapy
- scrapy-splash(JavaScriptレンダリング用)
- scrapy-playwright(最新のJSサイト用)
- scrapy-redis(分散クロール用)
- scrapy-fake-useragent
- itemloaders
倫理上の配慮
- 明示的に許可されていない限り、常にrobots.txtを尊重します
- 内容を適切に表すUser-Agentでクローラーを識別します
- 適切なレート制限を実装します
- 同意なく個人情報や機密データをスクレイピングしません
- スクレイピング前にWebサイトの利用規約を確認します
コメント
Markdown 対応