[java爬虫] [填坑ing] 爬虫解析数据方法

368次阅读
没有评论

 

先说一下关于筛选我用的比较多的是String的查找下标以及根据下标进行截取来达到把数据从源码中剥离出来

当然这种方法也不是很完善的我们慢慢说

 

话不多说直接干货

 

筛选方法

String数据解析

String方法实例

 

 

一.筛选方法

1.正则表达

2.xpath

3.还有我用的String方法

等等

 

正则表达比较简单明了,而且可用于多平台,多语言,但要求正则表达掌握的比较熟练.

xpath 原本是 XML 路径语言 也同样使用于HTML 文本格式,可以快速定位到指定节点位置,但我没有使用过不进行评论,可以在收到很多教程

最后就是java 自带的String 方法,将源码写入字符串中,查找指定字符串定位下标,根据下标截取数据,由于我用的比较多进行详解

 

二.String数据解析

先讲一下缺点吧

  • 占用资源比较多,String中的数据存储在内存中,因为使用字符串存储页面源码,如果遇到特殊情况,如比较老的页面结构,广告比较多的页面结构,这都会增加源码大小,进而影响解析速度,当然有简单办法解决
  • 需要写的逻辑比较多,使用查找字符串来定位数据前后下标,在使用下标截取数据,简单的html层次可能直接定位截取就可以,但复杂页面可能需要层层剥离在多次定位才能截取到
  • 对新的页面需要重新写新的解析方式,这个解析方法只能做到一对一,一套方法对应一个网站
  • 需要事先定位,有些数据位置需要多次测试定位到.

缺点说了一堆,但大多都是数据解析的通病,下面详细说一下我解析数据的方法

首先先说一下如果比较熟悉H5的结构对数据的解析帮助很大

 

 

页面上的数据都是将H5+css+js解析后呈现的,但源码有些就比较复杂.

我在解析的时候主要分为好几步(还没想好会有几步)

 

  • 分析数据大致位置
  • 对不需要的,可能对解析产生影响的,假的数据先进行剔除,留下含有数据的部分
  • 如<ul><li>结构,数据存储在相同并重复的标签内,使用每一条数据中只出现一次的字符串进行拆分
  • "洋葱"结构,从上到下每层都可能会有数据,获取一层数据删除一条数据,防止干扰
  • 获取数据,将数据整理入库
  •  

    三.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();替换方法,去除干扰项,前字符串为目标,后字符串为更换值,后值为""时,删除指定项

     

  • 讲一个例子:获取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);

    [java爬虫]

     

     

    String [] ArrayList = text.split("<li>"); // List<String> liat = new ArrayList<String>(); for(String array : ArrayList){ //判断是否为含有数据的标签 if(array.indexOf("<a") > 0 ){ liat.add(array); } } //最后list里就是包含一些标签的数据,只需要循环截取数据即可

    [java爬虫]

     

    神龙|纯净稳定代理IP免费测试>>>>>>>>天启|企业级代理IP免费测试>>>>>>>>IPIPGO|全球住宅代理IP免费测试

    相关文章:

    版权声明:Python教程2022-10-27发表,共计2800字。
    新手QQ群:570568346,欢迎进群讨论 Python51学习