*当ブログではアフェリエイト広告を利用しています。

python

【Python】初めてでもOK!Scrapyでスクレイピングをしてみよう。

スクレイピンg
momeq
ニャー
ニャー

最近、ウェブスクレイピングっていう言葉をよく聞くけど、それって何なんだにゃ?

モー
モー

ウェブスクレイピングは、ウェブサイトから情報を自動的に収集するテクニックのことをいうよ。

例えば、ニュースサイトから最新記事のタイトルを集めたり、オンラインショップから商品価格を抽出したりするんだ。

ニャー
ニャー

便利そう!でも、プログラミング初心者のでもできるのかにゃ?

モー
モー

実は、Scrapyというツールを使えば、誰でも簡単にウェブスクレイピングができるんだよ。

ニャー
ニャー

Scrapyって何なんだにゃ?

モー
モー

Scrapyは、Pythonで書かれたウェブスクレイピングのためのフレームワークだよ。

コーディングが少しできれば、簡単にデータを収集できるよ。

ニャー
ニャー

面白そう!でも、どうやって始めるのかにゃ?

モー
モー

それではScrapyでのスクレイピングを行う方法をみていこう。

Scrapyとは?

ScrapyはPythonで書かれた強力なオープンソースのウェブスクレイピングフレームワークです。

ウェブサイトから構造化データを抽出するために使われ、データマイニング、情報処理、歴史的アーカイブの作成などに応用されます。

Scrapyの特徴

  • 高速かつ効率的: Scrapyは非常に高速で、大規模なデータを効率的に処理できます。
  • 拡張可能: ユーザーは独自の機能を追加したり、既存のコンポーネントをカスタマイズすることで、さまざまなニーズに応えることができます。
  • 多様なデータ出力形式: JSON、CSV、XMLなど、様々な形式でデータを出力することができます。

Scrapyの利点

  • ユーザーフレンドリー: Pythonをベースにしているため、学習が容易であり、コードの可読性が高い。
  • 強力なセレクター: XPathやCSSを使用して、ウェブページからデータを効率的に抽出できます。
  • エラーハンドリングとロギング: エラー処理が容易で、詳細なログによりデバッグがしやすい。

Scrapyの応用例

  • 価格監視: オンラインショップの商品価格を定期的に監視。
  • ニュースアグリゲーション: 様々なニュースサイトから最新のニュース記事を収集。
  • ソーシャルメディア分析: ソーシャルメディアからのデータ抽出と分析。

Scrapyのインストールとプロジェクトの作成

システム要件の確認

  • Pythonのバージョン: ScrapyはPython 2.7とPython 3.5以上で動作します。Pythonのインストール状況を確認し、必要に応じてアップデートします。
  • 対応OS: Windows, macOS, Linuxなど、主要なオペレーティングシステムで利用可能です。

Scrapyのインストール

インストールコマンド:

pip install scrapy
# conda install scrapy <- Anacondaを使用する場合

Scrapyプロジェクトの初期設定

まずは、プロジェクトを作成したいフォルダ内等で、コマンドラインやターミナルを使い、プロジェクトを作成します。

コマンドは次のようになります。

scrapy startproject [プロジェクト名]

モー
モー

今回は「sample」というプロジェクト名で作ってみましょう。

scrapy startproject sample

すると、次のようなフォルダができます。

スパイダーの作成

スパイダーとは

スパイダーは、特定のウェブサイトからデータを抽出するためのScrapyの主要コンポーネントです。スパイダーは、ウェブページにアクセスし、必要なデータを収集し、それらをアイテムとして保存します。

モー
モー

このスパイダーがメインの内容です。基本的にはここに内容を書いていきます。

スパイダーの作成

それでは、スパイダーを作っていきましょう。作成済みのプロジェクトに入り、次のコードを打ちます。

scrapy genspider スパイダー名 URL

現在は「sample」というプロジェクトを作っているので、まずは移動します。

cd sample

次に、スパイダーを作りますが、対象のサイトを選ぶ必要があります。今回は、スクレイピング専用の練習サイトを使用します。

https://books.toscrape.com/

URLに指定する場合、最初の「https://」と最後の「/」を削除した「books.toscrape.com」を指定します。

スパイダー名を「spiders_sample」として作成すると次のようになります。

scrapy genspider spiders_sample books.toscrape.com

上記のように赤枠部分のスパイダーができていればOKです。

スパイダーは中のようになります。

# Scrapyライブラリをインポート
import scrapy

# SpidersSampleSpiderクラスを定義します。ScrapyのSpiderクラスを継承しています。
class SpidersSampleSpider(scrapy.Spider):
    # スパイダーの名前を設定します。この名前はスパイダーを識別するために使われます。
    name = "spiders_sample"

    # スパイダーがクロールを許可されているドメインのリストを定義します。
    allowed_domains = ["books.toscrape.com"]

    # スパイダーがクロールを開始するURLのリストを定義します。
    start_urls = ["http://books.toscrape.com/"]

    # parseメソッドを定義します。このメソッドは、レスポンスを受け取り、
    # スクレイピングするデータを抽出または追加のリクエストを発行するために使用されます。
    def parse(self, response):
        # 現時点では、このメソッドは何もしません(pass)。
        # 実際のデータ抽出のロジックは、このメソッド内に実装する必要があります。
        pass

実際にスクレイピングをしてみよう

スクレイピングに必要なもの

