爬虫抓了那么多的数据,该如何处理呢?

Python技术杂谈 2019-06-24 22:38:46 阅读(6165) 评论(0)

上周星期天做了第一次B站直播,有点激动,分享的主题是网页正文抽取和NLP基本知识普及。晒一下直播画面:

b站直播网页正文抽取

今天把昨天的直播视频内容整理了一下,发在猿人学公众号上。要观看录播的可以点击B站的录播地址 https://www.bilibili.com/video/av56617843

到目前为止,我们分享了很多爬虫技术,也就是如何抓取到我们想要的数据。那么抓来的数据该如何处理呢?前面我们涉及到这方面的技术很少,对不起大家啦,我来晚啦。

我们抓到的很大一部分数据就是文本,比如抓来的新闻、博文、微博、公众号文章等等,甚至是商品的评价、影视节目的评价、弹幕等等,这些统统是文本数据。本文主要围绕文本数据的分析处理技术进行展开。

 

一、主要文本提取

这个算法是针对新闻网页、博客文章等主体内容是大量文本的网页的。我们要从抓取到的网页html中,提取新闻网页的文字内容,提取博客文章的文章内容,比较简单直接的方法,就是针对一个网页的html写个正则表达式或者用xpath规则(即,建立提取模板)进行提取。这个方法没毛病,但仅仅是对于少数几个网站时比较方便,如果我们要提取几百个甚至几千个新闻网站或博客的文字内容时,一个网站一个网站的建立模板将会是一个非常累人的活儿,维护这么多模板也是一个辛苦的事情,一旦网站改版,模板就失效,要及时修改模板。

这里,我将给大家介绍一种通用的算法来提取这类以文字为主的网页的文本内容(或者叫正文)。这个算法的思想其实很简单,是通过计算文本密度来得到html中包含正文内容的标签。

我们以猿人学网站的一篇博文网页为例,来看看这个算法是如何实现的。

首先,我们先看看一篇博文网页的结构:

猿人学网页界面

这篇博文网页同步是菜单栏,左侧是一个系列文章的导航菜单,右侧是相关文章,这些不是我们要的正文内容。正文内容在中间一列。上面截图没有把中间这一列截全,它比较长。

再打开这个网页的源代码看看,一眼望去,可以看到纯文本的密度还是比较明显的。

网页文本密度

这里,我们要理清几个概念:

纯文本: 指的是html代码中,html标签(tag)外面的字符,这些是在网页中看到的文字。所以style和JavaScript相关的字符虽然在标签外面,但也不是纯文本。

标签文本: 是包含在<>之间的部分,截图中可以看到它们是带颜色的,而纯文本是黑色的。而style和JavaScript不在<>之间但它们不会显示在网页中,所以这两者也是标签文本。

理解了上面两个概念,我们再看看网页源代码,黑压压的部分就是我们要提取的正文部分。而那些花花绿绿的部分是我们不要的菜单、相关推荐。

发现这个规律后,我们就可以通过代码来找到哪部分html代码的“黑压压”程度最大,那这部分就是我们要找的正文部分。

具体的算法如下:

  1. 通过lxml构建网页的DOM树
  2. 遍历DOM数的每个节点,计算该节点及其子节点的文本长度。为什么要计算子节点呢?因为一篇文章的正文内容部分通常是一个<div>节点下面包含多个<p>节点,每个<p>节点是一个段落。
  3. 通过排序得到文本长度最长的那个节点,提取该节点的文本内容就得到了这个网页的正文文字。

这个算法是不是很简单,详细你可以自己实现这个算法。不过,这个算法里面还是有很多tricks的,可能有些细节你不长时间的使用是不会想到的。巧的是,我把这个算法开源了,你可以从中发现更多的细节。

老规矩,猿人学Python微信公众号后台回复“正文提取”来获取源代码。

 

二、建立你自己的搜索引擎

爬虫抓了大量的网页,又从中提取了大量的文本内容。我们拿他们干嘛用呢?最基本的就是可以做一个搜索引擎。

比如抓了大量的新闻网页,我们可以建立一个“新闻搜索引擎”,就像百度新闻搜索一样;

或者,我们抓了大量的技术文章,就可以建立一个“技术搜索引擎”,如果你能把stackoverflow、github上面的东西也抓下来放到这个“技术搜索引擎”里面,那么你这个搜索引擎肯定受程序员欢迎。

那么如何做这样的搜索引擎呢?可能你已经知道,想Google、百度这样的搜索引擎也就三大块模块:

爬虫:抓网页

索引:给网页建立倒排索引,方便快速搜索

