Java网络爬虫(一)--使用HttpClient请求资源并抓取响应
覺得自己是時候該沉淀了。。。說起來,自學Java網絡爬蟲也有兩個月了,期間走了很多彎路,我也不禁對Java和Python這兩門同樣都能搞爬蟲的語言但與之相關的文檔與書籍的差別感到驚訝,對于Java來說,目前我知道的有關介紹Java網絡爬蟲這方面的書籍只有《自己動手寫網絡爬蟲》,對于其中的內容,我覺得是晦澀難懂,不適合入門,并且內容相對來說感覺有點過時。
我覺得我必須開個博客專欄,對于之后想要入門Java網絡爬蟲的兄弟姐妹們,好減少一點他們在學習途中的迷茫,我期間是迷茫了好幾次,但最終還是堅持下來了。對于Java和Python來說,很多人剛開始都不知道該選擇哪門語言,在此我也不多做評價,有需要的請百度,或知乎。
其實我個人覺得,除非是特別情況,還是選擇Python爬蟲比較好。
請求URL
在這里我先說一下,對于一般需求性的網絡爬蟲來說,使用HttpClient請求頁面,使用Jsoup解析頁面,提取自己想要的數據,基本就可以開始“爬”,當初我就是使用這兩個包,加上模擬請求和URL請求隊列,抓取了豆瓣影評,四頁共50條數據(雖然數據有點少,但總算是抓下來了)。
在學習的途中,由于HttpClient這個項目已經更新,但網絡上的資料陳舊,用的是HttpClient過時的包,所以我也是摸索了好久,在這里給大家列出最新的用法~對于HttpClient這個第三方庫有疑問的可以自行百度,我們在寫項目的時候需要引入,對于怎么在IDEA中加入第三方庫,我的另一篇博客Java學習筆記–整合數據庫中有詳細說明,這里我只演示它的用法。
HttpClient給我們提供了非常強大的請求URL的功能,他可以用來模擬瀏覽器行為,可以進行網站請求頭的添加和修改來完成模擬登錄,可以獲得服務器響應過來的實體消息,是進行URL請求的一個利器。對于HTTP狀態碼和Web與服務器之間進行的交互不清楚的,推薦一本書《圖解HTTP》,這也是進行網絡爬蟲所要掌握的基礎知識。
接下來給大家上代碼,多說無益。
/*** 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 {// 創建默認的客戶端實例CloseableHttpClient httpClient = HttpClients.createDefault();// 創建get請求實例HttpGet httpget = new HttpGet("http://www.baidu.com");System.out.println("executing request " + httpget.getURI());try {// 客戶端執行get請求返回響應CloseableHttpResponse response = httpClient.execute(httpget);// 服務器響應狀態行System.out.println(response.getStatusLine().toString());Header[] heads = response.getAllHeaders();System.out.println(response.getHeaders("Content-Type"));// 打印所有響應頭for(Header h:heads){System.out.println(h.getName()+":"+h.getValue());}} finally {httpClient.close();}} }返回響應
使用上面代碼我們已經成功請求到URL,接下來需要將整個頁面的源碼抓取下來,提取我們所需要的數據。
這時候就要使用HttpClient返回實體的內容。
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){//創建客戶端CloseableHttpClient closeableHttpClient = HttpClients.createDefault();//創建請求Get實例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 {//客戶端執行httpGet方法,返回響應CloseableHttpResponse closeableHttpResponse = closeableHttpClient.execute(httpGet);//得到服務響應狀態碼if(closeableHttpResponse.getStatusLine().getStatusCode() == 200) //得到響應實體String entity = EntityUtils.toString (closeableHttpResponse.getEntity(), "utf-8");}else{//如果是其他狀態碼則做其他處理}} catch (ClientProtocolException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}} }總結
以上是生活随笔為你收集整理的Java网络爬虫(一)--使用HttpClient请求资源并抓取响应的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 详解G1垃圾收集器
- 下一篇: win7与xp 字体命名问题影响打印