大数据处理之道 (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个不同的,也可以分为几类。 三:遇到的问题 (1) 问题:java.io.IOException: Server returned HTTP response code: 403 for URL: http:// (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); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |