ビッグデータを自動で集める?!ウェブスクレイピングをする方法~前編

Python大好きなAI研究所のショウと申します。

機械学習を行おうとする際に、学習データをどのように集めればいいのか悩むと思います。
今回は、学習データを集める手法の一つ、「」についてご紹介します。

ウェブスクレイピングとは?

WEB上には様々な機械学習用のデータセットが用意されていますが、いくら探しても必要なデータセットがない場合、スクレイピングという選択肢があります。

スクレイピングとは、ウェブサイトを経由して情報を収集し、活用することを言います。
しかし、スクレイピングは最終手段と思っていただいたほうがいいかもしれません。
スクレイピングに時間をかけるより、すでにあるデータを分析したり、機械学習用にデータを整理する時間を確保したほうが「目的達成」への最短距離だからです。

さらに、スクレイピングはやり方を間違えれば、相手のサーバーに負担をかける行為なので、法律的な問題にひっかかる可能性があります。
スクレイピングをする前に探してるデータがすでにWEB上にまとめてアップロードされているか、JSONやXMLで取得できるようになってないか探しましょう。

スクレイピングの問題点、法律的な考え方はこちらを御覧ください。

PythonでWEBスクレイピングする方法

Pythonスクリプトを使ってスクレイピングする方法を知っておけばいざとなったときに便利です。
Pythonでは色々なウェブスクレイピングするためのモジュール、ライブラリが揃ってますので、比較的簡単にデータを集めることができます。

代表的なのはScrapy、RequestsやUrllibなどがあります。
今回は、ある理由から、Seleniumを取り上げてみます。

Seleniumとは?

自動でブラウザを操作することで、Webサイトの動作のテストを行うためのツールです。
本来は、ブラウザに表示されている要素を取得することで、想定している表示になっているかなどをチェックするための、動作テスト用ツールです。

通常のスクレイピングでは、最近多くのサイトで実装されている、非同期技術(スクロールしていかなければコンテンツが表示されない)が使ってあるため、requestsでリクエストをWebサイトに送って、返ってきたレスポンスをbeautifulsoup4で読み込む、というような定番のスクレイピング方法では対応できないことが多いです。
そのため、今回はSeleniumを使う方法をご紹介していきます。

Seleniumを使う方法

Seleniumは実際にブラウザを自動で操作されているのを見ながら、ブラウザ開発者ツールの検証機能を用いて、直感的にコードを書いていけます。
たとえば、リンク先をクリックするとき、Seleniumでは「取得したWebエレメント.click()」で実現できます。

どんなスクレイピング方法を使用するにしろ、まず、やるべきことはスクレイピングしたいサイトのHTMLの構造を知ることなので、HTMLソースを調べて、取得したいコンテンツがどんなHTMLの構造になっているか、タグが分かったらClass名から把握するのか、それともIDか、Value値からか・・・
他のモジュールやライブラリだと、一旦「aタグのhref属性から、リンク先を取り出して、それからリンク先にとんで」など細かく考えていかなければなりません。

こういった作業をするのに、Seleniumは簡単で最適なのです。

そして、IE、Chrome、Firefoxなどの主要なブラウザが操作できるのもいいところです。
ヘッドレス機能(ブラウザを表示させないで、ブラウザを操作させる)もあります。

Seleniumである程度HTML構造や、どのようにデータを取得していけばいいのかを試したのなら、のちのちもっと高速で巨大なデータを取得するため、Scrapyに切り替えることも簡単にできます。

Scrapyも対話的な環境のScrapy Shellはありますが、ブラウザ開発者ツールの検証機能で確かめたほうが、素早く正確です。

いよいよ実装!

大分前置きが長くなりましたが、論よりPythonコードです。

今回は、

架空の不動産ポータルサイト(なぜ架空かは、ご想像にお任せします。)から東京23区の、港区、千代田区、中央区の最新賃貸物件情報を集める。

ということをやってみましょう。

架空ですが、実際のモデルが存在します。
ここでのSeleniumを使ったスクレイピングの方法は他のサイトにも応用できるので、ご安心を。

そして、組み立て方は以下になります。

  1. どのサイトから、どんな情報をとってくるか考える。
  2. SeleniumからChromeブラウザを動かせるようにする。
  3. WebDriverElementを取得し、そのエレメントに対する動作を命令していく。
  4. 情報を取得していき、其の三と交互に繰り返す。
  5. 一通り、部分ごとに動かせていることを確認したら、全体を1から動かす。
  6. 例外が発生した箇所などを修正していく。

…と、長くなったので、前編はここまで。
後編もお楽しみに!

最新情報をチェックしよう!