Java网络爬虫(一)--使用HttpClient请求资源并抓取响应
覺得自己是時(shí)候該沉淀了。。。說起來,自學(xué)Java網(wǎng)絡(luò)爬蟲也有兩個(gè)月了,期間走了很多彎路,我也不禁對Java和Python這兩門同樣都能搞爬蟲的語言但與之相關(guān)的文檔與書籍的差別感到驚訝,對于Java來說,目前我知道的有關(guān)介紹Java網(wǎng)絡(luò)爬蟲這方面的書籍只有《自己動手寫網(wǎng)絡(luò)爬蟲》,對于其中的內(nèi)容,我覺得是晦澀難懂,不適合入門,并且內(nèi)容相對來說感覺有點(diǎn)過時(shí)。
我覺得我必須開個(gè)博客專欄,對于之后想要入門Java網(wǎng)絡(luò)爬蟲的兄弟姐妹們,好減少一點(diǎn)他們在學(xué)習(xí)途中的迷茫,我期間是迷茫了好幾次,但最終還是堅(jiān)持下來了。對于Java和Python來說,很多人剛開始都不知道該選擇哪門語言,在此我也不多做評價(jià),有需要的請百度,或知乎。
其實(shí)我個(gè)人覺得,除非是特別情況,還是選擇Python爬蟲比較好。
請求URL
在這里我先說一下,對于一般需求性的網(wǎng)絡(luò)爬蟲來說,使用HttpClient請求頁面,使用Jsoup解析頁面,提取自己想要的數(shù)據(jù),基本就可以開始“爬”,當(dāng)初我就是使用這兩個(gè)包,加上模擬請求和URL請求隊(duì)列,抓取了豆瓣影評,四頁共50條數(shù)據(jù)(雖然數(shù)據(jù)有點(diǎn)少,但總算是抓下來了)。
在學(xué)習(xí)的途中,由于HttpClient這個(gè)項(xiàng)目已經(jīng)更新,但網(wǎng)絡(luò)上的資料陳舊,用的是HttpClient過時(shí)的包,所以我也是摸索了好久,在這里給大家列出最新的用法~對于HttpClient這個(gè)第三方庫有疑問的可以自行百度,我們在寫項(xiàng)目的時(shí)候需要引入,對于怎么在IDEA中加入第三方庫,我的另一篇博客Java學(xué)習(xí)筆記–整合數(shù)據(jù)庫中有詳細(xì)說明,這里我只演示它的用法。
HttpClient給我們提供了非常強(qiáng)大的請求URL的功能,他可以用來模擬瀏覽器行為,可以進(jìn)行網(wǎng)站請求頭的添加和修改來完成模擬登錄,可以獲得服務(wù)器響應(yīng)過來的實(shí)體消息,是進(jìn)行URL請求的一個(gè)利器。對于HTTP狀態(tài)碼和Web與服務(wù)器之間進(jìn)行的交互不清楚的,推薦一本書《圖解HTTP》,這也是進(jìn)行網(wǎng)絡(luò)爬蟲所要掌握的基礎(chǔ)知識。
接下來給大家上代碼,多說無益。
/*** Created by paranoid on 17-1-19.*/ import org.apache.http.Header; import org.apache.http.HttpEntity; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.util.EntityUtils;public class HttpCLientDemo {public static void main (String[] args) throws Exception {// 創(chuàng)建默認(rèn)的客戶端實(shí)例CloseableHttpClient httpClient = HttpClients.createDefault();// 創(chuàng)建get請求實(shí)例HttpGet httpget = new HttpGet("http://www.baidu.com");System.out.println("executing request " + httpget.getURI());try {// 客戶端執(zhí)行g(shù)et請求返回響應(yīng)CloseableHttpResponse response = httpClient.execute(httpget);// 服務(wù)器響應(yīng)狀態(tài)行System.out.println(response.getStatusLine().toString());Header[] heads = response.getAllHeaders();System.out.println(response.getHeaders("Content-Type"));// 打印所有響應(yīng)頭for(Header h:heads){System.out.println(h.getName()+":"+h.getValue());}} finally {httpClient.close();}} }返回響應(yīng)
使用上面代碼我們已經(jīng)成功請求到URL,接下來需要將整個(gè)頁面的源碼抓取下來,提取我們所需要的數(shù)據(jù)。
這時(shí)候就要使用HttpClient返回實(shí)體的內(nèi)容。
import org.apache.http.Header; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.util.EntityUtils;import java.io.IOException;import static java.lang.System.out;public class HttpClientDemo {public static void main(String[] args){//創(chuàng)建客戶端CloseableHttpClient closeableHttpClient = HttpClients.createDefault();//創(chuàng)建請求Get實(shí)例HttpGet httpGet = new HttpGet("https://www.baidu.com");//添加頭部信息模擬瀏覽器訪問httpGet.setHeader("Accept", "text/html,application/xhtml+xml," +"application/xml;q=0.9,image/webp,*/*;q=0.8");httpGet.setHeader("Accept-Encoding", "gzip, deflate, sdch, br");httpGet.setHeader("Accept-Language", "zh-CN,zh;q=0.8");httpGet.setHeader("User-Agent", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36" +" (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36");try {//客戶端執(zhí)行httpGet方法,返回響應(yīng)CloseableHttpResponse closeableHttpResponse = closeableHttpClient.execute(httpGet);//得到服務(wù)響應(yīng)狀態(tài)碼if(closeableHttpResponse.getStatusLine().getStatusCode() == 200) //得到響應(yīng)實(shí)體String entity = EntityUtils.toString (closeableHttpResponse.getEntity(), "utf-8");}else{//如果是其他狀態(tài)碼則做其他處理}} catch (ClientProtocolException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}} }總結(jié)
以上是生活随笔為你收集整理的Java网络爬虫(一)--使用HttpClient请求资源并抓取响应的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 详解G1垃圾收集器
- 下一篇: 《疯狂Java讲义》第3章——数据类型和