python通用网页正文提取框架goose使用入门

入门篇

相信写过爬虫的童鞋一定对于网页信息提取不陌生,常规的提取手段无非就是用正则表达式(re),lxml,bs4, pyquery等模块和包。但是这些包都有一个共同的特点,就是不同的网页需要编写不同的提取规则。这样子是很累的,那么有没有什么方法,能够不理会网页的结构,也能提取出来对应的一些信息呢?答案肯定是有的,那就是使用算法来计算出来。今天给大家介绍的是goose算法,该算法已有python实现,名为python-goose的包就是啦。python-goose 是一个python开发的通用网页正文提取框架,利用结巴(jieba)分词库和自然语言处理库(NLTK)结合对应的算法,正确的识别出网页的各项信息。goose主要能提取网页的以下信息:1. 网页的正文信息(纯文本)2. 网页的主图(很遗憾只有一张图片)3. 视频信息4. 描述(description)和tag标签0x00 安装python-goosepython-goose的源码存放在GitHub上,需要手动的下载安装,点击https://github.com/grangier/python-goose下载下载方法有两种,可以直接用git clone下来,也可以直接下载压缩包然后解压。下载下来之后,会得到这些文件,可以看到里面有两个比较重要的文件,一个是一个是,这两个文件一个是依赖包的文件,一个是安装文件。首先先安装依赖包,安装的方法也很简单,先cd到该文件夹的目录,然后运行如下命令:

python install -r requirements.txt

如果是Mac系统可能需要加上sudo以获取管理员权限。安装完成之后,再执行如下命令安装goose:

python setup.py install

最后进入python shell环境验证一下看看是否安装成功:

Python2.7.10(default,Oct62017,22:29:07)

[GCC4.2.1CompatibleAppleLLVM9.0.(clang-900.0.31)]ondarwin

Type"help","copyright","credits"or"license"formoreinformation.

>>>importgoose

>>>

如果没有报错,那么说明安装成功了。接下来就是怎么使用的问题了。需要注意的是,目前该模块只支持python2.7,不支持python3,如果要支持python3的话需要修改源码,不过由于这个模块本身效率不够高,所以就没啥心思去改了。0x01 goose常用方法获取网站的标题,描述和关键字等信息

# coding=utf-8

fromgooseimportGoose

g=Goose()

url="https://www.jianshu.com/p/205914510220"

article=g.extract(url=url)

title=article.title# 获取网页的标题

description=article.meta_description# 网页的描述信息

keywords=article.meta_keywords# 网页的关键字

print"标题:",title

print"描述:",description

print"关键字:",keywords

获取网站的正文内容对于中文网站,上面的代码是不能直接获取到网站的内容的,因为模块默认是英文的配置,所以中文站的时候需要改成中文的配置。那么为啥可以获取标题,描述这些呢?因为这些都是在固定的标签里面的,只需要提取对一个的标签就好了,但是每个网站的正文内容是存放在不同的HTML标签里面的,这时候就需要通过算法计算了。

# coding=utf-8

fromgooseimportGoose

fromgoose.textimportStopWordsChinese

url="https://www.jianshu.com/p/205914510220"

g=Goose({'stopwords_class':StopWordsChinese})

article=g.extract(url=url)

print"标题:",article.title

print"内容:",article.cleaned_text# 纯文本内容

有点遗憾的是,goose只提供了纯文本的内容输出,那么对于要获取文章的图片或者是保留一些HTML标签啥的就无能为力了。这里还有一个坑,那就是goose默认使用chardet模块来识别网页的编码,大家也知道,中文有的是gbk编码有的是utf-8编码,而这个模块呢,识别的时候也有可能是出错的,所以有可能有的页面你得到的就是乱码。这里先遗留几个问题

如果想要获取文章的所有图片,或者是保留某些标签等,如何实现?

如何避免网页的编码识别出错?

在多线程的情况下,goose运行很慢,这个又该如何解决?

这几个问题将在下一篇应用提高篇为大家一一解决,并写成一个通用的提取模块。还有一点需要注意的是,goose算法也不是100%提取准确的,对于文本内容比较丰富的网页识别率会比较高。对于图片、首页、列表页等页面就有点那啥了。由于goose本身使用的是urllib库来获取网页内容和下载图片,还有beautifulsoup来提取网页信息,接着还用jieba库进行分词等。所以导致整个流程下来是比较慢的。虽然可以通过一些手段进行稍微的优化,但是优化程度不是特别高,并算法本身复杂度在那里。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180711G1Q7UK00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券