現在有越來越多的人熱衷於做網絡爬蟲(網絡蜘蛛),也有越來越多的地方需要網絡爬蟲,比如搜索引擎、資訊采集、輿情監測等等,諸如此類。網絡爬蟲涉及到的技術(算法/策略)廣而復雜,如網頁獲取、網頁跟蹤、網頁分析、網頁搜索、網頁評級和結構/非結構化數據抽取以及后期更細粒度的數據挖掘等方方面面,對於新手來說,不是一朝一夕便能完全掌握且熟練應用的,對於作者來說,更無法在一篇文章內就將其說清楚。因此在本篇文章中,我們僅將視線聚焦在網絡爬蟲的最基礎技術——網頁抓取方面。
說到網頁抓取,往往有兩個點是不得不說的,首先是網頁編碼的識別,另外一個是對網頁腳本運行的支持,除此之外,是否支持以POST方式提交請求和支持自動的cookie管理也是很多人所關注的重要方面。其實Java世界里,已經有很多開源的組件來支持各種各樣方式的網頁抓取了,包括上面提到的四個重點,所以說使用Java做網頁抓取還是比較容易的。下面,作者將重點介紹其中的六種方式。
HttpClient
HttpClient 是 Apache Jakarta Common 下的子項目,可以用來提供高效的、最新的、功能豐富的支持 HTTP 協議的客戶端編程工具包,並且它支持 HTTP 協議最新的版本和建議。
以下列出的是 HttpClient 提供的主要的功能,要知道更多詳細的功能可以參見 HttpClient 的主頁。
(1)實現了所有 HTTP 的方法(GET,POST,PUT,HEAD 等)
(2)支持自動轉向
(3)支持 HTTPS 協議
(4)支持代理服務器
(5)支持自動的Cookies管理等
Java爬蟲開發中應用最多的一種網頁獲取技術,速度和性能一流,在功能支持方面顯得較為底層,不支持JS腳本執行和CSS解析、渲染等准瀏覽器功能,推薦用於需要快速獲取網頁而無需解析腳本和CSS的場景。
范例代碼如下:
- package cn.ysh.studio.crawler.httpclient;
- import org.apache.http.client.HttpClient;
- import org.apache.http.client.ResponseHandler;
- import org.apache.http.client.methods.HttpGet;
- import org.apache.http.impl.client.BasicResponseHandler;
- import org.apache.http.impl.client.DefaultHttpClient;
- /**
- * 基於HtmlClient抓取網頁內容
- *
- * @author www.yshjava.cn
- */
- public class HttpClientTest {
- public static void main(String[] args) throws Exception {
- //目標頁面
- String url = "http://www.yshjava.cn";
- //創建一個默認的HttpClient
- HttpClient httpclient = new DefaultHttpClient();
- try {
- //以get方式請求網頁http://www.yshjava.cn
- HttpGet httpget = new HttpGet(url);
- //打印請求地址
- System.out.println("executing request " + httpget.getURI());
- //創建響應處理器處理服務器響應內容
- ResponseHandlerresponseHandler = new BasicResponseHandler();
- //執行請求並獲取結果
- String responseBody = httpclient.execute(httpget, responseHandler);
- System.out.println("----------------------------------------");
- System.out.println(responseBody);
- System.out.println("----------------------------------------");
- } finally {
- //關閉連接管理器
- httpclient.getConnectionManager().shutdown();
- }
- }
- }
Jsoup
jsoup 是一款Java 的HTML解析器,可直接解析某個URL地址、HTML文本內容。它提供了一套非常省力的API,可通過DOM,CSS以及類似於jQuery的操作方法來取出和操作數據。
網頁獲取和解析速度飛快,推薦使用。
主要功能如下:
1. 從一個URL,文件或字符串中解析HTML;
2. 使用DOM或CSS選擇器來查找、取出數據;
3. 可操作HTML元素、屬性、文本;
范例代碼如下:
- package cn.ysh.studio.crawler.jsoup;
- import java.io.IOException;
- import org.jsoup.Jsoup;
- /**
- * 基於Jsoup抓取網頁內容
- * @author www.yshjava.cn
- */
- public class JsoupTest {
- public static void main(String[] args) throws IOException {
- //目標頁面
- String url = "http://www.yshjava.cn";
- //使用Jsoup連接目標頁面,並執行請求,獲取服務器響應內容
- String html = Jsoup.connect(url).execute().body();
- //打印頁面內容
- System.out.println(html);
- }
- }
HtmlUnit
htmlunit 是一款開源的java 頁面分析工具,讀取頁面后,可以有效的使用htmlunit分析頁面上的內容。項目可以模擬瀏覽器運行,被譽為java瀏覽器的開源實現。這個沒有界面的瀏覽器,運行速度也是非常迅速的。采用的是Rhinojs引擎。模擬js運行。
網頁獲取和解析速度較快,性能較好,推薦用於需要解析網頁腳本的應用場景。
范例代碼如下:
- package cn.ysh.studio.crawler.htmlunit;
- import com.gargoylesoftware.htmlunit.BrowserVersion;
- import com.gargoylesoftware.htmlunit.Page;
- import com.gargoylesoftware.htmlunit.WebClient;
- /**
- * 基於HtmlUnit抓取網頁內容
- *
- * @author www.yshjava.cn
- */
- public class HtmlUnitSpider {
- public static void main(String[] s) throws Exception {
- //目標網頁
- String url = "http://www.yshjava.cn";
- //模擬特定瀏覽器FIREFOX_3
- WebClient spider = new WebClient(BrowserVersion.FIREFOX_3);
- //獲取目標網頁
- Page page = spider.getPage(url);
- //打印網頁內容
- System.out.println(page.getWebResponse().getContentAsString());
- //關閉所有窗口
- spider.closeAllWindows();
- }
- }
Watij(發音wattage)是一個使用Java開發的Web應用程序測試工具,鑒於Watij的簡單性和Java語言的強大能力,Watij能夠使您在真正的瀏覽器中完成Web應用程序的自動化測試。因為是調用本地瀏覽器,因此支持CSS渲染和JS執行。
網頁獲取速度一般,IE版本過低(6/7)時可能會引發內存泄露。
范例代碼如下:
- package cn.ysh.studio.crawler.ie;
- import watij.runtime.ie.IE;
- /**
- * 基於Watij抓取網頁內容,僅限Windows平台
- *
- * @author www.yshjava.cn
- */
- public class WatijTest {
- public static void main(String[] s) {
- //目標頁面
- String url = "http://www.yshjava.cn";
- //實例化IE瀏覽器對象
- IE ie = new IE();
- try {
- //啟動瀏覽器
- ie.start();
- //轉到目標網頁
- ie.goTo(url);
- //等待網頁加載就緒
- ie.waitUntilReady();
- //打印頁面內容
- System.out.println(ie.html());
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- try {
- //關閉IE瀏覽器
- ie.close();
- } catch (Exception e) {
- }
- }
- }
- }
Selenium
Selenium也是一個用於Web應用程序測試的工具。Selenium測試直接運行在瀏覽器中,就像真正的用戶在操作一樣。支持的瀏覽器包括IE、Mozilla Firefox、Mozilla Suite等。這個工具的主要功能包括:測試與瀏覽器的兼容性——測試你的應用程序看是否能夠很好得工作在不同瀏覽器和操作系統之上。測試系統功能——創建衰退測試檢驗軟件功能和用戶需求。支持自動錄制動作和自動生成。Net、Java、Perl等不同語言的測試腳本。Selenium 是ThoughtWorks專門為Web應用程序編寫的一個驗收測試工具。
網頁獲取速度較慢,對於爬蟲來說,不是一個好的選擇。
范例代碼如下:
- package cn.ysh.studio.crawler.selenium;
- import org.openqa.selenium.htmlunit.HtmlUnitDriver;
- /**
- * 基於HtmlDriver抓取網頁內容
- *
- * @author www.yshjava.cn
- */
- public class HtmlDriverTest {
- public static void main(String[] s) {
- //目標網頁
- String url = "http://www.yshjava.cn";
- HtmlUnitDriver driver = new HtmlUnitDriver();
- try {
- //禁用JS腳本功能
- driver.setJavascriptEnabled(false);
- //打開目標網頁
- driver.get(url);
- //獲取當前網頁源碼
- String html = driver.getPageSource();
- //打印網頁源碼
- System.out.println(html);
- } catch (Exception e) {
- //打印堆棧信息
- e.printStackTrace();
- } finally {
- try {
- //關閉並退出
- driver.close();
- driver.quit();
- } catch (Exception e) {
- }
- }
- }
- }
Webspec
一個開源的帶有界面的Java瀏覽器,支持腳本執行和CSS渲染。速度一般。
范例代碼如下:
- package cn.ysh.studio.crawler.webspec;
- import org.watij.webspec.dsl.WebSpec;
- /**
- * 基於WebSpec抓取網頁內容
- *
- * @author www.yshjava.cn
- */
- public class WebspecTest {
- public static void main(String[] s) {
- //目標網頁
- String url = "http://www.yshjava.cn";
- //實例化瀏覽器對象
- WebSpec spec = new WebSpec().mozilla();
- //隱藏瀏覽器窗體
- spec.hide();
- //打開目標頁面
- spec.open(url);
- //打印網頁源碼
- System.out.println(spec.source());
- //關閉所有窗口
- spec.closeAll();
- }
- }
原創文章,轉載請注明出處:https://blog.csdn.net/limm33/article/details/78811165
