第 2 章:从何处获取数据

当我们使用社交媒体时,我们的行为会留下痕迹。在 Facebook 上点赞、在 Twitter 上转发、在 Instagram 上点赞——每一个动作都代表一个记录在互联网某处的数据点。通过同意这些公司的服务条款,我们允许他们存储这些数据,然后他们可以将这些数据提供给公众。

公司允许第三方通过应用程序编程接口 (API) 访问这些数据宝库。 API 就像社交媒体平台和希望从中获取信息的开发人员之间的中间人。

在本章中,我将使用 YouTube 作为一个实际示例,更详细地解释什么是 API 以及您可以通过它们收集什么样的数据。

什么是 API?

在最基本的层面上,API 是一个接口,允许程序员访问其他开发人员的代码。一些程序员使用 API 访问在线平台上的数据,以便他们可以制作自己的应用程序。例如,第三方开发者可能会使用官方 Instagram 应用程序的 API 来允许用户在应用程序之外将图像发布到他们的 Instagram 提要中。换句话说,Instagram API 允许开发人员将自己的代码连接到帐户由 Instagram 管理的用户。

正如我们稍后将讨论的那样,API 还使开发人员能够使用脚本(一种与 Web 上的服务器和数据库进行通信的程序)发出数据请求。

为了更好地理解 API 的工作原理,让我们考虑一个类比。假设您是一家餐厅的顾客。 API 就像服务员,他为您提供一组选项、接受您的订单、取餐并将其带给您。餐厅老板决定菜单上有什么。她还控制着菜肴的呈现和分配方式。菜单详细说明了您可以点什么菜、每道菜的名称以及通常是如何准备的。

在我们的上下文中,社交媒体公司代表餐厅老板,开发商(或客户)代表顾客,菜单上的菜肴代表我们试图收集的数据。客户端是我们用来上网的任何技术,例如浏览器或手机或台式机上的其他应用程序。

像 Facebook 或 Twitter 这样的公司是否提供 API 完全取决于它:它可以通过一个或多个 API 提供数据,或者它可以选择根本不提供任何数据。即使公司确实允许第三方访问其数据存储,它也经常限制可用数据,并且可以随时更改其共享的数据。公众对隐私问题的愤怒、旨在保护人们数据的新法律和法规以及涉及社交媒体公司的新闻事件都影响了公司对其数据产品的决策。一些公司甚至可能对访问他们的数据收费。

要了解每家公司通过其 API 向开发人员提供什么样的信息,您通常必须通读其文档,这对于说明手册来说是一个花哨的词。不幸的是,文档没有标准化,甚至会让一些最有经验的研究人员感到迷失方向,特别是如果他们是初学者。这部分是因为该文本通常面向应用程序开发人员,而不是研究人员、营销人员或其他非开发人员。

找出公司提供哪些信息的最佳方法是在 Google 上简单地搜索公司的 API。

使用 API 获取数据

现在您对 API 的工作原理有了一个大致的了解,我们将研究如何使用 API 来访问数据。

如前所述,第三方使用脚本从 API 请求数据。这些脚本通常是由计算机等机器执行或运行的文本文件。把脚本想象成一个为你执行任务的小机器人。机器人可以与 API 通信,从中请求数据,读取接收到的数据,并根据数据创建电子表格。

脚本通常通过 URL 与 API 通信,就像您用来访问网站的 URL。使用 URL 与 API 通信称为基于 URL 的 API 调用(我将简称为 API 调用)。与大多数其他 URL 一样,您可以将 API 调用粘贴到任何浏览器中,浏览器将返回您请求的基于文本的数据。当您使用脚本进行 API 调用时,您的脚本会收到本应在浏览器中显示的信息。

我们以 Google 的 YouTube API 为例。您可以使用此 API 访问大量数据,包括 YouTube 频道的描述或它在一段时间内收到的观看次数。您可以通过将数据包含在 URL 中来告诉 API 您想要什么数据。在本练习中,我们将请求 BuzzFeed Tasty YouTube 页面发布的帖子的数据源。为此,我们将使用此 API 调用:https://www.googleapis.com/youtube/v3/search?channelId=UCJFp8uSYCjXOMnkUyb3CQ3Q&part=snippet。

