网页抓取 - 如何识别网页上的主要内容

Posted

技术标签:

【中文标题】网页抓取 - 如何识别网页上的主要内容【英文标题】:Web scraping - how to identify main content on a webpage 【发布时间】:2011-06-08 00:11:54 【问题描述】:

给定一个新闻文章网页(来自任何主要新闻来源,如时代或彭博社),我想识别该页面上的主要文章内容,并丢弃其他杂项元素,如广告、菜单、侧边栏、用户 cmets。

在大多数主要新闻网站上都可以使用的通用方法是什么?

有哪些好的数据挖掘工具或库? (最好基于python)

【问题讨论】:

看看Readability书签是如何实现的lab.arc90.com/experiments/readability 这样做的浏览器将对在线广告构成巨大威胁。 原始书签的代码在这里:code.google.com/p/arc90labs-readability/source/browse Readability 现在是一项服务,它的代码不可用。 我认为这是一个非常好的机器学习案例。 ML 模型可以通过 readability 等库进行训练,也可以通过人工监督进行训练。 有很多图书馆试图为你做这件事(显然不是 100 准确)。看看这个github.com/nabinkhadka/readable-content 【参考方案1】:

有很多方法可以做到这一点,但没有一种方法总是有效的。这里有两个最简单的:

如果它是一组已知的有限网站:在您的抓取工具中,将每个 url 从普通 url 转换为给定网站的打印 url(不能真正跨网站推广) 使用 arc90 可读性算法(参考实现在 javascript 中)http://code.google.com/p/arc90labs-readability/。该算法的简短版本是它查找其中带有 p 标签的 div。它不适用于某些网站,但总体上还不错。

【讨论】:

+1 可读性。由于可读性最适合文章页面而不是主页,因此在为文章 URL 解析 RSS 提要时效果最好。 我应该添加指向可读性算法的 python 端口的链接:github.com/… 我想知道为什么我以前没有发现这个。与我自己开发的以前的 ad-hoc 方法相比,它非常棒。【参考方案2】:

不久前,我为这个任务写了一个simple Python script。它使用启发式方法根据文本块在 DOM 中的深度将它们组合在一起。然后假定具有最多文本的组是主要内容。它并不完美,但通常适用于新闻网站,因为文章通常是最大的文本组,即使被分解为多个 div/p 标签。

你会使用这样的脚本:python webarticle2text.py <url>

【讨论】:

@MPękalski,感谢您告诉我。我已经更新了链接。【参考方案3】:

没有办法保证有效,但您可以使用的一种策略是尝试找到其中包含最可见文本的元素。

【讨论】:

其实网站太多,里面垃圾太多。所以算法应该尝试理解元素内容并找到它的位置,因为在许多网站中主要内容位于页面的中心。我认为最佳解决方案是使用 ML 并在这些库和人工监督下对其进行训练。【参考方案4】:

Diffbot 提供了一个免费的(10.000 urls)API 来做到这一点,不知道这种方法是否是你正在寻找的,但它可能会帮助某人http://www.diffbot.com/

【讨论】:

很好,我一直在考虑自己构建类似的东西 =)【参考方案5】:

如需 Java 解决方案,请查看https://code.google.com/p/boilerpipe/:

boilerpipe 库提供算法来检测和删除围绕网页主要文本内容的多余“杂乱”(样板、模板)。

该库已经为常见任务(例如:新闻文章提取)提供了特定的策略,并且还可以轻松扩展用于个别问题设置。

但这里也有一个 Python 包装器:

https://github.com/misja/python-boilerpipe

【讨论】:

【参考方案6】:

检查以下脚本。真是太棒了:

from newspaper import Article
URL = "https://www.ksat.com/money/philippines-stops-sending-workers-to-qatar"
article = Article(URL)
article.download()
print(article.html)
article.parse()
print(article.authors)
print(article.publish_date)
#print(article.text)
print(article.top_image)
print(article.movies)
article.nlp()
print(article.keywords)
print(article.summary)

