Java网络爬虫(一)--使用HttpClient请求资源并抓取响应
覺(jué)得自己是時(shí)候該沉淀了。。。說(shuō)起來(lái),自學(xué)Java網(wǎng)絡(luò)爬蟲(chóng)也有兩個(gè)月了,期間走了很多彎路,我也不禁對(duì)Java和Python這兩門(mén)同樣都能搞爬蟲(chóng)的語(yǔ)言但與之相關(guān)的文檔與書(shū)籍的差別感到驚訝,對(duì)于Java來(lái)說(shuō),目前我知道的有關(guān)介紹Java網(wǎng)絡(luò)爬蟲(chóng)這方面的書(shū)籍只有《自己動(dòng)手寫(xiě)網(wǎng)絡(luò)爬蟲(chóng)》,對(duì)于其中的內(nèi)容,我覺(jué)得是晦澀難懂,不適合入門(mén),并且內(nèi)容相對(duì)來(lái)說(shuō)感覺(jué)有點(diǎn)過(guò)時(shí)。
我覺(jué)得我必須開(kāi)個(gè)博客專(zhuān)欄,對(duì)于之后想要入門(mén)Java網(wǎng)絡(luò)爬蟲(chóng)的兄弟姐妹們,好減少一點(diǎn)他們?cè)趯W(xué)習(xí)途中的迷茫,我期間是迷茫了好幾次,但最終還是堅(jiān)持下來(lái)了。對(duì)于Java和Python來(lái)說(shuō),很多人剛開(kāi)始都不知道該選擇哪門(mén)語(yǔ)言,在此我也不多做評(píng)價(jià),有需要的請(qǐng)百度,或知乎。
其實(shí)我個(gè)人覺(jué)得,除非是特別情況,還是選擇Python爬蟲(chóng)比較好。
請(qǐng)求URL
在這里我先說(shuō)一下,對(duì)于一般需求性的網(wǎng)絡(luò)爬蟲(chóng)來(lái)說(shuō),使用HttpClient請(qǐng)求頁(yè)面,使用Jsoup解析頁(yè)面,提取自己想要的數(shù)據(jù),基本就可以開(kāi)始“爬”,當(dāng)初我就是使用這兩個(gè)包,加上模擬請(qǐng)求和URL請(qǐng)求隊(duì)列,抓取了豆瓣影評(píng),四頁(yè)共50條數(shù)據(jù)(雖然數(shù)據(jù)有點(diǎn)少,但總算是抓下來(lái)了)。
在學(xué)習(xí)的途中,由于HttpClient這個(gè)項(xiàng)目已經(jīng)更新,但網(wǎng)絡(luò)上的資料陳舊,用的是HttpClient過(guò)時(shí)的包,所以我也是摸索了好久,在這里給大家列出最新的用法~對(duì)于HttpClient這個(gè)第三方庫(kù)有疑問(wèn)的可以自行百度,我們?cè)趯?xiě)項(xiàng)目的時(shí)候需要引入,對(duì)于怎么在IDEA中加入第三方庫(kù),我的另一篇博客Java學(xué)習(xí)筆記–整合數(shù)據(jù)庫(kù)中有詳細(xì)說(shuō)明,這里我只演示它的用法。
HttpClient給我們提供了非常強(qiáng)大的請(qǐng)求URL的功能,他可以用來(lái)模擬瀏覽器行為,可以進(jìn)行網(wǎng)站請(qǐng)求頭的添加和修改來(lái)完成模擬登錄,可以獲得服務(wù)器響應(yīng)過(guò)來(lái)的實(shí)體消息,是進(jìn)行URL請(qǐng)求的一個(gè)利器。對(duì)于HTTP狀態(tài)碼和Web與服務(wù)器之間進(jìn)行的交互不清楚的,推薦一本書(shū)《圖解HTTP》,這也是進(jìn)行網(wǎng)絡(luò)爬蟲(chóng)所要掌握的基礎(chǔ)知識(shí)。
接下來(lái)給大家上代碼,多說(shuō)無(wú)益。
/*** 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)的客戶(hù)端實(shí)例CloseableHttpClient httpClient = HttpClients.createDefault();// 創(chuàng)建get請(qǐng)求實(shí)例HttpGet httpget = new HttpGet("http://www.baidu.com");System.out.println("executing request " + httpget.getURI());try {// 客戶(hù)端執(zhí)行g(shù)et請(qǐng)求返回響應(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)成功請(qǐng)求到URL,接下來(lái)需要將整個(gè)頁(yè)面的源碼抓取下來(lái),提取我們所需要的數(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)建客戶(hù)端CloseableHttpClient closeableHttpClient = HttpClients.createDefault();//創(chuàng)建請(qǐng)求Get實(shí)例HttpGet httpGet = new HttpGet("https://www.baidu.com");//添加頭部信息模擬瀏覽器訪(fǎng)問(wèn)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 {//客戶(hù)端執(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请求资源并抓取响应的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 详解G1垃圾收集器
- 下一篇: 《疯狂Java讲义》第3章——数据类型和