大数据分析Python使用Last.fm API获取音乐数据,API使我们能够从服务器发出检索数据的请求。API在许多方面都很有用,但其中之一是能够为数据科学项目创建唯一的数据集。在本教程中,我们将学习一些用于Last.fm API的高级技术。
在我们的初学者大数据分析Python API教程中,我们使用了一个简单的API,非常适合教授基础知识:
a.它具有一些易于理解的终点。
b.因为它不需要身份验证,所以我们不必担心如何告诉API我们有权使用它。
c.每个端点响应的数据都很小,并且结构易于理解。
实际上,大多数API都比这更复杂,因此要使用它们,您需要了解一些更高级的概念。具体来说,我们将学习:
a.如何使用API密钥进行身份验证。
b.如何使用速率限制和其他技术在API准则内工作。
c.如何使用分页处理较大的响应。
本教程假定您了解使用大数据分析Python使用API的基础知识。如果您不这样做,我们建议您开始我们的初学者API教程。我们还假设您具有大数据分析Python和pandas的中级知识。如果您不这样做,则可以通过我们的大数据分析Python基础课程免费开始学习。
使用Last.fm API
我们将使用Last.fm API。Last.fm是一项音乐服务,可通过连接到iTunes,Spotify等类似的音乐流应用程序并跟踪您听的音乐来建立个人资料。
他们提供对API的免费访问权,以便音乐服务可以向其发送数据,还可以提供终结点,以汇总Last.fm在各种艺术家,歌曲和流派上拥有的所有数据。我们将使用他们的API建立热门艺术家的数据集。
遵循API准则
使用API时,请务必遵循其准则。如果您不这样做,则可能会被禁止使用该API。除此之外,特别是当一家公司免费提供API时,请尊重他们的限制和准则,因为他们没有提供任何东西。
查看API文档中的Introduction页面,我们会注意到一些重要的准则:
请在所有请求上使用可识别的User-Agent标头。这有助于我们进行日志记录,并减少被禁止的风险。
向last.fm API发出请求时,可以使用headers标识自己。Last.fm希望我们在标头中指定一个用户代理,以便他们知道我们是谁。我们将在稍后提出第一个请求时学习如何执行此操作。
在确定要拨打多少次电话时,请使用常识。例如,如果要制作Web应用程序,请尝试不要在页面加载时点击API。如果您的应用程序每秒持续拨打多个电话,则您的帐户可能会被暂停。
为了构建我们的数据集,我们将需要向Last.fm API发出数千个请求。尽管他们没有在文档中提供具体的限制,但他们确实建议我们不要持续每秒进行多次呼叫。在本教程中,我们将学习一些限制速率的策略,或者确保我们不会过多使用它们的API,以便避免被禁止。
在发出第一个请求之前,我们需要学习如何使用Last.fm API进行身份验证
使用API密钥进行身份验证
大多数API都要求您进行身份验证,以便他们知道您有权使用它们。身份验证的最常见形式之一是使用API密钥,就像使用其API的密码一样。如果在发出请求时未提供API密钥,则会出现错误。
使用API密钥的过程如下:
a.您使用API的提供者创建一个帐户。
b.您需要一个API密钥,该密钥通常是一个长字符串,例如54686973206973206d7920415049204b6579。
c.您可以将API密钥记录在安全的地方,例如密码保存器。如果有人获得了您的API密钥,那么他们可以使用伪装成您的API。
d.每次发出请求时,您都提供API密钥以进行身份验证。
要获取Last.fm的API密钥,请先创建一个帐户。创建帐户后,应转到以下表格:
在每个字段中填写有关您计划如何使用API的信息。您可以将“回调URL”字段保留为空白,因为仅当您正在构建要验证为特定Last.fm用户的Web应用程序时才使用此字段。
提交表单后,您将获得API密钥和共享密钥的详细信息:
请在安全的地方记下这些内容-本教程无需使用共享密钥,但最好记下它,以防万一您想做一些需要您作为特定用户进行身份验证的事情。
发出我们的第一个API请求
为了创建热门艺术家的数据集,我们将使用chart.getTopArtists端点。
查看Last.fm API文档,我们可以观察到以下几点:
a.看起来只有一个真实的端点,并且实际上每个“端点”都是使用method参数指定的。
b.文档说此服务不需要身份验证。尽管起初看起来似乎有些混乱,但它告诉我们的是,我们不需要身份验证为特定的Last.fm用户。如果您在此之上看,您会发现我们确实需要提供我们的API密钥。
c.API可以返回多种格式的结果-我们将指定JSON,以便我们可以利用我们在大数据分析Python中使用API的已知知识
在开始之前,请记住,当我们发出请求时,我们需要提供一个用户代理标头来标识自己。使用大数据分析Python请求库,我们使用headers参数和标头字典来指定标头,如下所示:
我们将从定义API密钥和用户代理开始(本教程中显示的API密钥不是真正的API密钥!)
接下来,我们将导入请求库,为标头和参数创建字典,然后发出第一个请求!
我们的请求返回的状态码为“ 200”,因此我们知道成功了。
在查看请求返回的数据之前,请考虑一下在本教程中我们将发出许多请求的事实。在这些请求中,许多功能将是相同的:
a.我们将使用相同的URL
b.我们将使用相同的API密钥
c.我们将指定JSON作为我们的格式。
d.我们将使用相同的标题。
为了节省时间,我们将创建一个函数来为我们完成很多工作。我们将为该函数提供一个有效负载字典,然后将额外的键添加到该字典,并将其与其他选项一起传递以发出请求。
让我们看一下该函数的外观:
正如我们在初学者大数据分析Python API教程中所了解的那样,大多数API都以JSON格式返回数据,并且我们可以使用大数据分析Python json模块以更易于理解的格式打印JSON数据。
让我们重新使用jprint()在该教程中创建的函数,并打印来自API的响应:
{
"artists": {
"@attr": {
"page": "1",
"perPage": "50",
"total": "2901036",
"totalPages": "58021"
},
"artist": [
{
"image": [
{
"size": "small"
},
{
"size": "medium"
},
{
"size": "large"
},
{
"size": "extralarge"
},
{
"size": "mega"
}
],
"listeners": "1957174",
"mbid": "b7539c32-53e7-4908-bda3-81449c367da6",
"name": "Lana Del Rey",
"playcount": "232808939",
"streamable": "0",
},
{
"image": [
{
"size": "small"
},
{
"size": "medium"
},
{
"size": "large"
},
{
"size": "extralarge"
},
{
"size": "mega"
}
],
"listeners": "588883",
"mbid": "",
"name": "Billie Eilish",
"playcount": "35520548",
"streamable": "0",
},
{
"image": [
{
"size": "small"
},
{
"size": "medium"
},
{
"size": "large"
},
{
"size": "extralarge"
},
{
"size": "mega"
}
],
"listeners": "655052",
"mbid": "",
"name": "Post Malone",
"playcount": "34942708",
"streamable": "0",
},
{
"image": [
{
"size": "small"
},
{
"size": "medium"
},
{
"size": "large"
},
{
"size": "extralarge"
},
{
"size": "mega"
}
],
"listeners": "2290993",
"mbid": "20244d07-534f-4eff-b4d4-930878889970",
"name": "Taylor Swift",
"playcount": "196907702",
"streamable": "0",
},
{
"image": [
{
"size": "small"
},
{
"size": "medium"
},
{
"size": "large"
},
{
"size": "extralarge"
},
{
"size": "mega"
}
],
"listeners": "1166180",
"mbid": "f4fdbb4c-e4b7-47a0-b83b-d91bbfcfa387",
"name": "Ariana Grande",
"playcount": "124251766",
"streamable": "0",
},
{
"image": [
{
"size": "small"
},
{
"size": "medium"
},
{
"size": "large"
},
{
"size": "extralarge"
},
{
"size": "mega"
}
],
"listeners": "1716587",
"mbid": "b8a7c51f-362c-4dcb-a259-bc6e0095f0a6",
"name": "Ed Sheeran",
"playcount": "92646726",
"streamable": "0",
},
{
"image": [
{
"size": "small"
},
{
"size": "medium"
},
{
"size": "large"
},
{
"size": "extralarge"
},
{
"size": "mega"
}
],
"listeners": "4084524",
"mbid": "420ca290-76c5-41af-999e-564d7c71f1a7",
"name": "Queen",
"playcount": "197850122",
"streamable": "0",
},
{
"image": [
{
"size": "small"
},
{
"size": "medium"
},
{
"size": "large"
},
{
"size": "extralarge"
},
{
"size": "mega"
}
],
"listeners": "4449534",
"mbid": "164f0d73-1234-4e2c-8743-d77bf2191051",
"name": "Kanye West",
"playcount": "250533444",
"streamable": "0",
},
{
"image": [
{
"size": "small"
},
{
"size": "medium"
},
{
"size": "large"
},
{
"size": "extralarge"
},
{
"size": "mega"
}
],
"listeners": "3732023",
"mbid": "b10bbbfc-cf9e-42e0-be17-e2c3e1d2600d",
"name": "The Beatles",
"playcount": "526866107",
"streamable": "0",
},
{
"image": [
{
"size": "small"
},
{
"size": "medium"
},
{
"size": "large"
},
{
"size": "extralarge"
},
{
"size": "mega"
}
],
"listeners": "3441963",
"mbid": "b49b81cc-d5b7-4bdd-aadb-385df8de69a6",
"name": "Drake",
"playcount": "147881092",
"streamable": "0",
},
{
"image": [
{
"size": "small"
},
{
"size": "medium"
},
{
"size": "large"
},
{
"size": "extralarge"
},
{
"size": "mega"
}
],
"listeners": "4778856",
"mbid": "a74b1b7f-71a5-4011-9441-d0b5e4122711",
"name": "Radiohead",
"playcount": "507682999",
"streamable": "0",
},
{
"image": [
{
"size": "small"
},
{
"size": "medium"
},
{
"size": "large"
},
{
"size": "extralarge"
},
{
"size": "mega"
}
],
"listeners": "1528378",
"mbid": "381086ea-f511-4aba-bdf9-71c753dc5077",
"name": "Kendrick Lamar",
"playcount": "109541321",
"streamable": "0",
},
{
"image": [
{
"size": "small"
},
{
"size": "medium"
},
{
"size": "large"
},
{
"size": "extralarge"
},
{
"size": "mega"
}
],
"listeners": "4618838",
"mbid": "db36a76f-4cdf-43ac-8cd0-5e48092d2bae",
"name": "Rihanna",
"playcount": "204114198",
"streamable": "0",
},
{
"image": [
{
"size": "small"
},
{
"size": "medium"
},
{
"size": "large"
},
{
"size": "extralarge"
},
{
"size": "mega"
}
],
"listeners": "3550620",
"mbid": "ada7a83c-e3e1-40f1-93f9-3e73dbc9298a",
"name": "Arctic Monkeys",
"playcount": "339370140",
"streamable": "0",
},
{
"image": [
{
"size": "small"
},
{
"size": "medium"
},
{
"size": "large"
},
{
"size": "extralarge"
},
{
"size": "mega"
}
],
"listeners": "3401872",
"mbid": "5441c29d-3602-4898-b1a1-b77fa23b8e50",
"name": "David Bowie",
"playcount": "197606611",
"streamable": "0",
},
{
"image": [
{
"size": "small"
},
{