URL 的每个部分都有不同的用途。两种类型的字符串组成 API 调用:一个基数,指示您正在使用的 API,以及各种参数,它们告诉调用您想要收集哪些数据并传达有关您的信息(即请求信息的一方) )。在我们之前的类比中,base 代表我们正在用餐的餐厅,而参数是我们可以选择的单个菜单项。

注意 API 调用的结构取决于各个 API。要了解如何构建调用以检索所需信息,您应该查阅 API 的文档。您将在第 41 页的“优化 API 返回的数据”中更详细地了解如何执行此操作。

在此示例中,API 基础是 https://www.googleapis.com/youtube/。它将浏览器或 Python 脚本定向到 Google 的 YouTube API。调用的下一部分是一个参数,它告诉 Google 我们要使用哪个版本的 API。社交媒体网站不时更新,当他们更新时,他们也需要更新他们的 API。版本通过正斜杠与基础分开。在此示例中,我们希望使用 API 的 v3 版本。 (由于这些版本更新频繁,您应该查阅文档以确保您使用的是最新版本。)下一个参数是搜索,它指定我们将搜索 YouTube 视频。

然后,我们指定我们要搜索的内容。在本例中,我们正在寻找来自 BuzzFeed Tasty 频道的视频,该频道的 YouTube 频道 ID 为 UCJFp8uSYCjXOMnkUyb3CQ3Q。您通常可以在 YouTube 频道的 URL 末尾找到频道 ID。例如,Tasty 频道 URL 是 https://www.youtube.com/channel/UCJFp8uSYCjXOMnkUyb3CQ3Q。要使用通道 ID 参数,我们输入参数名称 channelId,然后是等号 (=) 和长通道 ID。整个参数看起来像这样(注意没有空格):channelId=UCJFp8uSYCjXOMnkUyb3CQ3Q。

接下来我们需要指定我们想要通过 API 访问的数据类型。要添加另一个参数,我们在参数部分后插入一个与号 (&),这表示我们将要指定要检索的 YouTube 视频数据的哪一部分。在这种情况下,它是片段,它指的是 Google 的 YouTube API 提供的有关频道和视频的信息(例如视频的描述或频道的标题)。

现在我们有了一个 URL,我们已经准备好对 API 进行第一次调用了!在下一章中,我们将通过 Python 脚本进行此调用,但现在,只需将 API 调用粘贴到浏览器中即可。这使您可以立即查看 API 响应。一旦你这样做了,你的浏览器应该返回清单 2-1 中的消息。

{
 "error": {
  "errors": [
   {
    "domain": "usageLimits",
    "reason": "dailyLimitExceededUnreg",
    "message": "Daily Limit for Unauthenticated Use Exceeded. Continued use requires signup.",
    "extendedHelp": "https://code.google.com/apis/console"
   }
  ],
  "code": 403,
  "message": "Daily Limit for Unauthenticated Use Exceeded. Continued use requires signup."
 }
}

清单 2-1:API 调用在浏览器中返回的代码。您的回复可能略有不同。

清单 2-1 是您的第一个 API 响应!响应采用 JavaScript 对象表示法 (JSON) 结构化,这是 API 用于传递数据的一种格式。我们将在接下来的页面中更详细地讨论 JSON。

如果您仔细查看响应,您会看到错误一词,表明出现问题并且 API 无法从 BuzzFeed Tasty 频道获取请求的帖子。

处理代码通常涉及阅读和理解错误消息。作为初学者,您可能会觉得自己将大部分时间都花在测试和修复代码上。在找到正确的方法之前,您经常会犯错误,但是您获得的经验越多,修复这些错误就越容易。

在大多数情况下,错误消息将为您提供有关出错的线索。如果您更仔细地检查 API 错误响应,您可以看到它发送了一条“消息”和一条错误通知:“超出了未经身份验证的使用的每日限制。继续使用需要注册。”

