爬蟲的自我解剖(抓取網頁HtmlUnit)

jopen 11年前發布 | 81K 次閱讀 爬蟲 網絡爬蟲

網絡爬蟲第一個要面臨的問題,就是如何抓取網頁,抓取其實很容易,沒你想的那么復雜,一個開源HtmlUnit包,4行代碼就OK啦,例子如下:

  • 1

    2

    3

    4
    </td>

    final  WebClient webClient= new  WebClient();

    final  HtmlPage page=webClient.getPage( "http://www.yanyulin.info" );

    System.out.println(page.asText());

    webClient.closeAllWindows();
    </div> </td> </tr> </tbody> </table> </div> </div> </div>

    在程序中寫上上面的4行代碼,運行,就可以得到煙雨林博客首頁的全部內容,上面代碼在運行的過程中會出現很多警告,出現這些警告的主要原因是由于以下兩點:

    1、HtmlUnitJavascript的支持不是很好

    2、HtmlUnitCSS的支持不是很好

    明白了上面的兩點后,將代碼重新改寫一下,該禁用的就禁用,同時禁用一些不必要的功能,也有利于提高程序的運行效率,再者說網絡爬蟲也不需要CSS的支持滴

    1

    2

    3

    4

    5

    6
    </td>

    final  WebClient webClient= new  WebClient();

    webClient.getOptions().setCssEnabled( false );

    webClient.getOptions().setJavaScriptEnabled( false );

    final  HtmlPage page=webClient.getPage( "http://www.yanyulin.info" );

    System.out.println(page.asText());

    webClient.closeAllWindows();
    </div> </td> </tr> </tbody> </table> </div> </div> </div>

    HtmlUnit的使用: 簡介:HtmlUnit說白了就是一個瀏覽器,這個瀏覽器是用Java寫的無界面的瀏覽器,正因為其沒有界面,因此執行的速度還是可以滴,HtmlUnit提供了一系列的API,這些API可以干的功能比較多,如表單的填充,表單的提交,模仿點擊鏈接,由于內置了Rhinojs引擎,因此可以執行Javascript

    作用:web的自動化測試(最初的目的),瀏覽器,網絡爬蟲

    重要API的使用 在介紹API的使用之前要先明白的一個問題是,WebClient,WebWindow,Page三者之間的關系,所有的頁面最終都是在一個 WebWindow對象里面,WebClient在創建時會自動的創建一個WebWindow對象,當調用getPage時會將新頁面加載到 WebWindow里,你可以理解成WebClient就是IE內核,WebWindow就是呈現頁面的瀏覽器窗口,三者之間的關系圖如下圖所示:

    1、模擬特定瀏覽器,也可以指定瀏覽器的相應版本(HtmlUnit最新版2.13現在可以模擬的瀏覽器有Chrome/FireFox/IE)

    1

    2
    </td>

    //模擬chorme瀏覽器,其他瀏覽器請修改BrowserVersion.后面

    WebClient  webClient= new  WebClient(BrowserVersion.CHROME);
    </div> </td> </tr> </tbody> </table> </div> </div> </div>

    2、查找特定元素,通過get或者XPath可以從HtmlPage中獲得特定的Html元素,如下例子

    方法一,通過get方法獲取

    1

    2

    3
    </td>

    HtmlPage page=webClient.getPage( "http://www.yanyulin.info" );

    //從[煙雨林博客]上獲取標簽hed的內容

    HtmlDivision div=(HtmlDivision)page.getElementById( "hed" );
    </div> </td> </tr> </tbody> </table> </div> </div> </div>

    方法二,通過XPath獲取,XPath通常用于無法通過Id搜索,或者需要更為復雜的搜索時,XPath的相關教程

    XPath相關教程請查看我的個人博客

  • 1

    2

    3

    4
    </td>

    //同樣可以打印出hed的內容,//div中//表示搜索整個文檔中的div,并將這些div

    //放入list中,然后獲取第一個div

    final  HtmlDivision div = (HtmlDivision) page.getByXPath( "http://div" ).get( 0 );

    System.out.println(div.asXml());
    </div> </td> </tr> </tbody> </table> </div> </div> </div>

    3、代理服務器的配置,代理的配置很簡單,只需要配置好地址,端口,用戶名與密碼即可

    1

    2

    3
    </td>

    final  WebClient webClient = new  WebClient(BrowserVersion.CHROME, "http://127.0.0.1" , 8087 );

    final  DefaultCredentialsProvider credentialsProvider = (DefaultCredentialsProvider) webClient.getCredentialsProvider();

    credentialsProvider.addCredentials( "username" , "password" );
    </div> </td> </tr> </tbody> </table> </div> </div> </div>

    4、模擬表單的提交

  • 1

    2

    3

    4

    5

    6

    7

    8

    9
    </td>

    //獲取表單 

    final  HtmlForm form = page.getFormByName( "form" );

    //獲取提交按扭

    final  HtmlSubmitInput button = form.getInputByName( "submit" );

    //一會得輸入的

    final  HtmlTextInput textField = form.getInputByName( "userid" );

    textField.setValueAttribute( "test" );

    //點擊提交表單

    final  HtmlPage page = button.click();
    </div> </td> </tr> </tbody> </table> </div> </div> </div>

    API的使用就介紹到這,網絡爬蟲中主要目的就是獲取頁中所有的鏈接,代碼如下:

    1

    2

    3

    4
    </td>

    java.util.List achList=page.getAnchors();

    for (HtmlAnchor ach:achList){

    System.out.println(ach.getHrefAttribute());

    }
    </div> </td> </tr> </tbody> </table> </div> </div> </div>

    最后來個例子,HtmlUnit模擬瀏覽器登錄小米網站帳戶,程運運行的截圖如下,紅色方框表示登錄成功跳轉到下一個頁面出現的帳號:

    爬蟲的自我解剖(抓取網頁HtmlUnit)

    本博文源代碼下載:

    源碼下載

    Java皮膚庫下載

    HtmlUnit源碼包下載

    HtmlUnit的Jar包下載

    </blockquote> 來源地址: http://www.yanyulin.info/pages/2013/11/fetchPage.html

     本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
     轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
     本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!
  • sesese色