Java HtmlUnit でコンテンツをフィルタする
HtmlUnit を簡易ブラウザエミュレータとして使う。
取得した Web ページを一部分書き換えたい。
Proxomitron などのプロキシサーバーを介して、フィルタリングするのもよい。
DOM の範囲で変更できる箇所なら、Document.Write でもよい。
JavaScript で URL を生成して、アクセスするものもある。
URL をアクセスするときにフィルタリングしたい。
import java.net.URL; import java.io.IOException; import com.gargoylesoftware.htmlunit.BrowserVersion; import com.gargoylesoftware.htmlunit.WebClient; import com.gargoylesoftware.htmlunit.html.HtmlPage; import com.gargoylesoftware.htmlunit.WebRequest; import com.gargoylesoftware.htmlunit.WebResponse; import com.gargoylesoftware.htmlunit.util.FalsifyingWebConnection; public class test { public static void main(String[] args) throws Exception { WebClient webClient = new WebClient(BrowserVersion.FIREFOX_3); new FalsifyingWebConnection(webClient) { @Override public WebResponse getResponse(WebRequest request) throws IOException { WebResponse response; if ( request.getUrl().toString().contains("hoge.js") ) { // 空のコンテンツを返す response = createWebResponse(request, "", "application/javascript", 200, "OK"); } else { response = super.getResponse(request); } return response; } }; HtmlPage page = (HtmlPage)webClient.getPage(new URL("http://www.hoge.com")); System.out.print(page.asText()); } }
取得したコンテンツを HtmlUnit 内で書き換える。
new FalsifyingWebConnection(webClient) { @Override public WebResponse getResponse(WebRequest request) throws IOException { WebResponse response = super.getResponse(request); String content = response.getContentAsString(); content = content.replaceAll("var i=12345", "var i=0"); response = replaceContent(response, content); return response; } };