资讯专栏INFORMATION COLUMN

文章内容提取库 goose 简介

keithxiaoy / 3137人阅读

摘要:是一个文章内容提取器,可以从任意资讯文章类的网页中提取文章主体,并提取标题标签摘要图片视频等信息,且支持中文网页。

爬虫抓取数据有两个头疼的点,写过爬虫的小伙伴们一定都深有体会:

网站的 防抓取 机制。你要尽可能将自己伪装成“一个人”,骗过对方的服务器反爬验证。

网站的 内容提取 。每个网站都需要你做不同的处理,而且网站一旦改版,你的代码也得跟着更新。

第一点没什么捷径可走,套路见得多了,也就有经验了。关于第二点,今天咱们就来介绍一个小工具,在某些需求场景下,或许可以给你省不少事。

Goose

Goose 是一个 文章内容提取器 ,可以从任意资讯文章类的网页中提取 文章主体 ,并提取 标题、标签、摘要、图片、视频 等信息,且 支持中文 网页。它最初是由 http://Gravity.com 用 Java 编写的。python-goose 是用 Python 重写的版本。

有了这个库,你从网上爬下来的网页可以直接获取正文内容,无需再用 bs4 或正则表达式一个个去处理文本。

项目地址:
(py2) https://github.com/grangier/python-goose
(py3) https://github.com/goose3/goose3

安装

网上大多数教程提到的 python-goose 项目目前只支持到 python 2.7。可以通过 pip 安装:


 pip install goose-extractor

或者安装官网上的方法从源代码安装:


mkvirtualenv --no-site-packages goose
git clone https://github.com/grangier/python-goose.git
cd python-goose
pip install -r requirements.txt
python setup.py install

我找到一个 python 3 的版本 goose3


pip install goose3

经过我一些简单的测试,未发现两个版本在结果上有太大的差异。

快速上手

这里使用 goose3,而 python-goose 只要把其中的 goose3 改成 goose 即可,接口都是一样的。以我之前发过的一篇文章 如何用Python抓抖音上的小姐姐 为抓取目标来做个演示。


from goose3 import Goose
from goose3.text import StopWordsChinese
# 初始化,设置中文分词
g = Goose({"stopwords_class": StopWordsChinese})
# 文章地址
url = "http://zhuanlan.zhihu.com/p/46396868"
# 获取文章内容
article = g.extract(url=url)
# 标题
print("标题:", article.title)
# 显示正文
print(article.cleaned_text)

输出:

除了标题 title 和正文 cleaned_text 外,还可以获取一些额外的信息,比如:

meta_description :摘要

meta_keywords :关键词

tags :标签

top_image :主要图片

infos :包含所有信息的 dict

raw_html :原始 HTML 文本

如有有些网站限制了程序抓取,也可以根据需要添加 user-agent 信息:


 g = Goose({"browser_user_agent": "Version/5.1.2 Safari/534.52.7"})

如果是 goose3,因为使用了 requests 库作为请求模块,因此还可以以相似方式配置 headers、proxies 等属性。

在上述示例中使用到的 StopWordsChinese 为中文分词器,可一定程度上提高中文文章的识别准确率,但更耗时。

其他说明

Goose 虽然方便,但并不能保证每个网站都能精确获取,因此 适合大规模文章的采集 ,如热点追踪、舆情分析等。它只能从概率上保证大多数网站可以相对准确地抓取。我经过一些尝试后发现,抓取英文网站优于中文网站,主流网站优于小众网站,文本的提取优于图片的提取。

从项目中的 requirements.txt 文件可以看出,goose 中使用到了 Pillow、lxml、cssselect、jieba、beautifulsoup、nltk ,goose3 还用到了 requests ,我们之前很多文章和项目中都有所涉及:

这个男人让你的爬虫开发效率提升8倍
【编程课堂】jieba-中文分词利器

如果你是使用基于 python2 的 goose,有可能会遇到 编码 上的问题(尤其是 windows 上)。这方面可以在公众号对话里回复关键词 编码 ,我们有过相关的讲解。

除了 goose 外,还有其他的正文提取库可以尝试,比如 python-boilerpipe、python-readability 等。

实例

最后,我们来用 goose3 写小一段代码,自动抓取 爱范儿、雷锋网、DoNews 上的新闻文章:


 from goose3 import Goose
from goose3.text import StopWordsChinese
from bs4 import BeautifulSoup

g = Goose({"stopwords_class": StopWordsChinese})
urls = [
    "https://www.ifanr.com/",
    "https://www.leiphone.com/",
    "http://www.donews.com/"
]
url_articles = []
for url in urls:
    page = g.extract(url=url)
    soup = BeautifulSoup(page.raw_html, "lxml")
    links = soup.find_all("a")
    for l in links:
        link = l.get("href")
        if link and link.startswith("http") and any(c.isdigit() for c in link if c) and link not in url_articles:
            url_articles.append(link)
            print(link)

