算法 自动采集列表(怼正则,怼CSS选择器,解析是个麻烦事(组图))

优采云 发布时间: 2021-08-29 07:02

  算法 自动采集列表(怼正则,怼CSS选择器,解析是个麻烦事(组图))

  爬虫有什么作用?它可以帮助我们快速获取有效信息。不过,做过爬虫的人都知道解析很麻烦。

  比如一篇新闻文章,链接是这样的:,页面预览如下:

  

  预览图片

  我们需要从页面中提取标题、出版商、发布时间、发布内容、图片等内容。正常情况下我们需要做什么?编写规则。

  那么规则是什么?不要使用正则,不要使用 CSS 选择器,不要使用 XPath。我们需要匹配标题的内容,发布时间,来源等,更重要的是,我们需要正则表达式来辅助。我们可能需要使用re、BeautifulSoup、pyquery等库来提取和解析内容。

  但是如果我们有数千个不同风格的页面怎么办?它们来自数千个站点。我们还需要写规则来一一匹配吗?这需要多少工作。另外,如果这些事情没有做好,分析就会出现问题。例如,在某些情况下无法匹配正则表达式,如果 CSS 和 XPath 选择器选择错误可能会出现问题。

  想必大家可能已经看到当前浏览器都有阅读模式了,比如我们用Safari浏览器打开这个页面,然后打开阅读模式看看效果:

  

  Safari 预览

  页面突然变得很清爽,只剩下标题和需要阅读的内容。原页面多余的导航栏、侧边栏、评论等全部删除。它是如何做到的?有人在里面写规则吗?当然这是不可能的。其实这里用的是智能分析。

  这篇文章,让我们一起来了解一下智能页面分析的知识。

  智能分析

  所谓爬虫智能分析,顾名思义,就是我们不再需要专门针对某些页面编写抽取规则。我们可以使用一些算法来计算页面上特定元素的位置和提取路径。比如一个页面中的文章,我们可以通过算法计算,它的标题应该是什么,文本应该是什么部分,发布时间是多少等等。

  实际上,智能分析是一项非常艰巨的任务。比如你在一个网页上展示某人文章,人们很快就能知道这个文章的标题是什么,发布时间是什么,以及文字是哪一块,或者哪一块是广告空间,哪一块是导航栏。但如果机器要识别,它面对的是什么?它只是一系列 HTML 代码。那么机器是如何实现智能提取的呢?事实上,它收录了很多方面的信息。

  还有一些功能就不一一赘述了。这些包括区块位置、区块大小、区块标签、区块内容、区块密度等,而且在很多情况下还需要依赖视觉的特性,所以实际上是算法计算、视觉处理、自然语言的结合加工等方面。如果能综合利用这些特征,再经过大量的数据训练,就能取得非常好的效果。

  行业进展

  未来页面会越来越多,页面的渲染方式也会发生很大的变化。爬虫越来越难做,智能爬虫越来越重要。

  目前,业界已经有实现的算法。经过一番研究,我发现有几种算法或服务在页面智能分析方面做得更好:

  那么这些算法或服务中哪些是好的? Driffbot 官方做了一个对比评测,使用了谷歌新闻的一些文章,使用不同的算法依次提取标题和文本,然后与真实标注的进行对比。比较内容,比较的指标是文本的准确率和召回率,以及基于两者计算的F1分数。

  结果对比如下:

  

  经过对比,我们可以发现Diffbot的准确率和召回率都是最好的,它的F1值达到了0.97,可以说是非常准确了。此外,下一个更强大的是 Boilerpipe 和 Readability。 Goose 的性能很差,F1 和其他算法有很大的不同。以下是几种算法的F1得分对比:

  

  F1 分数对比

  有些人可能想知道为什么 Diffbot 如此强大?我也查过。 Diffbot 从 2010 年就开始致力于网页数据的提取,并提供了很多 API 来自动解析各种页面。其中,他们的算法依赖于自然语言技术、机器学习、计算机视觉、标记检查等各种算法,所有页面都会考虑当前页面的样式和视觉布局,还会对图像进行分析内容、CSS 甚至其中收录的内容。 Ajax 请求。另*敏*感*词*的标记计算每个块的置信度。

  总之,Diffbot也一直致力于这方面的服务。整个Diffbot从页面解析开始,现在一直专注于页面解析服务。准确率高也就不足为奇了。

  但是他们的算法是开源的吗?不幸的是,没有,而且我还没有找到相关的论文来介绍他们自己的具体算法。

  所以,如果你想取得这么好的效果,就用他们的服务吧。

  在下面的内容中,我们将讨论如何使用Diffbot进行智能页面分析。此外,Readability算法也值得研究。我会专门写一篇文章来介绍Readability及其与Python的对接使用。

  Diffbot 页面分析

  首先,我们需要注册一个帐户。它有 15 天的免费试用期。注册后,您将获得一个Developer Token,这是使用Diffbot接口服务的证书。

  接下来,切换到它的测试页面。链接是:我们来测试一下它的分析效果。

  我们这里选择的测试页面就是上面提到的页面,链接是:,API类型选择Article API,然后点击Test Drive按钮,就会显示当前页面的分析结果:

  

  结果

  这时候我们可以看到它帮助我们提取了标题、发布时间、发布机构、发布机构链接、正文内容等各种结果。到目前为止,这是非常正确的。时间自动识别并转码,为标准时间格式。

  接下来我们继续向下滚动以查看还有哪些其他字段。这里我们也可以看到有一个html字段,它和text的区别在于它收录了文章content的真实HTML代码,所以图片也会收录在其中,如图:

  

  结果

  此外,最后还有图像字段。他以列表的形式返回文章一组图片和每张图片的链接,以及文章的站点名称、页面使用的语言等,如图。 :

  

  结果

  当然,我们也可以选择JSON格式的返回结果,这样内容会更加丰富。比如图片还返回了它的宽、高、图片描述等,还有各种其他的比如面包屑导航等结果,如图:

  

  结果

  经过人工检查,发现返回的结果完全正确,准确率相当高!

  所以,如果你的准确率要求不是那么严格,使用Diffbot的服务可以帮助我们快速从页面中提取出想要的结果,节省我们大部分的体力劳动。可以说是很不错了。

  但是,我们不能总是在网络上尝试此操作。其实Diffbot也提供了官方的API文档,让我们一探究竟。

  Diffbot API

  Driffbot 提供了多种 API,例如分析 API、文章 API、讨论 API 等。

  我们以文章 API 为例来说明它的用法。官方文档地址为:,API调用地址为:

  https://api.diffbot.com/v3/article

  我们可以使用 GET 方法来发出请求。 Token 和 URL 都可以以参数的形式传递给这个 API。必要的参数是:

  此外,它还有几个可选参数:

  这里大家可能关心的是fields字段。这里我做了一个专门的整理。首先,一些固定字段:

  images:文章视频中收录的图片:文章中收录的视频breadcrumb:面包屑导航信息diffbotUri:Diffbot内的URL链接

  上面预定的字段是可以返回的字段。它们无法定制。此外,我们还可以使用 fields 参数来指定和扩展以下可选字段:

  好的,以上就是这个API的用法。申请后即可使用该API进行智能分析。

  举个例子看看这个API的用法,代码如下:

  import requests, json