要修复此错误,我们需要一个 API 密钥,这是一种向 API 标识您自己的方法。 YouTube 和其他具有 API 的网站想知道谁在使用他们的 API,因此他们有时会要求您注册开发人员凭据,这是开发人员用来获取 API 访问权限的一种身份证明形式。凭证类似于用户名和密码。作为对 API 访问权的交换,社交媒体公司会跟踪用户,以防有人滥用 API。

获取 YouTube API 密钥

对于像 YouTube 这样的社交媒体网络,您通常会在该平台的网站上获得凭据。现在让我们尝试从 YouTube 获取凭据。要注册 Google 的 YouTube 开发者凭据,您首先需要拥有一个 Google 帐户。如果您还没有,请在 https://www .google.com 上创建一个。完成后,登录并导航到 Google 为开发人员设置的单独页面:https://console.developers.google.com/apis/credentials。

按照 Google 的说明创建凭据,尤其是 API 密钥。

注意 对于某些 API,您可能会遇到术语 app 或应用程序,它指的是软件或手机应用程序。这是因为许多注册凭据的开发人员将使用 API 来创建第三方应用程序。在我们的例子中,我们使用 API 来收集数据,但我们仍然需要以与应用程序开发人员相同的方式进行注册。

这应该为您创建一个通用 API 密钥。您的密钥的默认名称是“API 密钥”,但您可以通过双击密钥名称来重命名它。我命名了我的数据收集凭据。

获得密钥后,导航到“库”页面。 Google 提供了多种 API,因此您需要启用对所需特定 API 的访问权限。为此,请导航至 YouTube Data API v3 并单击启用。现在您已准备好通过您的 API 密钥访问 YouTube!

该密钥与您的 Google 帐户相关联,其作用与允许您访问 Google API 的用户名和密码非常相似。因此,您应该像对待任何其他用户名和密码一样小心谨慎地对待这些信息。过去,编写脚本并将其发布到 GitHub 等代码共享平台的开发人员不小心在网上发布了他们的凭据。如果你犯了同样的错误,它可能会产生严重的后果。例如,有人可能会滥用您的凭据,这可能会阻止您将来访问服务。

使用您的凭证检索 JSON 对象

现在您有了用户凭据,让我们再次使用 URL 访问 API。尽管每个 API 都不同,但 API 通常会要求您将 API 凭据直接输入到 API 调用中。如果您发现将来使用的任何 API 都不是这种情况,请查看文档以了解应在何处输入凭据。对于 Google 的 YouTube API,在为原始 API 调用指定的参数之后,将 API 密钥作为其自己的参数添加到 URL 中。输入以下 URL,替换为您的 API 密钥:https://www.googleapis.com/youtube/v3/search?channelId=UCJFp8uSYCjXOMnkUyb3CQ3Q&part=snippet&key=。

现在您应该会收到一个包含数据的 API 响应!清单 2-2 是 API 调用在我的浏览器中返回的数据示例。由于 BuzzFeed 页面不断变化,您的数据可能看起来略有不同,但应该以相同的方式构建。