for url in url_articles:
    try:
        article = g.extract(url=url)
        content = article.cleaned_text
        if len(content) > 200:
            title = article.title
            print(title)
            with open("homework/goose/" + title + ".txt", "w") as f:
                f.write(content)
    except:
        pass

这段程序所做的事情就是:

抓取网站首页

从页面上提取地址中带有数字的链接(因为文章页基本带数字,这里为了演示简单以此判断)

抓取这些链接,提取正文。如果结果超过 200 个字,就保存成文件

效果:

在此基础上,你可以继续改进这个程序,让它不停地去寻找新的地址并抓取文章,并对获取到的文章进行词频统计、生成词云等后续操作。类似我们之前的分析案例 数据分析:当赵雷唱民谣时他唱些什么?。进一步完善,相信你能做出更有意思的项目。

相关代码已上传,获取地址请在公众号( Crossin的编程教室 )里回复关键字 goose

════
其他文章及回答:
如何自学Python | 新手引导 | 精选Python问答 | 如何debug? | Python单词表 | 知乎下载器 | 人工智能 | 嘻哈 | 爬虫 | 我用Python | 高考 | requests | AI平台

欢迎微信搜索及关注: Crossin的编程教室

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/44774.html

相关文章

  • BeautifulSoup:网页解析利器上手简介

    摘要:文档写得很清楚,也有中文版,你只要看了最初的一小部分,就可以在代码中派上用场了。 关于爬虫的案例和方法,我们已讲过许多。不过在以往的文章中,大多是关注在 如何把网页上的内容抓取下来 。今天我们来分享下,当你已经把内容爬下来之后, 如何提取出其中你需要的具体信息 。 网页被抓取下来,通常就是 str 字符串类型的对象 ,要从里面寻找信息,最直接的想法就是直接通过字符串的 find 方法 ...

    Carl 评论0 收藏0
  • 论坛评论提取论坛内容提取论坛用户信息提取

    摘要:何况不影响我们提取评论内容,只需分类出来考虑就行黑体注意下面余弦相似度这个是我开始的时候想多了大部分情况就是日期评论用户名,后来我没有考虑余弦相似度分类,代码少了,精度也没有下降。 背景 参加泰迪杯数据挖掘竞赛,这次真的学习到了不少东西,最后差不多可以完成要求的内容,准确率也还行。总共的代码,算上中间的过程处理也不超过500行,代码思想也还比较简单,主要是根据论坛的短文本特性和楼层之间...

    Wuv1Up 评论0 收藏0
  • 论坛评论提取论坛内容提取论坛用户信息提取

    摘要:何况不影响我们提取评论内容,只需分类出来考虑就行黑体注意下面余弦相似度这个是我开始的时候想多了大部分情况就是日期评论用户名,后来我没有考虑余弦相似度分类,代码少了,精度也没有下降。 背景 参加泰迪杯数据挖掘竞赛,这次真的学习到了不少东西,最后差不多可以完成要求的内容,准确率也还行。总共的代码,算上中间的过程处理也不超过500行,代码思想也还比较简单,主要是根据论坛的短文本特性和楼层之间...

    zhaofeihao 评论0 收藏0
  • 论坛评论提取论坛内容提取论坛用户信息提取

    摘要:何况不影响我们提取评论内容,只需分类出来考虑就行黑体注意下面余弦相似度这个是我开始的时候想多了大部分情况就是日期评论用户名,后来我没有考虑余弦相似度分类,代码少了,精度也没有下降。 背景 参加泰迪杯数据挖掘竞赛,这次真的学习到了不少东西,最后差不多可以完成要求的内容,准确率也还行。总共的代码,算上中间的过程处理也不超过500行,代码思想也还比较简单,主要是根据论坛的短文本特性和楼层之间...

    Pikachu 评论0 收藏0
  • 论坛评论提取论坛内容提取论坛用户信息提取

    摘要:何况不影响我们提取评论内容,只需分类出来考虑就行黑体注意下面余弦相似度这个是我开始的时候想多了大部分情况就是日期评论用户名,后来我没有考虑余弦相似度分类,代码少了,精度也没有下降。 背景 参加泰迪杯数据挖掘竞赛,这次真的学习到了不少东西,最后差不多可以完成要求的内容,准确率也还行。总共的代码,算上中间的过程处理也不超过500行,代码思想也还比较简单,主要是根据论坛的短文本特性和楼层之间...

    clasnake 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<