url = 'https://api.diffbot.com/v3/article'

params = {

'token': '77b41f6fbb24496d5113d528306528fa',

'url': 'https://news.ifeng.com/c/7kQcQG2peWU',

'fields': 'meta'

}

response = requests.get(url, params=params)

print(json.dumps(response.json(), indent=2, ensure_ascii=False))

  这里先定义API链接,然后指定params参数,也就是GET请求参数。

  参数收录必填的token和url字段,还设置了可选字段字段,其中fields是可选的扩展字段元标记。

  来看看运行结果,结果如下:

  {

"request": {

"pageUrl": "https://news.ifeng.com/c/7kQcQG2peWU",

"api": "article",

"fields": "sentiment, meta",

"version": 3

},

"objects": [

{

"date": "Wed, 20 Feb 2019 02:26:00 GMT",

"images": [

{

"naturalHeight": 460,

"width": 640,

"diffbotUri": "image|3|-1139316034",

"url": "http://e0.ifengimg.com/02/2019/0219/1731DC8A29EB2219C7F2773CF9CF319B3503D0A1_size382_w690_h460.png",

"naturalWidth": 690,

"primary": true,

"height": 426

},

// ...

],

"author": "中国新闻网",

"estimatedDate": "Wed, 20 Feb 2019 06:47:52 GMT",

"diffbotUri": "article|3|1591137208",

"siteName": "ifeng.com",

"type": "article",

"title": "故宫,你低调点!故宫:不,实力已不允许我继续低调",

"breadcrumb": [

{

"link": "https://news.ifeng.com/",

"name": "资讯"

},

{

"link": "https://news.ifeng.com/shanklist/3-35197-/",

"name": "大陆"

}

],

"humanLanguage": "zh",

"meta": {

"og": {

"og:time ": "2019-02-20 02:26:00",

"og:image": "https://e0.ifengimg.com/02/2019/0219/1731DC8A29EB2219C7F2773CF9CF319B3503D0A1_size382_w690_h460.png",

"og:category ": "凤凰资讯",

"og: webtype": "news",

"og:title": "故宫,你低调点!故宫:不,实力已不允许我继续低调",

"og:url": "https://news.ifeng.com/c/7kQcQG2peWU",

"og:description": "  “我的名字叫紫禁城,快要600岁了,这上元的夜啊,总是让我沉醉,这么久了却从未停止。”   “重"

},

"referrer": "always",

"description": "  “我的名字叫紫禁城,快要600岁了,这上元的夜啊,总是让我沉醉,这么久了却从未停止。”   “重",

"keywords": "故宫 紫禁城 故宫博物院 灯光 元宵节 博物馆 一票难求 元之 中新社 午门 杜洋 藏品 文化 皇帝 清明上河图 元宵 千里江山图卷 中英北京条约 中法北京条约 天津条约",

"title": "故宫,你低调点!故宫:不,实力已不允许我继续低调_凤凰资讯"

},

"authorUrl": "https://feng.ifeng.com/author/308904",

"pageUrl": "https://news.ifeng.com/c/7kQcQG2peWU",

"html": "<p>“我的名字叫紫禁城,快要600岁了,这上元的夜啊,总是让我沉醉,这么久了却从未停止。... ",

"text": "“我的名字叫紫禁城,快要600岁了,这上元的夜啊,总是让我沉醉,这么久了却从未停止。”\n“...",

"authors": [

{

"name": "中国新闻网",

"link": "https://feng.ifeng.com/author/308904"

}

]

}

]

}

  可以看出它返回了上面的内容,是一个完整的JSON格式,里面收录了标题、正文、发布时间等各种内容。

  可以看出,我们不需要配置任何提取规则,就可以完成页面的分析和抓取,不费吹灰之力。

  Diffbot SDK

  此外,Diffbot 还提供几乎所有语言的 SDK 支持。我们也可以使用SDK来实现以上功能。链接是:如果使用Python,可以直接使用Python SDK。 Python SDK 链接是:.

  此库尚未发布到 PyPi。您需要自己下载并导入它。另外,这个库是用Python 2写的,其实本质上就是调用requests库。有兴趣的可以去看看。

  以下是调用示例:

  from client import DiffbotClient,DiffbotCrawl

diffbot = DiffbotClient()

token = &#39;your_token&#39;

url = &#39;http://shichuan.github.io/javascript-patterns/&#39;

api = &#39;article&#39;

response = diffbot.request(url, token, api)

  通过这行代码,我们可以通过调用Article API来分析我们想要的URL链接,返回的结果类似。

  具体用法直接看其源码注释就一目了然了,还是很清楚的。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线