さて、スパイダーまで作成できたので、実際にスクレイピングをしてみましょう。

対象は「Books to Scrape」のタイトルです。

この部分を取得するには、この部分のxpathかcssを知り、次のようにスパイダー内のparse内に指定しなければなりません。

books = response.xpath([xpathを指定])

books = response.css([cssを指定])

xpathまたはcssの指定

xpath

XPathは、XML文書内のノード(要素、属性など)をナビゲートするための言語です。HTML文書にも適用でき、特定の要素を正確に指定するのに使います。

基本構文
  • /:ルートからの絶対パスを表します。
  • //:文書内の任意の位置からの相対パスを表します。
  • [@属性='値']:特定の属性を持つ要素を選択します。
  • /text():要素のテキストコンテンツを選択します。
使用例
  • 要素の選択:
    • 全ての<a>タグを選択: //a
    • idexampleの要素を選択: //*[@id='example']
  • 属性の抽出:
    • ある要素のhref属性を抽出: //a/@href
  • テキストの抽出:
    • ある要素のテキストを抽出: //a/text()
  • 複雑なクエリ:
    • 特定のクラスを持つすべての<div>タグ内の<a>タグ: //div[@class='example']/a

css

CSSセレクタは、HTML文書内の要素をスタイル指定するために使われるパターンです。Scrapyでは、これらのセレクタを使用して特定のHTML要素を選択することができます。

基本構文
  • タグセレクタ: 例 div, a
  • クラスセレクタ: 例 .classname
  • IDセレクタ: 例 #idname
  • 属性セレクタ: 例 [href]
使用例
  • 要素の選択:
    • 全ての<a>タグを選択: response.css('a')
    • classexampleの要素を選択: response.css('.example')
  • 属性の抽出:
    • ある要素のhref属性を抽出: response.css('a::attr(href)')
  • テキストの抽出:
    • ある要素のテキストを抽出: response.css('a::text')
  • 複雑なクエリ:
    • 特定のクラスを持つすべての<div>タグ内の<a>タグ: response.css('div.example a')

実際の確認方法

では、xpathやcssを確認する方法を見ていきましょう。

今回は、xpathをGoogle Chromeで確認してみます。

対象のHPを開き、「F12」を押すか、右クリックしから「検証」を選択して「開発者ツール」を開きます。

開発者ツールのコンソールタブを開き、ここで「Ctrl(macではcommand) + F」 を押して検索窓を開きます。

この部分に、検索したいxpathやcssを入力することで対象の部分がヒットするので、確認しながら該当部分を探します。

今回は「//h3/a/text()」と入力すると、テキスト部分だけがヒットします。

ちなみにcssの場合だと「」になります。

コードの記述

それでは、コードに記述してみましょう。

対象のコードから該当箇所を全て取得する場合「getall()」を使用します。

import scrapy


class SpidersSampleSpider(scrapy.Spider):
    name = "spiders_sample"
    allowed_domains = ["books.toscrape.com"]
    start_urls = ["http://books.toscrape.com/"]

    def parse(self, response):
        # xpathの場合
        books = response.xpath('//h3/a/text()').getall()
        # cssの場合
        # books = response.css('h3 a::text').getall()
        yield {
            'books': books
        }

yieldを指定することで、辞書型で対象を取得し、コンソールに表示できます。

では、実行していきましょう。次のコードで実行できます。

scrapy crawl spiders_sample

実行結果は色々書いてありますが、今回のコードの結果は次のとおりです。しっかりとタイトルが取得できていますね。

{'books': ['A Light in the ...', 'Tipping the Velvet', 'Soumission', 'Sharp Objects', 'Sapiens: A Brief History ...', 'The Requiem Red', 'The Dirty Little Secrets ...', 'The Coming Woman: A ...', 'The Boys in the ...', 'The Black Maria', 'Starving Hearts (Triangular Trade ...', "Shakespeare's Sonnets", 'Set Me Free', "Scott Pilgrim's Precious Little ...", 'Rip it Up and ...', 'Our Band Could Be ...', 'Olio', 'Mesaerion: The Best Science ...', 'Libertarianism for Beginners', "It's Only the Himalayas"]}

まとめ

以上が基本的なコードです。

まとめると次のとおりですね。

インストール

pip install scrapy

conda install scrapy <- Anacondaを使用する場合

プロジェクトの作成

scrapy startproject [プロジェクト名]

スパイダーの作成

scrapy genspider スパイダー名 URL

xpathかcssの確認

ブラウザの検証機能で対象のxpathかcssで確認し、コードを記述

実行

scrapy crawl spiders_sample

簡単ですよね。プロジェクトさえ作れれば、たった数行記述することでスクレイピングができます。

今回はScrapyの基本に焦点を当てましたが、このツールの可能性は無限大です。

学習を進めれば、単純なデータ抽出から複雑なページ遷移を伴うスクレイピング、さらにはSeleniumとの組み合わせによるログイン機能があるウェブサイトのデータ取得まで、幅広い活用が可能です。

また、取得したデータをきれいに整形し保存する方法も学べます。これらのスキルは、ウェブのデータを最大限に活用するための鍵となるでしょう。

しかし、スクレイピングの世界を探求する際には、常に法的な側面を念頭に置くことが重要です。

ニャー
ニャー

スクレイピングには、ウェブサイトの利用規約を遵守し、著作権やプライバシーに配慮する必要があるんだにゃ。

記事URLをコピーしました