搜索:根据搜索词去索引里面找,并根据一定的排序算法排序结果。

爬虫我们已经有了,网页也清洗过了(提取了正文),接下来就是要实现索引和搜索。

搜索引擎从Google开始到现在已经二十年了,这方便的技术是很成熟了。同样的开源工具也有很多工大家学习和使用。这里,介绍两个给大家,今后工作学习中如果需要全文搜索的话,就用它们好了。

(1)Elasticsearch:估计很多人都知道这个工具了,这是开源界使用最广的搜索引擎。

(2)Sphinxsearch:这个也是一个非常好的工具,用C++实现,比Java时效性的Elasticsearch要更快。它和MySQL结合的非常好,也就是说,你的数据放在MySQL,它的索引程序会读取MySQL数据并建立索引。当然,它还支持PostgreSQL等其它数据库。我使用这个搜索引擎有十年了,还是很推荐它的。

2017年,Sphinxsearch团队的一些人出来另立门户,取名:ManticoreSearch。Sphinx和Manticore都是怪兽的名字,这俩队伍有点死磕的味道。这之后,Sphinx就不发布源码了,只发布编译好的二进制程序;而Manticore再当时sphinx代码的基础上开始了自己开发的过程,同时继续开源。

我也把搜索引擎从Sphinx换到了Manticore,并给代码加上了中文分词的支持,并把代码放到了我的github上,后来有个人看到了我的代码就给Manticore提交了pullrequest。我看到后,Manticore刚发布了3.0版本,这个版本改动很大,我添加的分词是2.3版的,对3.0版的代码有很大的冲突。于是,我又在3.0版本上加了中文分词并提交给Manticore。结果他们回复,他们正在做基于ICU的中文分词部分,就不merge我的分词了。目前的情况是,他们已经发布了支持中文分词的代码到github上。我试过最新代码,是可以使用的。但是,官方还没有发布相关文档,如果你要使用官方的中文分词部分,先去看看pullrequest里面我与他们的对话就弄明白了。后面有机会,我写个使用文档。

 

三、词云图

先感官上认识一下它是个什么东东:

词云图

上面这样的图片就称为“词云图”,通过词语的权重来控制文字的大小,来把很多词汇绘制到一张图片中。

绘制词云图的目的是直观了解一篇文章或一批文章中哪些话题比较热门,这是数据可视化的一种方式。

要绘制这样一张图,用Python先进行分词,统计词频,去掉停用词就会得到一组词汇及其词频,词频越大的写出来的字体也越大。

要画这个图,可以用PIL模块,加上中文字体,还要计算图片哪些地方是空白的等等。这个绘制过程确实比较复杂。但你不用怕,Python已经有现成的库来完成这件事情,它就是wordcloud,需要的时候用它吧。

 

四、自然语言理解(NLP)

上面统计词频时,我们提到了“分词”,这个技术就是NLP的一部分。“分词”就是给中文文本中词汇之间加上空格,我们知道,英文单词之间是有空格的,而中文词汇之间没有分隔符。

NLP是IT技术的一个领域,它试图让计算机自动化处理我们人类的语言(自然语言),甚至是理解自然语言。这个领域已经发展了很多很多年,搜索引擎其实就应用了大量的NLP技术来提高搜索结果的相关性。

分词是中文NLP的最基本的技术,基础的NLP主要包括:

(1)中文分词

学/ Python/ 上/ 猿人学/ 网站

(2)词性标注

学/v Python/n 上/v 猿人学/n 网站/n

(3)命名实体识别

学/v Python/n 上/v 猿人学/N 网站/n

(4)句法分析

句法分析

爬虫抓取过来的文件数据,可以通过NLP技术做分析。目前,基本的NLP的开源工具也有很多,这里向大家介绍几个好用的。

(1)jieba分词

它使用纯Python实现,所以在Windows、Linux上使用都很方便。它的口号是“做最好的 Python 中文分词组件”。除了分词,它还有“关键词抽取”,可以用来抽取关键词去画词云图。

(2)LTP:哈工大开源

(3)THUNLP:清华大学开源

这两个是学院派的工具,用C++实现,封装为Python模块。使用起来可能要费点事,但是它功能多,除了分词,词性标注、命名实体识别、句法分析的功能都有。

猿人学banner宣传图

我的公众号:猿人学 Python 上会分享更多心得体会,敬请关注。

***版权申明:若没有特殊说明,文章皆是猿人学 yuanrenxue.con 原创,没有猿人学授权,请勿以任何形式转载。***

说点什么吧...