[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里就是包含一些标签的数据,只需要循环截取数据即可

 

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