スクレイピングする際の手順、注意点、テクニック

スクレイピング
この記事は約10分で読めます。

私のサイトでは株価の分析をするためにいくつかのページからデータを取得するプログラムを紹介しております。

ここでは、スクレイピングを行うための手順を紹介していきたいと思います。
※ここではスクレイピングとクローリングはほぼ同じものとして考えています。

スポンサーリンク

スクレイピングを行う際の手順

スクレイピングを行う際の手順は以下になります。

  1. 対象サイトを決める
  2. 対象サイトがスクレイピングを禁止していないか確認する
  3. 対象サイトのHTML構造を見る
  4. 取得したい要素のXPathを見つける
  5. プログラムを書く

今回は、流れを見るだけなので、プログラムは書きません。あくまでどうやって取得するかの流れを見ていきます。

対象サイトを決める

今回は、私が個人的に作成している以下のDashboardサイトから株の銘柄リストを取得するということを考えたいと思います。

対象サイトがスクレイピングを禁止していないか確認する

次に対象のサイトがスクレイピングを禁止していないか確認します。確認方法は大きく2つあります。

  1. サイトのどこかにデータを取得することを禁止するような文章が書いている
  2. robots.txtを確認する

サイトのどこかにデータを取得することを禁止するような文章が書かれている

スクレイピングは、やろうと思えば1秒間にものすごい数のリクエストを対象のサイトに投げることができます。すると、対象のサイトのサーバーに負荷がかかり、サーバーが停止してしまうというようなことが発生します。

このようなことを避けるためにサイトによっては明確にスクレイピングを禁止しているところもあります。例えば、有名なところであればYahooのサイトは以下のページに記載されている通りスクレイピングを明確に禁止しています。

ですので、スクレイピングを実施する際は対象のサイトが禁止していないかよく確認してからにしましょう。

robots.txtを確認する

もう一つ、スクレイピングが禁止されているかを確認する方法としてrobots.txtというものがあります。

robots.txtの見方はこちらのサイトがわかりやすいので、そちらを参照していただければと思います。robots.txtにはスクレイピングして良いかどうか、して良い場合はどのページをスクレイピングしてよいかが記述されています。

robots.txtの有無を確認するためには、対象のサイトのトップURLの後ろにrobots.txtとつければ良いです。

yahooであれば、https://www.yahoo.co.jp/robots.txtです。見るとシンプルにUser-agent:*と書かれていますが、これがいかなる人もスクレイピング禁止ということです。

サイトによっては、robots.txtを作成していないサイトもあります。例えばこちらのサイトはhttps://s.fudousan.or.jp/robots.txtにアクセスしてもNot Foundと表示されます。
こうゆうページは基本的にはスクレイピングしても問題ないということになりますが、とはいえ、あまりサーバーに負荷がかかるようなアクセスをしないように配慮するべきであります。

今回スクレイピングする私のサイトであればhttps://www.cluster-dashboard.com/robots.txtですが、勝手にリダイレクトされるようになっており、表示されません。特にスクレイピングを禁止しているわけではありません。

対象サイトのHTML構造を見る

スクレイピングの良し悪しを確認できたので、次は対象サイトのHTML構造を見ていきます。

HTMLとは

ご存じない方のために簡単に説明するとWebページというのはHTML(&CSS)という言語によって作成されています。そして、HTML(&CSS)の書き方により、ページのレイアウトや装飾を行っています。(CSSは装飾がメインです)スクレイピングというのはそのHTMLの構造読み解いて、必要な情報を取得する作業になります。

Webサイトを作る際には、HTML言語をしっかり覚えたほうが良いですが、スクレピングをする際には、基本的なことさえ理解していればよいので、HTML&CSSの詳細な説明は割愛します。
ざっくり理解するならこちらのサイトがわかりやすいかと思います。

HTML構造の確認方法

