[java爬蟲] [填坑ing] 爬蟲解析數據方法

 

先說一下關於篩選我用的比較多的是String的查找下標以及根據下標進行截取來達到把數據從源碼中剝離出來

當然這種方法也不是很完善的我們慢慢說

 

話不多說直接乾貨

 

篩選方法

String數據解析

String方法實例

 

 

一.篩選方法

1.正則表達

2.xpath

3.還有我用的String方法

等等

 

正則表達比較簡單明瞭,而且可用於多平臺,多語言,但要求正則表達掌握的比較熟練.

xpath 原本是 XML 路徑語言 也同樣使用於HTML 文本格式,可以快速定位到指定節點位置,但我沒有使用過不進行評論,可以在收到很多教程

最後就是java 自帶的String 方法,將源碼寫入字符串中,查找指定字符串定位下標,根據下標截取數據,由於我用的比較多進行詳解

 

二.String數據解析

先講一下缺點吧

  • 佔用資源比較多,String中的數據存儲在內存中,因爲使用字符串存儲頁面源碼,如果遇到特殊情況,如比較老的頁面結構,廣告比較多的頁面結構,這都會增加源碼大小,進而影響解析速度,當然有簡單辦法解決
  • 需要寫的邏輯比較多,使用查找字符串來定位數據前後下標,在使用下標截取數據,簡單的html層次可能直接定位截取就可以,但複雜頁面可能需要層層剝離在多次定位才能截取到
  • 對新的頁面需要重新寫新的解析方式,這個解析方法只能做到一對一,一套方法對應一個網站
  • 需要事先定位,有些數據位置需要多次測試定位到.

缺點說了一堆,但大多都是數據解析的通病,下面詳細說一下我解析數據的方法

首先先說一下如果比較熟悉H5的結構對數據的解析幫助很大

 

 

頁面上的數據都是將H5+css+js解析後呈現的,但源碼有些就比較複雜.

我在解析的時候主要分爲好幾步(還沒想好會有幾步)

 

  1. 分析數據大致位置
  2. 對不需要的,可能對解析產生影響的,假的數據先進行剔除,留下含有數據的部分
  3. 如<ul><li>結構,數據存儲在相同並重復的標籤內,使用每一條數據中只出現一次的字符串進行拆分
  4. "洋蔥"結構,從上到下每層都可能會有數據,獲取一層數據刪除一條數據,防止干擾
  5. 獲取數據,將數據整理入庫

 

三.String方法實例

HTML源碼

<!doctype html>
<html data-path="/newsflashes">
<head> 
  <meta charset="UTF-8"> 
  <meta name="xxxxx" content="xxxxx"> 
  <title data-react-helmet="true">xxxx</title>
  <link href="xxxxxx" rel="xxxxx" type="xxxxx">
  <script></script>
</head> 
<body>
  <div class="code">
    <div class="code-img"></div>
      <div class="code-content">
        <div class="tabs">
         <ul class="business-line">
            <li><a href="https://mp.csdn.net">數據1</a></li>
            <li><a href="https://mp.csdn.net">數據2</a></li>
            <li><a href="https://mp.csdn.net">數據3</a></li>
            <li><a href="https://mp.csdn.net">數據4</a></li>
            <li><a href="https://mp.csdn.net">數據5</a></li>
            <li><a href="https://mp.csdn.net">數據6</a></li>
         </ul>
          <ul class="business-line">
            <li><a href=""></a></li>
            <li><a href=""></a></li>
            <li><a href=""></a></li>
            <li><a href=""></a></li>
            <li><a href=""></a></li>
            <li><a href=""></a></li>
         </ul>
        </div>
      </div>
    </div>
  </div>
  <div class="code">
    <div class="kr-header-passport" style="display:inline-block">
          <a class="login"><span>數據1</span></a>
          <a class="line">數據2</a>
          <a class="resgister"><span>數據3</span></a>
    </div>
    <div class="code-img"></div>
      <div class="share-code">數據4</div>
      <div class="code-content">
        <div class="tabs">
        <div class="kr-white-space" style="height:40px;width:100%;"></div>
         <div class="kr-white-space" style="height:40px;width:100%;"></div>
        </div>
      </div>
    </div>
  </div>
</body>

可以用這個源碼作爲例子模擬實現一下

和上一篇講的一樣主要用到幾個方法

.indexOf();//從前往後查找指定字符串,返回下標

.lastIndexOf();//從後往前查找字符串,返回下標

.substring();根據兩個下標,獲取兩個下標之間的字符串(如果下標長度長與字符串長度,報錯,前下標大於後下標,報錯)

.split() 將字符串拆分爲數組,注意次方法可以寫正則表達,可能會有干擾,但注意特殊字符需要轉移

.replace();替換方法,去除干擾項,前字符串爲目標,後字符串爲更換值,後值爲""時,刪除指定項

 

  1. 講一個例子:獲取ul裏數據
//第一步除去head無用數據
text = H5源碼
beginIndex = text.indexOf("<body>");
text = text.substring(0, endIndex);

//第二部獲取含有數據區域
beginIndex = text.indexOf("<div class="code">");
endIndex = text.lastIndexOf("<div class="code">");
text = text.substring(beginIndex, endIndex);

 

 

String [] ArrayList = text.split("<li>");
//
List<String> liat = new ArrayList<String>();
for(String array : ArrayList){
    //判斷是否爲含有數據的標籤
    if(array.indexOf("<a") > 0 ){
        liat.add(array);
    }
}
//最後list裏就是包含一些標籤的數據,只需要循環截取數據即可

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章