天天看點

htmlunit做爬蟲繞過驗證碼抓取網站資料

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());

}

}

繼續閱讀