HTML構造を見るには、Chomerの場合、「右上の設定ボタン」→「その他のツール」→「デベロッパーツール」、もしくは画面上で右クリックして「検証」をクリックします。
Safariの場合は、右クリックして、「要素の詳細を表示」を押せばいけます。

chromeの場合1
chromeの場合2

すると以下のような画面が現れると思います。使用するのは右上の赤丸で囲っているElementsというタブになるので、そちらを押してください。

デベロッパーツール

HTMLの基本構成

HTMLはタグと呼ばれるもので囲まれた領域に意味を与えていくようになっており、例えば<html>〜</html>で挟まれた文章は、htmlの内容=webページに関する情報ですよということになります。
そして、HTMLは大まかに、以下のようにhtmlタグの中に、headタグとbodyタグが含まれるような構成になっています。

そして、我々がweb画面内で見ている情報は基本的にbodyに書かれている内容になります。headにかかれている内容は、webサイトの管理者用の内容になるので、スクレイピングをする際には特に気にする必要はありません

データ(要素)の場所を表すXPathについて

ここで、もう一つスクレイピングをする上で知っておきたいXPathについて簡単に書いておきます。

さきほど、bodyタグの中にWeb画面の情報が書かれると書きましたが、それらの情報は、様々なタグ(divタグ、tableタグ、trタグ、tdタグ.etc)によって囲まれて階層的に記述されます。この階層的な構造を表すものをXPathと呼び、下のような表記で表されます。

/html/body/div/div/div[3]/div[2]/div/div[6]/div/div/h5

この表記は、htmlタグの中のbodyタグの中のdivタグの中のdivタグの中の…h5タグの情報(通常要素と言います)という意味になります。イメージとしては、普段皆さんが使うパソコンのフォルダやファイルのパスと同じようなものです。

もう少し詳細なXPathの説明はこちらのサイトをご参照ください。

スクレピングではこのXPathを使って要素を取得していくことになります。

取得したいデータ(要素)のXPathを見つける

今回はhttps://www.cluster-dashboard.com/の下方にある対象銘柄一覧のテーブルを取得したいとします。

そのためにはHTMLの構成を調べてXPathがわかれば良いのですが、このXPathを自力で探すのは結構たいへんです。そこで、先程のデベロッパーツールを使用すると対象のテーブルのXPathを簡単に調べることができます。

下図のようにElementsタブの2つ左隣にある四角に矢印がついたボタンをクリックします。するとボタンが青く光ります。この状態で、左のWebサイトの画面の自分が取得したい要素をクリックします。

するとWebブラウザ画面が図のように青くなると同時にElments内に自分が選択している箇所のタグの部分がハイライトされるようになります。

その状態で、Elements内の対象のタグの箇所を右クリックします。
すると、下図のようにいくつか選択肢が現れるので、その中の「Copy」→「Copy full XPath」をクリックします。

こうすることで、対象の要素のXPathを取得することができます。得られたXPathは以下のようになっているとおもいます。

/html/body/div/div/div[3]/div[2]/div/div[6]/div/div/h5

実は先程示した例で示したものですね。

プログラムを書く

XPathが取得できれば、あとはプログラムでWebページにアクセスした後、XPathを指定してテキストデータや画像データを取得すれば良いだけです。

ここで、Pythonを使ってスクレイピングのプログラムを書く場合、有名なモジュールとしてBeautiful SoupとSeleniumがあります。個人的にはこの2つを使えればだいたいのWebサイトをスクレイピングできると思います。

2つのモジュールはそれぞれ特徴があり、Beautiful Soupは使いやすいが静的なWebサイトにしか使えない。Seleniumは動的なWebサイトにも使えるが、やや扱いが難しいといった感じです。

私は、簡単なWebサイトはBeautiful Soup、複雑なサイトはSeleniumでスクレイピングという感じで使い分けています。

実際のプログラムの書き方は基本的な書き方は後ほど紹介したいと思います。

おすすめ書籍

スクレイピングに関してはこちらの書籍がおすすめです。

コメント

タイトルとURLをコピーしました