Scrapyの概要

Scrapyは、Webサイトをクロールし、データマイニング、情報処理、アーカイブなどの幅広い有用なアプリケーションに使用できる構造化データを抽出するためのアプリケーションフレームワークです。

Scrapyはもともと Webスクレイピング 用に設計されていましたが、API(Amazon Associates Web Services など)または汎用Webクローラーとしてデータを抽出するためにも使用できます。

Spiderサンプルのウォークスルー

Scrapyが提供してくれるものを示すために、簡単なSpiderの実行例を紹介します。

ウェブサイト http://quotes.toscrape.com からページネーションを辿って引用を抽出するSpiderのコードは次のとおりです:

import scrapy


class QuotesSpider(scrapy.Spider):
    name = 'quotes'
    start_urls = [
        'http://quotes.toscrape.com/tag/humor/',
    ]

    def parse(self, response):
        for quote in response.css('div.quote'):
            yield {
                'text': quote.css('span.text::text').get(),
                'author': quote.xpath('span/small/text()').get(),
            }

        next_page = response.css('li.next a::attr("href")').get()
        if next_page is not None:
            yield response.follow(next_page, self.parse)

このコードを quotes_spider.py といった名前で保存し、runspider コマンドでSpiderを実行してください:

scrapy runspider quotes_spider.py -o quotes.json

終了すると引用リストが quotes.json というJSON形式のファイルに保存されます。これは次のような内容になります(読みやすくするために再フォーマットしています)。

[{
    "author": "Jane Austen",
    "text": "\u201cThe person, be it gentleman or lady, who has not pleasure in a good novel, must be intolerably stupid.\u201d"
},
{
    "author": "Groucho Marx",
    "text": "\u201cOutside of a dog, a book is man's best friend. Inside of a dog it's too dark to read.\u201d"
},
{
    "author": "Steve Martin",
    "text": "\u201cA day without sunshine is like, you know, night.\u201d"
},
...]

何か起きたのか?

scrapy runspider quotes_spider.py コマンドを実行すると、Scrapyは該当のSpider定義を探して、クローラーエンジンを通して実行します。

クロールが開始すると、 start_urls 属性で定義されたURL(この場合は humor カテゴリーのURLのみ)にリクエストを行い、responseオブジェクトを引数としてデフォルトのコールバックメソッド parse が呼び出されます。parse コールバックでは、CSSセレクタを使用して引用テキストの要素をループし、抽出された引用と作者でPythonのdictを生成し、次のページへのリンクを探し、コールバックと同じ parse メソッドを使用して次ページへのリクエストをスケジューリングします。

ここにScrapyの利点の1つがあります。リクエストは スケジューリングされ、非同期に処理されます 。つまり、リクエストが完了するのを待つ必要はなく、その間に別のリクエストを送信したり、他の処理を行うことができます。これは、リクエストが失敗した場合や、処理中にエラーが発生した場合でも、他のリクエストが続行できることを意味します。

これにより、非常に高速なクロールが可能になります(複数の同時リクエストをフォールトトレラントな方法で送信できます)。また、Scrapyを使用すると、 いくつかの設定 でクロールの礼儀正しさを制御できます。各リクエストごとのダウンロード遅延を設定したり、ドメインまたはIPごとに平行リクエストの量を制限したり、クロール速度を自動的に調整する拡張機能を使用する ことができます。

注釈

フィードのエクスポート を使用してJSONファイルを生成したり、エクスポート形式(XMLやCSVなど)やストレージバックエンド(FTPや Amazon S3 など)を簡単に変更することができます。Itemパイプライン を作成してItemをデータベースに格納することもできます。

それ以外には?

ここまで、Scrapyを使用してウェブサイトからアイテムを抽出して保存する方法を見てきましたが、これはほんの一部に過ぎません。Scrapyは、簡単で効率的なスクレイピングを作成するための強力な機能を、以下のように多数提供しています。

  • 拡張CSSセレクタとXPath式を使用し、正規表現を使用して抽出するヘルパーメソッドを併用して、HTML/XMLのソースからデータを 選択および抽出 する組み込みのサポート。
  • CSSやXPath式を試してデータを抽出するための インタラクティブなシェル (IPython対応)。Spiderの作成やデバッグに非常に便利です。
  • 複数の形式(JSON, CSV, XML)で フィードのエクスポート を生成し、それらを複数のバックエンド(FTP、S3、ローカルファイルシステム)に格納するための組み込みサポート。
  • 国外、非標準、壊れたエンコーディング宣言を扱うための強力なエンコーディングのサポートと自動検出。
  • 強力な拡張性 により、 シグナル と明確に定義されたAPI(ミドルウェア、 拡張機能パイプライン )を使用して、プラグインとして独自の機能を追加することができます。
  • 幅広い組み込み拡張機能とハンドリング用のミドルウェア:
    • クッキーとセッション処理
    • 圧縮、認証、キャッシュなどのHTTP機能
    • ユーザーエージェントのなりすまし
    • robots.txt
    • クロール深度の制限
    • その他
  • Scrapyプロセス内で動作するPythonコンソールにフックするための Telnetコンソール 、クローラの内部調査とデバッグ
  • さらに、サイトマップ やXML/CSVフィードからWebサイトをクロールするための再利用可能なSpider、抽出したアイテムに関連付けられた画像(または他のメディア)を 自動的にダウンロード するメディアパイプライン、DNSリゾルバのキャッシュなど、他にもたくさんの機能があります。

次のステップは?

次のステップは、 Scrapyをインストール して、チュートリアル に従って本格的なScrapyプロジェクトを作成し、そして コミュニティに参加する ことです。興味を持って頂いて感謝します!