天天看點

java 網絡爬蟲_如何用Java實作網絡爬蟲

原标題:如何用Java實作網絡爬蟲

java 網絡爬蟲_如何用Java實作網絡爬蟲

微信公衆号“書圈”背景回複【Javapachong1】,下載下傳本例的PPT和源碼

作品描述

本章作品是一個能夠抓取指定網站ACM比賽資訊的爬蟲。ACM程式設計大賽是一項國際型的比賽,有很多訓練程式設計能力的網站可供ACM隊員使用,網頁上的使用者資訊可以衡量一個ACM隊員的水準。為了簡化設計,本章作品以擷取一個指定使用者的資訊為例。多個使用者與多個比賽的資訊擷取見本章的實驗拓展。

作品功能示範如下:

打開chap12目錄下的begin子檔案夾,會看到裡面包含一個jar檔案,如圖12.1所示,Spider.jar是爬蟲程式。

java 網絡爬蟲_如何用Java實作網絡爬蟲

圖12.1 Chap12的begin目錄

首先在檔案夾位址欄輸入cmd,打開控制台程式,在配置好JDK環境變量的前提下,輸入“java –jar Spider.jar”運作爬蟲程式,根據頁面上的使用者資訊與比賽資訊,擷取必要的資訊與資料,并進行整合,處理結果如圖12.2所示。

java 網絡爬蟲_如何用Java實作網絡爬蟲

圖12.2 爬蟲程式運作結果

其中一個資源是擷取杭州電子科技大學ACM訓練系統(簡稱HDU)的使用者資訊,根據使用者名,擷取使用者的詳細資訊,如圖12.3所示。

java 網絡爬蟲_如何用Java實作網絡爬蟲

圖12.3HDU使用者資訊

另一個資源是擷取杭州電子科技大學ACM訓練系統的比賽資訊,根據比賽的ID号和比賽密碼,擷取比賽排行榜資源,如圖12.4所示。

java 網絡爬蟲_如何用Java實作網絡爬蟲

圖12.4HDU比賽資訊

最後一個資源是擷取虛拟評測系統(簡稱Vjudge)的使用者資訊,根據使用者名,擷取使用者詳細資訊資料,該頁面中的使用者資料是JSON字元串,資訊如圖12.5所示。

java 網絡爬蟲_如何用Java實作網絡爬蟲

圖12.5Vjudge使用者資訊

知識介紹

所謂網頁抓取,就是把URL位址中指定的網絡資源從網絡流中讀取出來,儲存到本地。網絡爬蟲可以模拟浏覽器的功能,把URL作為HTTP請求的内容發送到伺服器端,然後讀取伺服器端的響應資源。

Java語言是為網絡而生的程式設計語言,它把網絡資源看成是一種檔案,它對網絡資源的通路和對本地檔案的通路一樣友善。它把請求和響應封裝為流,是以人們可以根據響應内容,擷取響應流,之後從流中按位元組讀取資料。

例如,java.net.URL類可以對指定的URL發送Web請求并擷取響應文檔。用法如下:

URL pageUrl =new URL(path);

根據URL對象,擷取網絡流,這樣就可以像通路本地檔案一樣通路網絡資源:

InputStreaminStream = pageUrl.openStream();

用Java語言編寫網絡爬蟲有兩種常見方法:一種是用java.net包定義的URL、HttpURLConnection等基于HTTP的通路類;另一種是用Apache的HTTP用戶端開源項目—HttpClient。HttpClient可以很好地處理HTTP連接配接中的各種問題,操作起來非常友善,開發效率高,健壯性好。

HttpClient主要用法總結如下。

01

02

03

04

05

06

07

08

09

10

11

12

13

14

//建立一個用戶端,相當于打開一個浏覽器

HttpClient httpClient = HttpClientBuilder.create().build();

//創造一個GET方法,類似于在浏覽器位址欄輸入一個位址

HttpGet httpGet = new HttpGet("http://acm.hdu.edu.cn/");

//發送請求并擷取響應對象,相當于浏覽器回車通路

HttpResponse response = httpClient.execute(httpGet);

//擷取響應狀态碼

int statusCode = response.getStatusLine().getStatusCode();

//擷取消息實體,内容是HTTP傳送的封包

HttpEntity resEntity = response.getEntity();

//檢視網頁内容,能檢視的資訊還有很多,如head等

System.out.println(EntityUtils.toString(resEntity, "UTF-8"));

//釋放資源

httpGet.abort();

第02行表示建立一個用戶端,相當于打開一個浏覽器。第04行使用GET方法對http://acm.hdu.edu.cn/進行請求。第06行執行Web請求,并擷取響應對象,響應對象包括響應頭部和響應體。第08行擷取響應狀态。第10行是消息實體,其中的内容是HTTP傳送的封包,例如封包頭部、HTML源代碼等。第12行檢視擷取到的網頁的HTML源代碼,這也是網頁抓取中所需要的,在示例中僅僅列印到了控制台中,而在實際項目中,常常寫入到檔案或資料庫中。最後關閉網絡連結,釋放資源,以免造成資源消耗。

上述示例使用GET請求擷取Web資源,也可以使用POST請求擷取的Web資源。GET請求與POST請求的方式不同,GET請求常用于資訊的擷取,而POST請求常用于資訊的送出。例如:

//建立一個POST請求

HttpPost httPost= new HttpPost("http://acm.hdu.edu.cn/");

簡單的網頁抓取執行個體

本節根據之前所講的内容,編寫一個執行個體來更好地了解如何實作對網頁進行抓取。該執行個體的程式如程式12.1所示。

程式12.1 Spider項目的自定義爬蟲類GetHduHome.java

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

public class GetHduHome {

public void loadPage(String path) throws ClientProtocolException,

IOException {

//建立用戶端

HttpClient httpClient = HttpClientBuilder.create().build();

HttpGet httpGet = new HttpGet(path);

String fileName = "C:/HduHomePage.html";

OutputStream fout = null;

//擷取頁面請求對象

HttpResponse response = httpClient.execute(httpGet);

int statusCode = response.getStatusLine().getStatusCode();

//對狀态碼進行處理(簡單起見,隻處理狀态碼為200的資料)

if (statusCode == HttpStatus.SC_OK) {

HttpEntity resEntity = response.getEntity();

//擷取頁面HTML資料

byte[] pageContent = EntityUtils.toByteArray(resEntity);

//寫入到檔案

fout = new FileOutputStream(fileName);

fout.write(pageContent);

}

if (fout != null)

fout.close();

httpGet.abort();

}

//測試源代碼

public static void main(String[] args) throws ClientProtocolException,

IOException {

//抓取" http://acm.hdu.edu.cn/"頁面

GetHduHome hduUser = new GetHduHome();

String path = "http://acm.hdu.edu.cn/";

hduUser.loadPage(path);

}

}

程式12.1抓取的是杭州電子科技大學ACM訓練系統首頁,檢視儲存的頁面檔案,就可以看到抓取的網頁資訊,如圖12.6所示。

java 網絡爬蟲_如何用Java實作網絡爬蟲

圖12.6HDU首頁資源

程式12.1是一個比較簡單的抓取頁面執行個體。,由于網際網路的複雜性,抓取網頁時需要考慮的因素有很多,例如資源類型問題、狀态碼問題等。

責任編輯: