BLOGブログ
Javaでjsoupを使ってスクレイピングを行う方法-紹介編
こんにちは、エンジニアの川島です。
HTMLの解析をして情報を取得する、スクレイピングのプログラムを作成する機会があったので、ご紹介いたします。
見出し
スクレイピングをなぜ行うのか?
そもそも、HTML解析とも呼ばれるスクレイピングをなぜ行う必要があるのでしょうか?
一番身近な使用方法としては、「Amazonや価格.comなどの商品一覧から情報をまとめる」場合が考えられます。
複数の欲しい商品、たとえば自作PC用のCPUについて、商品ごとにメーカー、価格、コア数、クロック数、端子、購入ルート、到着までの日数などのデータをWebサイトから取得し、Excelにまとめることができれば比較がスムーズに行えます。
あるいは、Webサイトで表示されている現状のページと構築時に作成したページと比較する事で、ハッキングなどにより改変が行われていないかの確認もできます。
このように、スクレイピングを使う事で欲しいデータの取得や比較が容易に行えるようになるのです。
スクレイピングの難しさ
このように便利なスクレイピングですが、実際に行うとなると大変難しいものがあります。
それは、必要な情報を取り出したいと考えた時に、HTMLではどこに何の情報が入っているかが明確に示されていないため、簡単には行えないのです。
HTMLは、Webページの文書構造を定義するための言語であり、どんな情報がどこに入っているかを示すような仕様にはなっていません。
そのため、Webサイト毎に異なっているHTML構成を解析して、欲しい情報がどこに入っているかを探し出す必要があります。
今後、セマンティックWebが普及し、WebページがXML(HTMLをXML標準に対応させたXHTMLを含む)によって記述した文書に、RDFやOWLを用いたタグが付け加えられ、データの意味が記述されるようになるとスクレイピングは不要になるかもしれませんが、現在はそこまでの状況にはなっていません。
また、Webスクレイピングは場合によってはWebサイトの規約に反する可能性があり、APIの利用をするなどの対応が必要になりますので、実施をする前には対象となるWebサイトの規約を読んでから行うようにお願いいたします。
利用言語とライブラリ
今回は、私が得意なJavaを使い、ライブラリのjsoupを使用してHTML解析を行います。
PHPの場合だと、PHP Simple HTML DOM Parser、Goutte、phpQueryといったライブラリや、Perlの場合だと、Web::Scraper、LWP::UserAgent、Web::QueryといったCPANモジュールを使ってスクレイピングを行う事ができます。
HTML解析に便利なライブラリjsoup
今回使用するライブラリjsoupは、JavaのHTMLパーサーです。
jsoupのページに飛ぶと、以下の様に書かれています。
jsoup: Java HTML Parser
jsoup is a Java library for working with real-world HTML. It provides a very convenient API for extracting and manipulating data, using the best of DOM, CSS, and jquery-like methods.
jsoup implements the WHATWG HTML5 specification, and parses HTML to the same DOM as modern browsers do.
- scrape and parse HTML from a URL, file, or string
- find and extract data, using DOM traversal or CSS selectors
- manipulate the HTML elements, attributes, and text
- clean user-submitted content against a safe white-list, to prevent XSS attacks
- output tidy HTML
jsoup is designed to deal with all varieties of HTML found in the wild; from pristine and validating, to invalid tag-soup; jsoup will create a sensible parse tree.
日本語抄訳:HTML5にも対応し、HTMLをDOM、CSS、jQueryのメソッドを使って解析しデータを取得するライブラリ。
DOMを利用して解析し、指定したclassかidのタグの中身を、javaのオブジェクト配列に組み込んでから処理するという手法をメインで行います。
サンプルコードを見たところ、複数クラス(例:class=”foo bar”)にも対応していたので、使い勝手は悪くはなさそうです。
また、プログラムで処理することによって、「WebサイトのHTMLを読み込んで、解析した情報をcsvで出力する」ところまで一貫して行えるので、便利です。
jsoup以外でも解析可能
jsoup以外のJavaで使用できるオープンソースのHTMLパースライブラリは、他にもあります。
この中でjsoupを選択した理由は、以下になります。
- ドキュメントが多い
- 導入事例が多い
- 開発が継続して行われている
次は、実際に環境を準備してスクレイピングを行います。