htmlunit 是一款開源的java 頁面分析工具,讀取頁面後,可以有效的使用htmlunit分析頁面上的内容。項目可以模拟浏覽器運作,被譽為java浏覽器的開源實作。這個沒有界面的浏覽器,運作速度也是非常迅速的。
利用htmlunit 抓取網站是非常友善的,抓取一個html網頁主要4行代碼。
//建立webclient對象,相當于浏覽器
final WebClient WebClient = new WebClient();
//構造一個URL,為待通路的位址
URL url = new URL("http://zhixing.court.gov.cn/search");
HtmlPage page= (HtmlPage)WebClient.getPage(url);
System.out.println(page.getTitleText());
但是我做的這個網站比較麻煩,這是一個查詢網站,每次查詢需要輸入驗證碼,考慮到要批量送出資料,是以準備利用爬蟲程式看看能不能繞過驗證碼來抓取資料。期初考慮的非常複雜,用python抓取了網頁上的驗證碼,然後二值化圖檔去噪生成生成驗證碼庫,然後設定門檻值去比對。。。。總之非常麻煩。找了很多方法,最後決定采用HtmlUnitl來做。
這個網站驗證碼比較Low。。。。驗證碼判斷是js判斷的,傳回true就送出表單,false就重新整理驗證碼,是以直接js執行送出表單操作就能夠繞過驗證碼,此外網頁執行表單送出操作後得到的結果是在一個frame裡,要擷取得到的結果還要去抓取frame重定向後的網頁,具體就不說了,簡單的把代碼貼出來。
public class Main {
public static void main(String[] args) throws Exception {
//testHtmlPage();
exescript();
}
public static void testHtmlPage() throws Exception{
//建立webclient對象,相當于浏覽器
final WebClient WebClient = new WebClient();
//構造一個URL,為待通路的位址
URL url = new URL("http://zhixing.court.gov.cn/search");
HtmlPage page= (HtmlPage)WebClient.getPage(url);
System.out.println(page.getTitleText());
}
public static void exescript()throws Exception{
WebClient webClient = new WebClient();
webClient.getOptions().setJavaScriptEnabled(true); //啟用JS解析器
webClient.getOptions().setRedirectEnabled(true);
//webClient.getOptions().setCssEnabled(false); //禁用css
webClient.getOptions().setTimeout(10000); //1000ms timeout
HtmlPage page= webClient.getPage("http://zhixing.court.gov.cn/search");
System.out.println(page.asXml());
System.out.println("---------------------------------");
ScriptResult result = page.executeJavaScript("document.getElementById(\"pname\").value=\"陳旭光\";$('#searchForm').submit();");
HtmlPage page2 = (HtmlPage)result.getNewPage();
HtmlPage framepage = (HtmlPage)page2.getFrameByName("contentFrame").getEnclosedPage();
System.out.println(framepage.asXml());
}
}