LoginSignup
10
8

More than 5 years have passed since last update.

【Java】htmlunitでajaxページの要素を取得してみる

Last updated at Posted at 2015-04-27

前書き

JavaでWebページを定期的に取得→分析→DB保存→WEB表示して、ちょっとネタ集めを自動化してみよう!
ということを簡易プログラムを作った時に「Ajaxで読み込まれるページ、どうすっぺ?」となったのでメモしておきます。

今回紹介すること

htmlunitを使ってWebページの要素を解析してみる!という内容です。

前準備

gradleとか使ってhtmlunitを使えるようにしておきましょう。

htmlunit使ってみましょう

早速ですがこんな感じです。

sample.java

private String getAjaxPage(String url) throws FailingHttpStatusCodeException, MalformedURLException, IOException{
        WebClient webClient = new WebClient( BrowserVersion.FIREFOX_24);
        webClient.getOptions().setJavaScriptEnabled(true);
        webClient.setAjaxController(new NicelyResynchronizingAjaxController());
        webClient.waitForBackgroundJavaScript(10000);
        webClient.getOptions().setRedirectEnabled(true);
        webClient.getOptions().setThrowExceptionOnScriptError(false);
        webClient.getOptions().setCssEnabled(false);
        webClient.getOptions().setUseInsecureSSL(true);
        webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
        webClient.getCookieManager().setCookiesEnabled(true);
        HtmlPage page = webClient.getPage(url);
        // 後はごにょごにょしても良いけど、getメソッドって書いたのでpage.asXml()で終わってみる
        return page.asXml();
}

getOptions()系のすべてのメソッドは呼んで字のとおりです。

Selenium的に書くなら、要素が出現するまで、でタイムアウト設定という感じでしょうか。
Web crawlerのコードなのにテストコードみたいになりそうです。

取得した後に出来ること

実は、
HtmlPage page = webClient.getPage(url);
の後、JavaScriptみたいに
page.getElementById(elementId)とか、
page.getElementsByName(name)とかできます。

さらに、「煩雑でもいい!俺はJsoupで書きたい!」という方は、
page.asXml()
Jsoup.parse(String)
でDocumentに変更することで操作することもできます。

ちなみに作った簡易Web crawerではJsoupに戻して処理する方を採用しました。
構成は気持ち悪いですが、DB保存する前の分析とかを使いまわせるのが良かったです。

全然関係ないあとがき

Vert.Xがもう少し流行って情報増えたら使いたいなと思っています。
誰か書いて頂ければ嬉しいです!
Hello Worldとかチャットは作ってみたのですが、
まだ使いこなせない。。勉強していつか書きます。

まだ全然jsに慣れていないので、
近いうちにサーバーサイドJavaにreact組み込んでserver side renderingしてみようと思います。
Nashornとか使えばできるのでしょうか?

10
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
8