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

优采云 发布时间: 2021-12-02 06:27

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

  爬虫有什么作用?它可以帮助我们快速获取有效信息。但是,任何做过爬虫的人都知道解析是一件麻烦事。

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

  

  预览

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

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

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

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

  

  Safari 预览

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

  那么在这篇文章中,我们一起来看看智能页面分析的相关知识。

  智能分析

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

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

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

  行业进展

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

  目前,业界已经有实现的算法。经过一番研究,我发现有几种算法或服务可以更好地进行智能页面分析:

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

  结果比较如下:

  服务/软件

  精确

  记起

  F1-Score

  Diffbot

  0.968

  0.978

  0.971

  锅炉管

  0.893

  0.924

  0.893

  可读性

  0.819

  0.911

  0.854

  炼金术API

  0.876

  0.892

  0.850

  嵌入

  0.786

  0.880

  0.822

  鹅

  0.498

  0.815

  0.608

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

  

  F1成绩对比

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

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

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

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

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

  Diffbot 页面分析

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

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

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

  

  结果

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

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

  

  结果

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

  

  结果

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

  

  结果

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

  所以,如果你对精度要求不是那么严格,使用Diffbot的服务可以帮助我们快速从页面中提取出需要的结果,节省了我们大部分的体力劳动,可以说是太棒了。

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

  Diffbot API

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

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

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

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

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

  以上预定的字段是可以返回的字段。它们不能被定制和配置。此外,我们还可以通过 fields 参数指定和扩展以下可选字段:

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

  我们以一个例子来看看这个API的用法,代码如下:

  import requests, json

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

params = {

    'token': '77b41f6fbb24495113d52836528fa',

    '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是可选的扩展字段meta标签。

  我们来看看运行的结果,结果如下:

  {

  "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格式,里面收录了title,body,发布时间等各种内容。

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

  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链接,返回的结果也差不多。

  具体用法直接看它的源码注释就可以一目了然了,还是很清晰的。

  好了,以上就是对页面智能提取原理的基本介绍,以及Diffbot的使用说明。后面我会继续介绍其他智能分析方法和一些相关的实战。我希望你能多加注意。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线