1. 程式人生 > >htmlunit做爬蟲繞過驗證碼抓取網站資料

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



}