前書き
JavaでWebページを定期的に取得→分析→DB保存→WEB表示して、ちょっとネタ集めを自動化してみよう!
ということを簡易プログラムを作った時に「Ajaxで読み込まれるページ、どうすっぺ?」となったのでメモしておきます。
今回紹介すること
htmlunitを使ってWebページの要素を解析してみる!という内容です。
前準備
gradleとか使ってhtmlunitを使えるようにしておきましょう。
htmlunit使ってみましょう
早速ですがこんな感じです。
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とか使えばできるのでしょうか?