{
 "kind": "youtube#searchListResponse",
 "etag": "\"XI7nbFXulYBIpL0ayR_gDh3eu1k/WDIU6XWo6uKQ6aM2v7pYkRa4xxs\"",
 "nextPageToken": "CAUQAA",
 "regionCode": "US",
 "pageInfo": {
  "totalResults": 2498,
  "resultsPerPage": 5
 },
 "items": [
  {
   "kind": "youtube#searchResult",
   "etag": "\"XI7nbFXulYBIpL0ayR_gDh3eu1k/wiczu7uNikHDvDfTYeIGvLJQbBg\"",
   "id": {
    "kind": "youtube#video",
    "videoId": "P-Kq9edwyDs"
   },
   "snippet": {
    "publishedAt": "2016-12-10T17:00:01.000Z",
    "channelId": "UCJFp8uSYCjXOMnkUyb3CQ3Q",
    "title": "Chocolate Crepe Cake",
    "description": "Customize & buy the Tasty Cookbook here: http://bzfd.it/2fpfeu5 Here is what you'll need! MILLE CREPE CAKE Servings: 8 INGREDIENTS Crepes 6 ...",
    "thumbnails": {
     "default": {
      "url": "https://i.ytimg.com/vi/P-Kq9edwyDs/default.jpg",
      "width": 120,
      "height": 90
     },
     "medium": {
      "url": "https://i.ytimg.com/vi/P-Kq9edwyDs/mqdefault.jpg",
      "width": 320,
      "height": 180
     },
     "high": {
      "url": "https://i.ytimg.com/vi/P-Kq9edwyDs/hqdefault.jpg",
      "width": 480,
      "height": 360
     }
    },
    "channelTitle": "Tasty",
    "liveBroadcastContent": "none"
   }
  },
  {
   "kind": "youtube#searchResult",
   "etag": "\"XI7nbFXulYBIpL0ayR_gDh3eu1k/Fe41OtBUjCV35t68y-E21BCpmsw\"",
   "id": {
    "kind": "youtube#video",
    "videoId": "_eOA-zawYEA"
   },
   "snippet": {
    "publishedAt": "2016-02-25T22:23:40.000Z",
    "channelId": "UCJFp8uSYCjXOMnkUyb3CQ3Q",
    "title": "Chicken Pot Pie (As Made By Wolfgang Puck)",
    "description": "Read more! - http://bzfd.it/1XPgzLN Recipe! 2 pounds cooked boneless, skinless chicken, shredded Salt Freshly ground black pepper 4 tablespoons vegetable ...",
    "thumbnails": {
     "default": {
      "url": "https://i.ytimg.com/vi/_eOA-zawYEA/default.jpg",
      "width": 120,
      "height": 90
     },
     "medium": {
      "url": "https://i.ytimg.com/vi/_eOA-zawYEA/mqdefault.jpg",
      "width": 320,
      "height": 180
     },
     "high": {
      "url": "https://i.ytimg.com/vi/_eOA-zawYEA/hqdefault.jpg",
      "width": 480,
      "height": 360
     }
    },
    "channelTitle": "Tasty",
    "liveBroadcastContent": "none"
   }
  },
--snip---

清单 2-2:YouTube API 返回的示例数据

您会注意到 API 响应仍然是 JSON。 乍一看可能会让人不知所措,但如果我们将 JSON 数据转换为更熟悉的形式——电子表格——它看起来如图 2-1 所示。 如果您通读 API 响应中的一些字符串,您可以看到数据是来自 BuzzFeed Tasty YouTube 频道的五个视频的快照。

图 2-1:JSON 数据作为电子表格(图片仅显示电子表格的一部分)

JSON 格式的数据起初看起来非常混乱和复杂,所以让我们分解每个部分以更好地了解我们的数据结构。 JSON 数据始终存储在两个大括号 ({}) 之间。 每个帖子都存储为一个 JSON 对象,作为每个对象一部分的数据点存储为键值对。 例如,第一篇文章包含以下数据点:

"publishedAt"①: "2016-12-10T17:00:01.000Z"②

冒号前面的字符串称为键①,冒号后面的字符串是与该键关联的值②。关键是我们数据的类别——你可以把它想象成电子表格列的标题。该值表示实际数据,如字符串、整数或浮点数。要了解每个数据点的格式,您需要在 API 文档中查找。在此示例中,密钥称为“publishedAt”,根据 YouTube 的文档,它描述了创建帖子或评论的时间和日期。我们示例中的值“2016-12-10T17:00:01.000Z”是一个时间戳。此时间戳采用 UTC 格式,这是一种将日期和时间信息存储在一个字符串中的标准化方式。

API 如何提供数据取决于提供数据的社交媒体平台。这也意味着 Google 会确定我们数据的密钥。例如,Google 决定将帖子发布的日期和时间称为publishAt,而不是date 或published_on。这些特性是 Google 及其 API 特有的。

接下来,让我们看看数据集中的一个完整的 JSON 对象(清单 2-3)。

{①
        "publishedAt": "2016-12-10T17:00:01.000Z",②
        "channelId": "UCJFp8uSYCjXOMnkUyb3CQ3Q",
        "title": "Chocolate Crepe Cake",
        "description": "Customize & buy the Tasty Cookbook here: http://bzfd.it/2fpfeu5 Here is what you'll need! MILLE CREPE CAKE Servings: 8 INGREDIENTS Crepes 6 ...",
--snip---
},③

清单 2-3:包含有关 YouTube 视频的信息的片段,标题为 Chocolate Crepe Cake

如您所见,每个 YouTube 视频的信息存储在一组大括号 ① 之间,每个 JSON 对象用逗号 ③ 分隔。 在这些大括号内有四个键(“publishedAt”、“channelId”、“title”、“description”)及其相关值(“2016-12-10T17:00:01.000Z”、“UCJFp8uSYCjXOMnkUyb3CQ3Q”、“Chocolate Crepe Cake” ,“在此处定制和购买美味食谱:http://bzfd.it/2fpfeu5 这就是您需要的!千层千层蛋糕份量:8 种可丽饼 6 份……”,分别成对显示 在前面的例子中。 每个键值对也用逗号 ② 与其他键值对分开。

让我们进一步缩小并再次查看清单 2-2 中的原始代码片段(参见清单 2-4)。

{
 "kind": "youtube#searchListResponse",
 "etag": "\"XI7nbFXulYBIpL0ayR_gDh3eu1k/WDIU6XWo6uKQ6aM2v7pYkRa4xxs\"",
 "nextPageToken": "CAUQAA",
 "regionCode": "US",
 "pageInfo": {
  "totalResults": 2498,
  "resultsPerPage": 5
 },
 "items": [
  {
   "kind": "youtube#searchResult",
   "etag": "\"XI7nbFXulYBIpL0ayR_gDh3eu1k/wiczu7uNikHDvDfTYeIGvLJQbBg\"",
   "id": {
    "kind": "youtube#video",
    "videoId": "P-Kq9edwyDs"
   },
   "snippet": {
    "publishedAt": "2016-12-10T17:00:01.000Z",
    "channelId": "UCJFp8uSYCjXOMnkUyb3CQ3Q",
    "title": "Chocolate Crepe Cake",
    "description": "Customize & buy the Tasty Cookbook here: http://bzfd.it/2fpfeu5 Here is what you'll need! MILLE CREPE CAKE Servings: 8 INGREDIENTS Crepes 6 ...",
    "thumbnails": {
     "default": {
      "url": "https://i.ytimg.com/vi/P-Kq9edwyDs/default.jpg",
      "width": 120,
      "height": 90
     },
     "medium": {
      "url": "https://i.ytimg.com/vi/P-Kq9edwyDs/mqdefault.jpg",
      "width": 320,
      "height": 180
     },
     "high": {
      "url": "https://i.ytimg.com/vi/P-Kq9edwyDs/hqdefault.jpg",
      "width": 480,
      "height": 360
     }
    },
    "channelTitle": "Tasty",
    "liveBroadcastContent": "none"
   }
  },
  {
   "kind": "youtube#searchResult",
   "etag": "\"XI7nbFXulYBIpL0ayR_gDh3eu1k/Fe41OtBUjCV35t68y-E21BCpmsw\"",
   "id": {
    "kind": "youtube#video",
    "videoId": "_eOA-zawYEA"
   },
   "snippet": {
    "publishedAt": "2016-02-25T22:23:40.000Z",
    "channelId": "UCJFp8uSYCjXOMnkUyb3CQ3Q",
    "title": "Chicken Pot Pie (As Made By Wolfgang Puck)",
    "description": "Read more! - http://bzfd.it/1XPgzLN Recipe! 2 pounds cooked boneless, skinless chicken, shredded Salt Freshly ground black pepper 4 tablespoons vegetable ...",
    "thumbnails": {
     "default": {
      "url": "https://i.ytimg.com/vi/_eOA-zawYEA/default.jpg",
      "width": 120,
      "height": 90
     },
     "medium": {
      "url": "https://i.ytimg.com/vi/_eOA-zawYEA/mqdefault.jpg",
      "width": 320,
      "height": 180
     },
     "high": {
      "url": "https://i.ytimg.com/vi/_eOA-zawYEA/hqdefault.jpg",
      "width": 480,
      "height": 360
     }
    },
    "channelTitle": "Tasty",
    "liveBroadcastContent": "none"
   }
  },
--snip---

清单 2-4:重新审视 YouTube API 返回的示例数据

现在您应该能够看到所有帖子都嵌套在一对括号 ([]) 内。 (请注意,上面的清单 2-4 在本书中被截断了,虽然您应该能够在 API 调用的结果中看到左括号和右括号,但在这些页面中您只能看到左括号。)所有这些反过来,数据前面是字符串“items”,然后是冒号。这表示关键“项目”包含数据点列表——在本例中,是来自 BuzzFeed 的 Tasty YouTube 频道的视频。 “items”键值对存储在另一组大括号 ({}) 之间,它构成了整个 JSON 对象。

现在您知道如何从 API 请求数据以及如何读取它返回的 JSON 响应,那么让我们看看如何定制返回的数据以满足我们的需求。

使用数据回答研究问题

您可能已经注意到,我们的 API 调用返回的数据相当稀疏。如果我们不指定我们要求的数据类型,API 会假设我们只需要基本信息并为我们提供默认数据点,但这并不意味着我们仅限于这些数据。例如,查看清单 2-5,其中包含来自清单 2-2 中 API 调用返回的视频之一的信息。

 {
   "kind": "youtube#searchResult",
   "etag": "\"XI7nbFXulYBIpL0ayR_gDh3eu1k/wiczu7uNikHDvDfTYeIGvLJQbBg\"",
   "id": {
    "kind": "youtube#video",
    "videoId": "P-Kq9edwyDs"
   },
   "snippet": {
    "publishedAt": "2016-12-10T17:00:01.000Z",
    "channelId": "UCJFp8uSYCjXOMnkUyb3CQ3Q",
    "title": "Chocolate Crepe Cake",
    "description": "Customize & buy the Tasty Cookbook here: http://bzfd.it/2fpfeu5 Here is what you'll need! MILLE CREPE CAKE Servings: 8 INGREDIENTS Crepes 6 ...",
    "thumbnails": {
     "default": {
      "url": "https://i.ytimg.com/vi/P-Kq9edwyDs/default.jpg",
      "width": 120,
      "height": 90
     },
     "medium": {
      "url": "https://i.ytimg.com/vi/P-Kq9edwyDs/mqdefault.jpg",
      "width": 320,
      "height": 180
     },
     "high": {
      "url": "https://i.ytimg.com/vi/P-Kq9edwyDs/hqdefault.jpg",
      "width": 480,
      "height": 360
     }
    },
    "channelTitle": "Tasty",
    "liveBroadcastContent": "none"
   }
  },

清单 2-5:对仅包含视频基本信息的 API 调用的示例响应

该数据项对应于图 2-2 中 BuzzFeed 的 Tasty 频道上的视频。

图 2-2:清单 2-5 表示的视频截图

在线视频中显示的数据(例如,观看次数和评论数量)比我们通过 API 收到的数据要多。这些信息以及更多信息可通过 API 获得,但我们需要考虑我们想要获取的数据类型以及我们想要用它回答哪些问题。具体来说,我们需要做两件事。首先,我们需要为我们的研究设定目标。这可能是最重要但考虑最少的步骤之一。为您的研究制定明确的问题或假设将告知您如何收集数据。其次,我们应该查阅 API 文档,看看是否有满足我们研究目标所需的数据。

这种方法的一个很好的例子是 BuzzFeed 新闻报道“在党派内部为你的新闻提要而战”(https://buzzfeed.com/craigsilverman/inside-the-partisan-fight-for-your-news-feed),一个Craig Silverman、Jane Lytvynenko、Jeremy Singer-Vine 和我通过 Facebook 的 Graph API 从 452 个不同的 Facebook 页面收集了 400 万条帖子。拥有数百万个数据点,我们无法简单地分析所有数据。我们最终会不知所措,无法找到任何有意义的模式或趋势。为了开始我们的分析,我们首先需要缩小我们想要使用的信息的范围。

由于越来越多的新闻机构依赖 Facebook 等第三方来接触他们的受众,因此该项目深入研究了这些机构(包括新老机构)在 Facebook 上的相互比较。我们决定根据左倾和右倾新闻机构的粉丝数量和每页获得的参与度(反应和评论)来分析它们的受欢迎程度。一旦我们将数据缩小为两个类别,我们就将信息随时间绘制成图表,如图 2-3 所示。

图 2-3:BuzzFeed 新闻分析的左右倾斜 Facebook 页面性能的图表

我们可以看到左倾 Facebook 页面的参与度随着时间的推移而增加。 为了找到研究问题的答案,您不仅需要能够访问信息,还需要能够过滤信息。

如果我们想对 BuzzFeed 的 Tasty 频道内容随时间的流行情况进行类似的分析,我们将首先考虑可以帮助我们回答这个问题的数据类别。 例如,我们有多种方法来衡量视频的受欢迎程度,例如观看次数、喜欢次数、不喜欢次数和评论次数。 我们需要决定要使用哪种度量。

在某些情况下,社交媒体平台帖子的视觉布局是确定如何回答研究问题的好方法。 例如,图 2-4 可以让我们了解在 BuzzFeed 的 Tasty 频道的流行度分析中要寻找什么样的数据。

图 2-4:我们看到的帖子的带注释截图,表示为清单 2-5 中的数据

了解 BuzzFeed 内容性质的最佳方法可能是查看其视频属性(例如每个视频的标题和说明)。例如,我们可以使用观看次数和赞成或反对票作为衡量视频受欢迎程度的一种方式。最后但并非最不重要的一点是,我们可以使用视频时间戳来确定哪些内容随着时间的推移表现良好。

现在,我们如何访问其中的一些数据?这是我们查看 API 文档以了解信息是否可用的时间。如前所述,像 Google 这样的庞然大物公司提供了许多带有各种文档集的 API。我们对 YouTube 的数据 API 感兴趣,该 API 的文档位于 https://developers.google.com/youtube/。每个 API 的组织方式都不同,因此您需要阅读您开始使用的任何 API 的介绍或概述。在介绍如何使用它之前,让我们回顾一下 Google 的 YouTube API 的一些基础知识。

优化 API 返回的数据

我们可以使用各种参数来进一步缩小或指定我们想要收集的信息类型。转到 https://developers.google.com/youtube/v3/docs/search/list 上的 YouTube 的 API 文档,然后向下滚动到参数表。左列按名称列出参数,右列提供说明和使用指南。查找数据时,请阅读每个参数的说明并找到与您要访问的信息类型相匹配的参数。假设我们想将 API 的结果缩小到仅提及蛋糕一词的视频。为了优化我们的 API 调用,我们将使用参数 q(查询的缩写),然后输入我们正在搜索的术语。这意味着您需要在浏览器中输入 https://www.googleapis.com/youtube/v3/search?channelId=UCJFp8uSYCjXOMnkUyb3CQ3Q&part=snippet&key=YOUR_API_KEY&q=cake。

让我们打破这个电话。第一部分类似于我们在本章前面所做的第一个 API 调用。我们正在访问搜索 API 搜索?并通过参数 channelId 指定我们希望将搜索限制为来自 BuzzFeed Tasty 频道的视频。接下来,我们像以前一样输入我们的 API 密钥,后跟与号 (&) 表示我们将要添加一个参数 q。然后我们使用等号 (=) 并指定 API 返回的搜索词 cake。当您在浏览器中输入此 API 调用时,您应该得到一个 JSON 响应,其中仅包含描述或标题中带有 cake 一词的视频。

伟大的!您现在已经学会了如何使用参数来定制您的 API 数据请求。

概括

了解如何从 API 调用访问特定数据是从技术和概念上理解的一项重要任务。虽然每个 API 都有自己的参数、限制和身份验证过程,但我希望本章为您提供了成功导航每个 API 所需的各种方法的工具。在下一章中,我将向您展示如何使用 Python 脚本访问和优化数据。