半途而廢的Java爬蟲學習經歷

最近在面試,發現Java爬蟲對於小數據量數據的爬取的應用仍是比較廣,抽空週末學習一手,留下學習筆記html

Java網絡爬蟲

簡單介紹

爬蟲我相信你們都應該知道什麼,有什麼用,主要的用途就是經過程序自動的去獲取獲取網上的信息數據,寫爬出比較出色的就是PY,可是對於小排量的數據而言,java也是能夠知足要求的;java

HttpClient發起請求

爬蟲爬取網頁上的數據和咱們單獨點擊連接訪問網頁數據是同理的,是要使用Http協議訪問網頁的,這裏咱們使用Java的Http協議客戶端HttpClient來實現抓取網頁數據面試

Hello World

  • 可讀性最高的一個列子幫助你們理解一下步驟正則表達式

帶參數的Get請求

帶參數的Post請求

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();
 } } } }

獲取資源的相關時間配置

Jsoup不是Jsonp

通過上面咱們的學習,咱們經過HttpClient已經可以抓取到頁面了,抓取到頁面以後咱們能夠對其進行解析,可使用字符串解析工具來對頁面進行一個解析,也可使用正則表達式的方式進行解析,可是這兩個方案的開發成本很大,不推薦使用,這裏咱們學習一個專門解析html頁面的技術 Jsonp工具

Jsoup介紹

jsonp是一款Java的Html解析器,可本身而解析某個url地址、html文本內容,他一共了一套現成的API來去除和操做數據post

jsonp的功能:

  • 從一個URL,文字或字符串中解析HTML

  • 使用DOM或者CSS選擇器來進行查找,取出數據

  • 可操做HTML元素、屬性、文本

Jsoup解析URL

添加Jsoup的依賴便可使用Jsoup

  • 這個是咱們待會爬取的頁面的一個頁面源碼

  • 個人的Java代碼

    • 能夠看大已經獲取到咱們想要的數據

注意:Jsoup僅僅侷限於Html的解析工具使用,而不是替代HttpClient發起請求使用,由於HttpClient支持多線程,鏈接池,代理等技術,而Jsoup對此的支持不太理想,專業的事交給專業的人,HttpClient去發請求抓數據,Jsoup幹解析

Jsoup解析字符串

  • 解析字符串的話,咱們隨便寫一個靜態頁面,使用根據類把它轉換成字符串便可

  • Java代碼

Jsoup解析文件

仍是上面那個靜態頁面,咱們除了把它轉換成String後來解析外,也能夠直接對該文件進行解析

使用Dom方式遍歷文檔

我記得還有一個sax解析吧,那個比較麻煩,如今都快忘記了;

Dom解析,不知道你們有沒有聽過或者使用過,反正我之前是使用過,不過解析的確實XML,我先簡單的介紹一個Dmo方式吧

Dmo解析會把目標文檔當成一個對象來處理,先把整個文檔加載到內存中,若是文檔過於太大,可能內存溢出(通常不會),加載進內存的以後就會構建一顆Dom樹,而後纔開始提供訪問和修改操做

若是你沒有學習過,下面咱們就經過一個小Demo來學習一下,若是你使用過,咱們就權當複習一下:

  • 首先定義一個自定義的html靜態頁面

Java代碼以下:幾種經常使用獲取頁面數據的api我都演示了一下

元素中獲取屬性

  • html頁面以下

  • Java代碼

 

Selector選擇器

  • 「標籤名」 :根據標籤獲取元素

  • #id :根據id獲取元素

  • .classValue :根據className獲取元素

  • [自定義屬性key] :根據屬性key獲取元素,能夠是官方key,亦可爲自定義key

  • [屬性key=屬性value] :根據 k=v 這方式鎖定元素,獲取數據

下面分別對以上始終選擇器的使用作一下演示

  • html頁面

  • Java代碼

Selector選擇器組合使用

  • Java:1

  • html :1

  • Java :2

  • html :2

Hello World級爬蟲小案列

在上面的學習中,咱們已經知道,HttpClient的做是爬取數據的,而Jsoup是對HttpClient爬取到的數據作一個解析用的,下面咱們就賴練習一下這兩個工具的使用

擱淺一哈,暫時...往後更新

相關文章
相關標籤/搜索