加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

大数据处理之道 (htmlparser 过滤器<二>)

发布时间:2020-12-14 02:51:50 所属栏目:大数据 来源:网络整理
导读:一:起因 (1)最近用于任务需要一直在爬取网页HTML的内容,与类似于爬虫的HtmlParser接触的比较多,爬取无非就是过滤自己想要的信息,因此Filter是核心,当然String类中的matches(regex)函数和contains(str)函数也是非常有用的 (2)经常和爬虫打交道就会

一:起因

(1)最近用于任务需要一直在爬取网页HTML的内容,与类似于爬虫的HtmlParser接触的比较多,爬取无非就是过滤自己想要的信息,因此Filter是核心,当然String类中的matches(regex)函数和contains(str)函数也是非常有用的

(2)经常和爬虫打交道就会分析各式各样的网站设计以及布局:用的设计的非常有规律,如QQ空间,微博信息等爬取非常简单(当时要想翻页的话,就得模拟登陆了),有些静态网站也是比较容易爬取的;其他的就麻烦了,信息全部写在JS里面,你就会哭了,如邮箱内容爬取;

(3)如果爬取敏感信息,就需要会一点点正则表达式的语法了

(4)与HtmlParser 工具包类似还有HtmlClient,这里提供HtmlParser工具包的下载地址 ?和 官方在线API?

二:Filter过滤器的简介

顾名思义,Filter就是对于结果进行过滤,取得需要的内容。HTMLParserorg.htmlparser.filters包之内一共定义了16个不同的,也可以分为几类。
(1)判断类
TagNameFilter ? ----- html标签指定指定过滤器
HasAttributeFilter ?------ ?属性和属性值指定过滤器
HasChildFilter ------ 是否包含子

HasParentFilter
HasSiblingFilter
IsEqualFilter
(2)逻辑运算
AndFilter ?------ 同时满足两个或多个过滤条件的过滤器
NotFilter ? ------ ?非
OrFilter ? ?------- ?或
XorFilter
(3)其他
NodeClassFilter
StringFilter ? ------- ?过滤敏感信息的过滤器
LinkStringFilter ?--------- 过滤敏感链接信息的过滤器
LinkRegexFilter ------- 链接正则表达式过滤
RegexFilter ?-------- ?html界面可显示的字符串正则表达式过滤

CssSelectorNodeFilter
(4)所有的类都实现了org.htmlparser.NodeFilter接口。这个接口只有一个主要函数:
boolean accept (Node node); ??
各个子类分别实现这个函数,用于判断输入的Node是否符合这个的过滤条件,如果符合,返回true,否则返回false

三:遇到的问题

(1) 问题:java.io.IOException: Server returned HTTP response code: 403 for URL: http://

问题解释:当你使用java程序检索其他网站上的内容时,如果其服务器设置了禁止抓取,或者其访问需要权限;如果此时你去检索网页那么就会有异常该异常出现;如果是服务器需要访问权限,比如说你要登录才能访问的网页,那么你抓取不了的;如果是服务器端禁止抓取,那么这个你可以通过设置User-Agent来欺骗服务器

// 添加User-Agent 代理 connection.setRequestProperty("User-Agent","Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
? ? ? ? ?// DigExt是IE5的“允许脱机阅读”模式时发出的特殊标记;comatible:兼容模式;Mozilla/4.0:火狐浏览器4.0版本
? ? ? ? ? ? URL url = new URL(htmlURL);// URL是java.net.*
? ? ? ? ? ? HttpURLConnection httpURLConnection = (HttpURLConnection)url.openConnection();//是java.net.*
? ? ? ? ? ? httpURLConnection.setRequestProperty("User-Agent","Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
? ? ? ? ? ? parser.setConnection(httpURLConnection);

(2)错误提示图片


什么是User Agent呢?User Agent中文名为用户代理,简称 UA,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。一些网站常常通过判断 UA 来给不同的操作系统、不同的浏览器发送不同的页面,因此可能造成某些页面无法在某个浏览器中正常显示,但通过伪装 UA 可以绕过检测。

(3)代码展示

  /**
     * 过滤页面中的标签信息
     * @param htmlURL        要解析的htmlURL页面
     * @param encoding    使用的字符编码
     * @param tagclass    
     * 要或取得页面标签,如要获取页面中的超链接 值为LinkTag.class,要获取页面中图片链接,值为ImageTag.class
     * 要传入的标签类为org.htmlparser.tags下的
     */
    public static void nodeFilterTagClass(String htmlURL,String encoding,Class tagclass){
        try {
            Parser parser = new Parser();
            // 添加 url代理,欺骗网页
            URL url = new URL(htmlURL);
            HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
            httpURLConnection.setRequestProperty("User-Agent","Mozilla/4.0(compatible; MSIE 5.0; Window NT; DigExt)");
            parser.setConnection(httpURLConnection);
            //parser.setURL(htmlURL);
            if(null==encoding){
                parser.setEncoding(parser.getEncoding());
            }else{
                parser.setEncoding(encoding);
            }
            //过滤页面中的链接标签
            NodeFilter filter = new NodeClassFilter(tagclass);
            NodeList list = parser.extractAllNodesThatMatch(filter);
            for(int i=0; i<list.size();i++){
                Node node = (Node)list.elementAt(i);
                System.out.println("link is :" + node.toHtml());
            }
            
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
    	// 爬取的url链接地址
        String htmlURL = "http://blog.csdn.net/u010700335";
        //获取页面中的<a href='xxx' [属性]>格式的链接
        nodeFilterTagClass(htmlURL,"UTF-8",LinkTag.class);
        //或取页面中的<img src='xxx' [属性='属性值']>格式的链接
        nodeFilterTagClass(htmlURL,ImageTag.class);
        //或取页面<title>xxxx</title>标题
        nodeFilterTagClass(htmlURL,TitleTag.class);
        //获取页面<div [属性='属性值']> xxx</div>
        nodeFilterTagClass(htmlURL,Div.class);

}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读