最近在面試,發現Java爬蟲對於小數據量數據的爬取的應用仍是比較廣,抽空週末學習一手,留下學習筆記html
爬蟲我相信你們都應該知道什麼,有什麼用,主要的用途就是經過程序自動的去獲取獲取網上的信息數據,寫爬出比較出色的就是PY,可是對於小排量的數據而言,java也是能夠知足要求的;java
爬蟲爬取網頁上的數據和咱們單獨點擊連接訪問網頁數據是同理的,是要使用Http協議訪問網頁的,這裏咱們使用Java的Http協議客戶端HttpClient來實現抓取網頁數據面試
可讀性最高的一個列子幫助你們理解一下步驟正則表達式
post也很簡單,和上面幾乎一致,改變一下發起請求的方式便可,以下:json
固然若是沒有攜帶參數的話,表單對象也是不用建立的,有一個HttpPost對象就能夠了api
對代碼中的對象的解釋:網絡
NameValuePair : 這是一個接口,點擊進去Ctrl + h 發現只有一個實現即:BasicNameValuePair,內有兩個屬性一個K,一個V
在咱們的爬取數據的過程當中,HttpClient這個鏈接對象的建立和銷燬是很是頻繁的,這裏咱們使用鏈接池對其進行優化多線程
public class poolTest { public static void main(String[] args) { //建立鏈接池管理器 PoolingHttpClientConnectionManager pcm = new PoolingHttpClientConnectionManager(); pcm.setMaxTotal(100); //設置池內最大鏈接數 pcm.setDefaultMaxPerRoute(10); //設置每一個墜機的最大鏈接數 //從鏈接池中獲取鏈接對象,而不是單首創建鏈接對象 CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(pcm).build(); HttpGet httpGet = new HttpGet("https://www.cnblogs.com/msi-chen"); System.out.println(httpGet); //使用httpClient發起請求,得到響應 CloseableHttpResponse response = null; try { response = httpClient.execute(httpGet); //解析響應,獲取到數據 if (response.getStatusLine().getStatusCode() == 200){ HttpEntity entity = response.getEntity(); String content = EntityUtils.toString(entity,"utf8"); System.out.println(content.length()); } } catch (IOException e) { e.printStackTrace(); }finally { if (response != null){ try { response.close(); } catch (IOException e) { e.printStackTrace(); } //由於咱們是鏈接池中獲取到的鏈接,因此這裏不能再給他關閉了 //httpClient.close(); } } } }
通過上面咱們的學習,咱們經過HttpClient已經可以抓取到頁面了,抓取到頁面以後咱們能夠對其進行解析,可使用字符串解析工具來對頁面進行一個解析,也可使用正則表達式的方式進行解析,可是這兩個方案的開發成本很大,不推薦使用,這裏咱們學習一個專門解析html頁面的技術 Jsonp工具
jsonp是一款Java的Html解析器,可本身而解析某個url地址、html文本內容,他一共了一套現成的API來去除和操做數據post
jsonp的功能:
從一個URL,文字或字符串中解析HTML
使用DOM或者CSS選擇器來進行查找,取出數據
可操做HTML元素、屬性、文本
添加Jsoup的依賴便可使用Jsoup
這個是咱們待會爬取的頁面的一個頁面源碼
個人的Java代碼
能夠看大已經獲取到咱們想要的數據
注意:Jsoup僅僅侷限於Html的解析工具使用,而不是替代HttpClient發起請求使用,由於HttpClient支持多線程,鏈接池,代理等技術,而Jsoup對此的支持不太理想,專業的事交給專業的人,HttpClient去發請求抓數據,Jsoup幹解析
解析字符串的話,咱們隨便寫一個靜態頁面,使用根據類把它轉換成字符串便可
Java代碼
仍是上面那個靜態頁面,咱們除了把它轉換成String後來解析外,也能夠直接對該文件進行解析
我記得還有一個sax解析吧,那個比較麻煩,如今都快忘記了;
Dom解析,不知道你們有沒有聽過或者使用過,反正我之前是使用過,不過解析的確實XML,我先簡單的介紹一個Dmo方式吧
Dmo解析會把目標文檔當成一個對象來處理,先把整個文檔加載到內存中,若是文檔過於太大,可能內存溢出(通常不會),加載進內存的以後就會構建一顆Dom樹,而後纔開始提供訪問和修改操做
若是你沒有學習過,下面咱們就經過一個小Demo來學習一下,若是你使用過,咱們就權當複習一下:
首先定義一個自定義的html靜態頁面
Java代碼以下:幾種經常使用獲取頁面數據的api我都演示了一下
元素中獲取屬性
html頁面以下
Java代碼
「標籤名」 :根據標籤獲取元素
#id :根據id獲取元素
.classValue :根據className獲取元素
[自定義屬性key] :根據屬性key獲取元素,能夠是官方key,亦可爲自定義key
[屬性key=屬性value] :根據 k=v 這方式鎖定元素,獲取數據
下面分別對以上始終選擇器的使用作一下演示
html頁面
Java代碼
Java:1
html :1
Java :2
html :2
在上面的學習中,咱們已經知道,HttpClient的做是爬取數據的,而Jsoup是對HttpClient爬取到的數據作一個解析用的,下面咱們就賴練習一下這兩個工具的使用
擱淺一哈,暫時...往後更新