??悼h城鄉(xiāng)建設(shè)路網(wǎng)站怎么有自己的網(wǎng)站
關(guān)于用Java進(jìn)行爬蟲的資料網(wǎng)上實(shí)在少之又少,但作為以一名對(duì)Java剛剛初窺門徑建立好興趣的學(xué)生怎么能靜得下心用新學(xué)的Python去寫,畢竟Java是世界上最好的語言嘛 (狗頭)
關(guān)于Java爬蟲最受歡迎的一個(gè)框架Jsoup常常搭配HttpClient來使用,因?yàn)?span id="vxwlu0yf4" class="kdocs-color" style="background-color:#FBF5B3;">Jsoup.connect(url)下載網(wǎng)頁沒有多次重試的功能,所以我們更多的使用HttpClient來進(jìn)行網(wǎng)頁的下載,而Jsoup則更多的用來解析網(wǎng)頁。比較專業(yè)的事還得專業(yè)的人來干!
對(duì)于下載網(wǎng)頁我們沒必要每次都花費(fèi)大把的時(shí)間去寫,直接寫一個(gè)工具類,在Jsoup中直接調(diào)用即可
關(guān)于HttpClient
關(guān)于HttpClient主要有兩個(gè)版本
org.apache.http.client.HttpClient `3.X`
org.apache.commons.httpClient.HttpClient `4.X`
相比較4.X的功能更加豐富簡潔,但3.x也不差,下面拿3.x舉例
HttpClient實(shí)例代碼
package com.Jsoup;import org.apache.commons.httpclient.DefaultHttpMethodRetryHandler;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.params.HttpMethodParams;import java.io.IOException;//下載網(wǎng)頁工具,返回html對(duì)象
public class HttpUtil {static String fileName = null;static String content;/*** 獲取網(wǎng)頁主體內(nèi)容,完成HttpClient的下載任務(wù),剩下的交給Jsoup來解析* @param url URL地址* @param charset 設(shè)置編碼格式* @return 返回網(wǎng)頁 html內(nèi)容 * @throws IOException 拋出IO異常*/public static String getContent(String url,String charset) throws IOException {//1.創(chuàng)建客戶端對(duì)象并設(shè)置參數(shù)HttpClient httpClient = new HttpClient();//設(shè)置 Http 超時(shí)httpClient.getHttpConnectionManager().getParams().setConnectionTimeout(2000);//2.生成GetMethod對(duì)象并設(shè)置參數(shù)GetMethod getMethod = new GetMethod(url);//設(shè)置 Get 請(qǐng)求超時(shí)getMethod.getParams().setParameter(HttpMethodParams.SO_TIMEOUT,2000);getMethod.getParams().setContentCharset(charset);//設(shè)置請(qǐng)求重試處理-這是使用HttpClient下載網(wǎng)頁而不用Jsoup的原因getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,new DefaultHttpMethodRetryHandler());//設(shè)置頭信息//getMethod.getParams().setParameter(HttpMethodParams.USER_AGENT,"需要添加的代理信息");//3.執(zhí)行 Get 請(qǐng)求int statusCode = httpClient.executeMethod(getMethod);//判斷訪問的狀態(tài)碼if (statusCode != HttpStatus.SC_OK){System.err.println("請(qǐng)求失敗: "+getMethod.getStatusLine());fileName = null;}else {//4.處理 HTTP 響應(yīng)內(nèi)容//獲得響應(yīng)體內(nèi)容content = getMethod.getResponseBodyAsString();}//5.釋放連接getMethod.releaseConnection();//輸出到控制臺(tái)//System.out.println(content);return content;}}
注意:這里的用戶代理(User-Agent)需要按需求設(shè)置,后期可能需要設(shè)置大量的代理,我們將設(shè)置一個(gè)Use-Agent庫,每次執(zhí)行爬蟲任務(wù)將從中隨機(jī)選取一個(gè),防止被網(wǎng)站封鎖
Jsoup代碼
public class JsoupDemo01 {public static void main(String[] args) throws IOException {String url = "https://xxxx.com";String html = HttpUtil.getContent(url,"UTF-8");//Jsoup.parse(String html)可以根據(jù)html文檔來解析Document doc = Jsoup.parse(html);//具體解析網(wǎng)頁不做展示,之后更新}
}