更多文档可以在 http://newspaper.readthedocs.io/en/latest/ 和 https://github.com/codelucas/newspaper 找到,您应该使用以下方式安装它:

pip3 install newspaper3k

【讨论】:

【参考方案7】:

提取该页面上的 RSS 提要 (<link type="application/rss+xml" href="..."/>) 并解析提要中的数据以获取主要内容可能更有用。

【讨论】:

注意:对于 ATOM 提要type="application/atom+xml" 一个好主意,但这可能会被击中或错过,因为许多提要仅包含文章摘要。这是可以理解的,因为大多数新闻网站的目的是让您查看广告,而您通常不会在 RSS 阅读器中。【参考方案8】:

另一种将“真实”内容与噪音区分开来的方法是measuring HTML density HTML 页面的各个部分。

您需要对阈值进行一些实验才能提取“真实”内容,我想您可以通过应用启发式方法来改进算法,在识别出有趣的内容后指定 HTML 段的确切边界。

更新:刚刚发现上面的网址现在不起作用; here is an alternative link 到 archive.org 的缓存版本。

【讨论】:

【参考方案9】:

最近(2020 年初)对各种提取文章正文的方法进行了比较,没有广告、菜单、侧边栏、用户 cmets 等 - 请参阅https://github.com/scrapinghub/article-extraction-benchmark。 report,数据和评估脚本可用。它比较了这里的答案中提到的许多选项,以及一些没有提到的选项:

python-readability boilerpipe newspaper3k dragnet html-text Diffbot Scrapinghub AutoExtract

简而言之,如果您需要删除例如“智能”开源库就足够了。侧边栏和菜单,但它们不处理文章中不必要的内容的删除,并且总体上很嘈杂;有时他们会删除一篇文章本身并且什么也不返回。商业服务使用计算机视觉和机器学习,这使他们能够提供更精确的输出。

对于某些用例,更简单的库(如 html-text)更适合商业服务和“智能”开源库 - 它们速度快,并确保不会丢失信息(即召回率高)。

我不建议复制粘贴代码 sn-ps,因为即使是从 HTML 中提取文本的看似简单的任务也会有很多边缘情况,并且有一些可用的库(如 html-text 或 html2text)应该处理这些边缘情况。

要使用商业工具,通常需要获取 API 密钥,然后使用客户端库。例如,对于 Scrapinghub 的 AutoExtract(免责声明:我在那里工作),您需要安装 pip install scrapinghub-autoextract。有一个可用的 Python API - 有关详细信息,请参阅 https://github.com/scrapinghub/scrapinghub-autoextract README,但获取提取的一种简单方法是创建一个带有要提取的 URL 的 .txt 文件,然后运行

python -m autoextract urls.txt --page-type article --api-key <API_KEY> --output res.jl

【讨论】:

很好的回顾。我还将html-reader.com/en 添加到一堆(免责声明:我还没有尝试过,但对于我的简单用例来说它看起来不错)【参考方案10】:

我不会尝试从网页上抓取它——太多的东西可能会搞砸——而是查看哪些网站发布了 RSS 提要。例如,卫报的 RSS 提要包含其主要文章的大部分文本:

http://feeds.guardian.co.uk/theguardian/rss

我不知道泰晤士报(伦敦泰晤士报,而不是纽约)是否有一个,因为它位于付费墙后面。祝你好运……

【讨论】:

我看到的大多数 RSS 提要只有完整文章的简短摘要。

以上是关于网页抓取 - 如何识别网页上的主要内容的主要内容,如果未能解决你的问题,请参考以下文章

如何使用Java抓取网页上指定部分的内容

如何用Java抓取网页的具体内容

如何利用java中url实现网页内容的抓取

为啥浏览器可以保存网页中js动态内容,用java编写的爬虫却无法抓取

使用PHP的cURL库进行网页抓取

如何抓取HTML页面数据