吴化吉的博客

专注Web开发

发布时间:2018-10-04

浅谈爬虫解析HTML

所谓爬虫最本质的就是发送HTTP请求,明白了这个本质,爬虫大多数时候就是在组装HTTP参数而已,当然还会涉及反爬虫和反反爬虫,数据存储等,今天我只想关注一下如何更好提出HTML中的信息。

字符串提取

HTML本身就只是一堆字符串,最简单的就是字符串提取,只要有办法从中扣出想要的信息就可以了。按照这个思路,最主要的办法就是:正则表达式了。

编写好了正则,匹配HTML字符串,即可从中抠出信息了。这里就需要正则水平比较厉害了,需要能考虑到各种情况,HTML开闭标签,各种转码等,才能写出比较健壮的正则表达式,这方面并不是我的强项,就不多扯了。

DOM提取

HTML本身就是一个树形结构,所谓DOM,这一点相信学过一点前端的人都知道。DOM提取的思路则是,把HTML还原成DOM,这样就能方便在直接查找某个节点的内容。

这方面,似乎各个语言都会有相关的库来。比如著名的Python库beautifulsoup,;node.js 库 cheerio;PHP也有类似的库:https://github.com/paquettg/php-html-parser;其他语言不太清楚

这类库的原理是,把HTML组装成了DOM树,然后提供类似于jQuery选择器、或者CSS选择器的API(也可能支持xpath查询),让程序员能方便定位到需要提取的元素,并且还能根据属性之类的过滤,非常方便。

海量站点爬取

前面所说的字符串提取和DOM提取,是绝大多数爬虫选择的方案了。但我一直有一个疑惑,像Pocket这类稍后阅读,或者像轻芒杂志之类的,是如何做到对任意网页提取出恰当的正文内容,甚至能对网页重新设计网页样式的(轻芒杂志就以文章排版作为一个大卖点)。

这也是我最近才知道的答案:Readability算法。简单说,这一算法根据对标签进行分析,通过对不同情况下的标签进行打分,根据得分情况分析出文章的正文部分。具体可以Google一下这个算法,应该绝大多数这类保存网页的应用,都是用的这个算法,或者是在此基础上改良的。不同语言的也都有实现,我使用了PHP的实现测试了一下,提取效果还是不错的:https://github.com/andreskrey/readability.php