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

一:起因

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

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

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

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

二:Filter过滤器的简介

顾名思义,Filter就是对于结果进行过滤,取得需要的内容。HTMLParser在org.htmlparser.filters包之内一共定义了16个不同的Filter,也可以分为几类。

(1)判断类Filter:

TagNameFilter   ----- html标签指定指定过滤器

HasAttributeFilter  ------  属性和属性值指定过滤器

HasChildFilter ------ 是否包含子

HasParentFilter

HasSiblingFilter

IsEqualFilter

(2)逻辑运算Filter:

AndFilter  ------ 同时满足两个或多个过滤条件的过滤器

NotFilter   ------  非

OrFilter    -------  或

XorFilter

(3)其他Filter:

NodeClassFilter

StringFilter   -------  过滤敏感信息的过滤器

LinkStringFilter  --------- 过滤敏感链接信息的过滤器

LinkRegexFilter ------- 链接正则表达式过滤

RegexFilter  --------  html界面可显示的字符串正则表达式过滤

CssSelectorNodeFilter

(4)所有的Filter类都实现了org.htmlparser.NodeFilter接口。这个接口只有一个主要函数:

boolean accept (Node node);   各个子类分别实现这个函数,用于判断输入的Node是否符合这个Filter的过滤条件,如果符合,返回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, "UTF-8", ImageTag.class);
        //或取页面<title>xxxx</title>标题
        nodeFilterTagClass(htmlURL, "UTF-8", TitleTag.class);
        //获取页面<div [属性='属性值']> xxx</div>
        nodeFilterTagClass(htmlURL, "UTF-8", Div.class);

}
时间: 2024-10-24 08:07:00

大数据处理之道 (htmlparser 过滤器<二>)的相关文章

大数据处理之道 (MATLAB 篇&lt;三&gt;)

一:起因 (1)最近一直在处理大数据,从MB ----> GB的变化,是一次质的飞跃,相应的工具也在变 从widows到linux,从单机单核 到 hadoop多节点的计算 (2)问题来了,面对海量的数据,如何从中挖掘实用的信息或者发现潜在的现象,可视化工具可能是必不可少的 : (3)可视化工具可以说百度一大篇,可是作为研究者的我们,程序猿的我们可能更希望能够抽象出一种数学模型,对现实的现象进行非常好的描述和刻画 (4)Python(数据清洗和处理) + MATLAB(模型分析) 或 c++/j

大数据之道 HMM系列&lt;二&gt;(成长)

一:HMM解码问题 (1)编程深处无非就是算法和结构,以及各种架构和版本的管理(如Git管理),因此作为程序员算法这一关是绕不过去的: (2)关于算法,个人比较崇尚的一本书是<算法导论>和ACM实战系类的算法培训: (3)对于自然语言处理领域或者部分机械学习领域的算法,HMM模型是非常经典的算法之一,非常适合初学者学习和研究: (4)HMM模型μ=(A,B,π),的状态是不可见的,我们看到的仅仅是状态表现出来的观察值和状态概率函数. 二:HMM简介(u = {N,M,A,B,pai} ---&

大数据处理之道 (htmlparser获取数据&lt;一&gt;)

一:简介 (1)HTML Parser是一个用于解析Html的Java的库,可采用线性或嵌套两种方式.主要用于网页的转换或提取,他有一些特性:过滤器filter,遍历器visitors,通常的标签tagName和易用的JavaBeans.它是一个快速,健壮,并严格测试过的组件. (2)个人理解:HTMLParser遍历了网页的内容以后,以树(森林)结构保存了结果,各个节点代表HTML中的标签和属性值,非常类似于XML解析器解析后的结果,也类似与html dom的结构:HTMLParser访问结果

大数据处理之道 (MATLAB 篇(二))

一:起因 (0)开始个人非常抵触MATLAB编程语言的,肯能是部分编程人员的通病 -- 学会c/c++或者java,就会鄙视其他的语言,懒得尝试其他语言.直到有一天--他发现,他或者她发现自己精通的这门语言实在是解决不了这个问题时,才做出改变. (1)最近一直在处理大数据,从MB ----> GB的变化,是一次质的飞跃,相应的工具也在变 从widows到linux,从单机单核 到 hadoop多节点的计算 (2)问题来了,面对海量的数据,如何从中挖掘实用的信息或者发现潜在的现象,可视化工具可能是

大数据处理之道(实验方法&lt;二&gt;)

一:交叉验证(crossvalidation)(附实验的三种方法)方法简介 (1) 定义:交叉验证(Cross-validation)主要用于建模应用中,例如PCR(Principal Component Regression) .PLS(Partial least squares regression)回归建模中.在给定的建模样本中,拿出大部分样本进行建模型,留小部分样本用刚建立的模型进行预报,并求这小部分样本的预报误差,记录它们的平方加和.这个过程一直进行,直到所有的样本都被预报了一次而且仅

大数据处理之道 (Gibbs Sampling)

一:简介以及学习的途径 (1)吉布斯采样(Gibbs Sampling)及相关算法  (学习向Gibbs sampling, EM,  MCMC算法 等的好地方) 1) 推荐大家读Bishop的Pattern Recognition and Machine Learning,讲的很清楚,偏理论一些: 2) 读artificial Intelligence,2.3版,都有: 3) 如果英语好的话,最方便的就是查wikipedia,这个说的最清楚(研究生推荐读一读这个) 4)不要什么都百度去,百度在

大数据处理之道 (MATLAB 篇)

一:起因 (1)最近一直在处理大数据,从MB ----> GB的变化,是一次质的飞跃,相应的工具也在变 从widows到linux,从单机单核 到 hadoop多节点的计算 (2)问题来了,面对海量的数据,如何从中挖掘实用的信息或者发现潜在的现象,可视化工具可能是必不可少的 : (3)可视化工具可以说百度一大篇,可是作为研究者的我们,程序猿的我们可能更希望能够抽象出一种数学模型,对现实的现象进行非常好的描述和刻画 (4)Python(数据清洗和处理) + MATLAB(模型分析) 或 c++/j

大数据处理之道(十分钟学会Python)

一:python 简介 (1)Python的由来 Python(英语发音:/?pa?θ?n/), 是一种面向对象.解释型计算机程序设计语言,由Guido van Rossum于1989年底发明,第一个公开发行版发行于1991 年.Python语法简洁而清晰,具有丰富和强大的类库.它常被昵称为胶水语言,它能够把用其他语言制作的各种模块(尤其是C/C++)很轻松地联结 在一起.常见的一种应用情形是,使用Python快速生成程序的原型(有时甚至是程序的最终界面),然后对其中有特别要求的部分,用更合适的

大数据处理之道(预处理方法)

一:为什么要预处理数据? (1)现实世界的数据是肮脏的(不完整,含噪声,不一致) (2)没有高质量的数据,就没有高质量的挖掘结果(高质量的决策必须依赖于高质量的数据:数据仓库须要对高质量的数据进行一致地集成) (3)原始数据中存在的问题: 不一致 -- 数据内含出现不一致情况 反复 不完整 -- 感兴趣的属性没有 含噪声 -- 数据中存在着错误.或异常(偏离期望值)的数据 高维度 二:数据预处理的方法 (1)数据清洗 -- 去噪声和无关数据 (2)数据集成 -- 将多个数据源中的数据结合起来存放