入门篇
相信写过爬虫的童鞋一定对于网页信息提取不陌生,常规的提取手段无非就是用正则表达式(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库进行分词等。所以导致整个流程下来是比较慢的。虽然可以通过一些手段进行稍微的优化,但是优化程度不是特别高,并算法本身复杂度在那里。
领取专属 10元无门槛券
私享最新 技术干货