Yahoo!ニュースをスクレイピング

前回は、Javaでウェブスクレイピングを行う意義と、その上で便利なjsoupというライブラリをプロジェクトに組み込むところまでを紹介した。今回から具体的なスクレイピング手法を紹介していく。その題材として、Yahoo!ニュースの記事の収集を事例とする。金融でもマーケティングでも、何らかの文章を集めて自然言語処理を施して分析というのは、機械学習の分野でポピュラーであり、ニーズがあると考えられるからだ。

RSSを配信するURLを集める

以下のURLがYahoo!ニュース日本語版におけるRSSのURL一覧が掲載されているページである。

https://headlines.yahoo.co.jp/rss/list

このURLのHTMLを取得するコードは、基本的には以下のようにすれば良い*1。Jsoupクラスのconnectメソッドに取得したいURL文字列を渡してやり、getメソッドを呼び出せば、HTMLドキュメントとそれを処理するメソッドを使えるDocumentインスタンスとして返ってくる。

connectメソッドはURLに接続する上で重要な設定を付加できるConnectionインスタンスを返し、数珠繋ぎのようにCookieやProxyなどを追加していく事ができる。以下では、ユーザーエージェント(userAgent)とタイムアウト(5000)を付加している。userAgentは利用しているブラウザのUAを文字列として渡してやれば、HTMLを見る際に便利である。タイムアウトはミリ秒である。(0にすると無制限になる。)

以下の4つのメソッドは、Jdoup Documentを扱う上で最も基本となるメソッドである。一つ目は先程引数として渡したURL、二つ目はhtmlの全文字列、三つ目はtitleタグの中身、四つ目はbodyタグの中身である。ウェブから取得したHTMLをいきなり解析しても良いが、先にhtmlを全て保存しておいて、後から解析する場合は、html()メソッドで取得できる文字列をファイルに保存しておけば良い。

htmlファイルをJsoup Documentとして読み込む場合は、以下のようにpaeseメソッドを使う。pathnameにはhtmlファイルを保存しているパスを渡し、第2引数はファイルの文字コード(ここではUTF-8)を渡してやれば良い。 また、parse(String html)メソッドにhtmlを文字列として渡してDocumentを生成する事も可能なので、HTMLの取得と解析を別スレッドに分けて行うといった方法も可能である。

次回は、このDocumentを使って、具体的に個別のタグを取得するなどの方法を紹介していく。

*1:チェック例外の処理は必要である。