コンテンツにスキップ

Python/Scrapy

出典: フリー教科書『ウィキブックス(Wikibooks)』

Python/Scrapyの概要

[編集]

Scrapy(スクレイピー)は、Pythonで利用できるオープンソースのWebスクレイピング(Webクローリング)フレームワークであり、ウェブサイトからデータを収集するための高度なツールです。Scrapyは、ウェブサイトのページを自動的にダウンロードし、指定したデータを抽出して保存することができます。Scrapyは、高度なスクレイピングタスクを効率的に実行するために設計されており、非常に大きなスケーラビリティを持ち、さまざまなWebサイトからのデータ収集に利用されています。

主な機能

[編集]

1. データの抽出: Scrapyは、XPathやCSSセレクタを使用して、HTMLやXMLからデータを抽出することができます。また、正規表現を使ったデータの抽出もサポートされています。

2. 自動化: Scrapyは、スパイダー(Spider)と呼ばれる自動化されたクローラーを定義することができます。スパイダーは、ウェブサイトの構造を定義し、指定されたデータを収集します。

3. パイプライン: Scrapyは、収集したデータを指定された形式(CSV、JSON、XMLなど)で保存するためのパイプラインを提供します。

4. ミドルウェア: Scrapyは、リクエストやレスポンスを処理するための拡張性のあるミドルウェアをサポートしています。これにより、HTTPヘッダのカスタマイズやプロキシの設定などが可能です。

5. ダウンロード制御: Scrapyは、ダウンロードの速度制御や並列ダウンロード、リトライ設定など、ダウンロードの制御を細かく設定することができます。

Python/Scrapyのコード例

[編集]

シンプルなスクレイピングの例

[編集]
import scrapy

class MySpider(scrapy.Spider):
    name = "myspider"
    
    # クロール対象となるURLのリスト
    start_urls = [
        'http://example.com/page1',
        'http://example.com/page2',
    ]
    
    def parse(self, response):
        # ページから特定のデータを抽出する処理
        data = response.css('div.content').get()
        yield {
            'data': data,
        }

パイプラインの使用例

[編集]
import scrapy
import csv

class MySpider(scrapy.Spider):
    name = "myspider"
    
    # クロール対象となるURLのリスト
    start_urls = [
        'https://ja.wikibooks.org/wiki/Python',
        'https://ja.wikibooks.org/wiki/Python/標準モジュール/urllib',
        'https://ja.wikibooks.org/wiki/Python/BeautifulSoup',
        'https://ja.wikibooks.org/wiki/Python/Flask',
    ]
    
    def parse(self, response):
        # ページからデータを抽出する処理
        data = response.css('.mw-page-title-main').get()
        yield {
            'data': data,
        }

    def closed(self, reason):
        # スクレイピングが終了したらデータをCSVファイルに出力する処理
        with open('wikibooks_data.csv', 'w', newline='', encoding='utf-8') as csvfile:
            fieldnames = ['data']
            writer = csv.DictWriter(csvfile, fieldnames=fieldnames)

            writer.writeheader()
            for item in self.crawler.stats.get_stats()['myspider']['item_scraped_count']:
                writer.writerow({'data': item['data']})
#ここだけの話なんだけど、このコードはまだ検証していないんだ。検証求む

ミドルウェアのカスタマイズ

[編集]
from scrapy.downloadermiddlewares.httpcompression import HttpCompressionMiddleware

class MyMiddleware(HttpCompressionMiddleware):
    def process_response(self, request, response, spider):
        # レスポンスの処理をカスタマイズする
        # 例: レスポンスの内容を変換する
        response._body = response.body.replace(b'old', b'new')
        return super().process_response(request, response, spider)

これらのコード例は、Scrapyの基本的な機能を示しています。Scrapyは、高度なWebスクレイピングタスクを効率的に実行するための強力なフレームワークであり、データ収集やウェブスクレイピングの自動化に役立ちます。詳細な使い方や機能については、公式ドキュメントを参照することをおすすめします。