唉,没来这里好久了,也意味着我这一年多来没干什么正事儿,是回归的时候了!(简单谈谈爬虫的解析器)
2015-01-07 11:25
411 查看
现在ACM不搞了,一看上一篇文章的发布时间是13年2月,着实把自己吓了一跳。既然已经开始实习了,那就搞搞技术吧,但是算法的学习还不能断,算法导论还有好多知识没学呢嗯,既然实习期间分配的任务是搞一搞爬虫,那我就来说说java的html解析器的具体解析方式吧。首先网络爬虫的大体运行原理大家应该都知道了,如果不知道的话去Google一下,一搜一大把,我就不在这里赘述了。我主要想说的是具体的解析过程到底是怎么运作的,请看下面一段代码,不,是两段代码:
InputStream in = url.openStream(); InputStreamReader isr = new InputStreamReader(in, this.charset);//获取HTML页面的整个内容。 parentnode = getParentNode(urlstr); DefaultMutableTreeNode treenode = addNode(parentnode, newnode); SpiderParserCallback cb = new SpiderParserCallback(treenode);//声明解析器回调对象,里面的所有的回调方法均表示对特定标签的一种处理,具体回调是什么意思我将在后 续详细介绍。 ParserDelegator pd = new ParserDelegator(); //声明解析器。 pd.parse(isr, cb, true); //解析器开始解析,第一个参数表示解析的内容,第二个参数表示解析出一定标签后,调用一定的回调方法。
public class SpiderParserCallback extends HTMLEditorKit.ParserCallback { //此类的所有方法均针对解析器解析出的标签做出相应的操作。 private UrlTreeNode node; private DefaultMutableTreeNode treenode; private String lastText = ""; public SpiderParserCallback(DefaultMutableTreeNode atreenode) { this.treenode = atreenode; this.node = ((UrlTreeNode) this.treenode.getUserObject()); } public void handleSimpleTag(HTML.Tag t, MutableAttributeSet a, int pos) { //专门解析简单的标签。 if (t.equals(HTML.Tag.IMG)) { this.node.addImages(1); return; } if (t.equals(HTML.Tag.BASE)) { Object value = a.getAttribute(HTML.Attribute.HREF); if (value != null) { this.node.setBase(Spider.fixHref(value.toString())); } } } public void handleStartTag(HTML.Tag t, MutableAttributeSet a, int pos) { //专门解析带有开始结束标签的复杂字段。 if (t.equals(HTML.Tag.TITLE)) { this.lastText = ""; return; } if (t.equals(HTML.Tag.A)) { Object value = a.getAttribute(HTML.Attribute.HREF); if (value != null) { this.node.addLinks(1); String href = value.toString(); href = Spider.fixHref(href); if (href.contains("javascript:")) { return; } try { URL referencedURL = new URL(this.node.getBase(), href); Spider.this.searchWeb(this.treenode, referencedURL.getProtocol() + "://" + referencedURL.getHost() + referencedURL.getPath()); } catch (MalformedURLException e) { Spider.this.messageArea .append(" Bad URL encountered 2: " + href + "\n\n"); return; } } } } 由上述两段代码可知解析过程大致是,parser解析器解析出HTML内容,分类成各种标签,然后各种标签回调解析器里的各种对应方法最终实现解析器的工作流程。这些只是我浅薄的理解,肯定不很透彻,而且表达的也不是很清楚,但还是请大家多多批评指正,共同进步!
相关文章推荐
- 【身体这些部位不舒服的时候,你知道意味着什么吗?】
- 强悍的vbs,很多时候如果只是简单的写一个windows桌面工具,可以优先考虑一下vbs,js什么的。
- 最近学习java,好久不来这里写点什么了,今天胡说几句
- 简单谈谈GET和POST有什么区别
- Java简单爬虫系列(1)---什么是爬虫,爬虫原理,怎么来实现爬虫
- Google回归中国对SEO们意味着什么?
- 简单谈谈Server2008的NAP到底是什么
- (转)当别人努力的时候,你在做什么? 评论事情的一种态度 当你在抱怨的时候,为什么不想想我做了什么? 把简单的原则坚持贯彻下去 消极的心态,养成了惯性的思维,一切都是不好的。 也许这就是人性的弱点,不经意的习惯,却逐渐腐蚀了你的人生。
- python 简单爬虫之网页解析器 beautifusoup4插件应用
- 【身体这些部位不舒服的时候,你知道意味着什么吗?】收藏起来吧,震惊!实在是太...
- 一个最简单的爬虫-HTML解析器
- 【原】发布一段关于对XP占有率的评价,简单说说IT未来是什么?谈谈个人的一点点观点
- 身体这些部位不舒服的时候,你知道意味着什么吗?
- 再坚持一年多就写代码到40岁了,一直坚持.NET也没什么大错,傻B青年快乐多重新回归博客园
- 简单有效的防网络爬虫技巧?
- 软件工程中“签约”意味着什么?
- 什么时候会用到全屏幕模式? 来自csdn
- 什么时候会发生战争!
- 什么时候应该使用 ==?什么时候应该使用 Equals?