生活随笔
收集整理的這篇文章主要介紹了
使用java爬取数据的三种思路
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
目錄
- 一、使用HttpClient
- 二、使用HtmlUnit
- 三、捕獲接口獲取數據
一、使用HttpClient
HttpClient是一種簡單的捕獲html頁面的工具包,現已不再維護,已經被Apache 的HttpComponents替代了,缺陷就是獲取不到js獲取到的動態數據,從而使得爬取的數據缺失。
<dependency><groupId>org
.apache
.httpcomponents
</groupId
><artifactId>httpclient
</artifactId
><version>4.5.8</version
>
</dependency
>
import java.io.IOException;
import org.apache.http.HttpEntity;
import org.apache.http.HttpStatus;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.utils.HttpClientUtils;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;public class HttpClientTest {public static String getHtmlByHttpClient(String url
) {CloseableHttpClient httpClient
= HttpClients.createDefault();CloseableHttpResponse response
= null;HttpGet request
= new HttpGet(url
);try {response
= httpClient
.execute(request
);if(response
.getStatusLine().getStatusCode() == HttpStatus.SC_OK
) {HttpEntity httpEntity
= response
.getEntity();String html
= EntityUtils.toString(httpEntity
, "utf-8");return html
;} else {System.out
.println("返回狀態不是200");System.out
.println(EntityUtils.toString(response
.getEntity(), "utf-8"));}} catch (ClientProtocolException e
) {e
.printStackTrace();} catch (IOException e
) {e
.printStackTrace();} finally {HttpClientUtils.closeQuietly(response
);HttpClientUtils.closeQuietly(httpClient
);}}
}
二、使用HtmlUnit
HtmlUnit可以用來模擬瀏覽器運行,可以把它當作一個沒有界面的瀏覽器,也就是用代碼模擬鼠標等操作來操作網頁,運行速度快。
HtmlUnit是一款開源的java 頁面分析工具,作為junit的擴展之一,可以模擬js運行
->使用htmlUnit捕獲百度搜索頁面
通過htmlUnit操作百度高級搜索界面最終捕獲搜索結果的html頁面內容
<dependency> <groupId>net
.sourceforge
.htmlunit
</groupId
> <artifactId>htmlunit
</artifactId
> <version>2.23</version
>
</dependency
>
public static String Baidu(String keyword
)throws Exception{WebClient webclient
= new WebClient();webclient
.getOptions().setThrowExceptionOnScriptError(false);webclient
.getOptions().setThrowExceptionOnFailingStatusCode(false);webclient
.getOptions().setCssEnabled(false);webclient
.getOptions().setJavaScriptEnabled(true);HtmlPage htmlpage
= webclient
.getPage("http://www.baidu.com/gaoji/advanced.html");HtmlForm form
= htmlpage
.getFormByName("f1");HtmlSubmitInput button
= form
.getInputByValue("百度一下");HtmlTextInput textField
= form
.getInputByName("q1");textField
.setValueAttribute(keyword
);final HtmlSelect htmlSelet
=form
.getSelectByName("rn");htmlSelet
.setDefaultValue("10");final HtmlHiddenInput hiddenInputtn
= form
.getInputByName("tn");hiddenInputtn
.setDefaultValue("baiduadv");final HtmlPage page
= button
.click();String result
= page
.asText();webclient
.close();return result
;
}
三、捕獲接口獲取數據
通過前兩個方法往往有時候可能無法得到我們想要的結果,捕獲的html頁面代碼可能會缺失數據,同時還有可能會被網站監測到進而被禁掉ip地址,導致我們無法繼續獲取頁面數據
我們想想數據是從哪來的,一般都是通過接口得到的對吧,那么要是我們可以直接訪問接口呢?下面是我的思路:
- 1、找我們想要爬取數據的網站,通過在對應網站按下F12調出控制臺,然后我們刷新一下頁面,在NetWork板塊查看請求數據
如圖查看XHR這一欄可以看訪問的url - 2、這里我們用csdn博客舉例,在XHR這一欄尋找那些響應格式為json的url,這里我們找到了一條:
- 3、我們使用postman測試一下該接口會返回什么數據:
通過文字我們可以知道,這里的數據是導航欄這里的,如下
因此我們可以通過調用該接口獲取到對應數據啦!最后將數據封裝成為我們需要的格式就ok。
這種方法雖然可以穩定獲取到數據,但實際上在很多網站上我們在XHR請求中是看不到接口的,這是由于考慮了跨域而使用了jsonp,這些可以在js中找,感興趣的可以了解一下
總結
以上是生活随笔為你收集整理的使用java爬取数据的三种思路的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。