mcpField
S
scrapy-web-scraping

scrapy-web-scraping

github.com/mindrallyデータ・データベース2872.0k 回インストール3 週間前に更新
リポジトリ

scrapy-web-scraping について

Scrapy と Python による Web スクレイピング向けのスキルです。スパイダー開発、データ抽出・処理に加え、拡張性やエラー対応、適切なクローリングを扱います。

主な機能

  1. 01Scrapy の構成とスパイダー開発
  2. 02CSS セレクターと XPath による抽出
  3. 03データの整形・検証・保存
  4. 04リクエスト制限、再試行、プロキシ
  5. 05JavaScript 描画ページの取得
  6. 06分散クローリングと性能調整

活用シーン

  1. 01Web サイトのデータ収集クローラー構築
  2. 02取得データの解析と正規化
  3. 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サイトの利用規約を確認します

コメント