手把手搭建自己的“迷你IMDB”电影数据库

深度学习 4175 Views

作者|Tirthajyoti Sarkar

译者|孙浩

编辑|Vincent

AI 前线导读:通常学习了 Python 入门课程之后,初学者会开始思考如何编写一个很酷的 Python 程序,来演示一些高级的语言能力,比如 web 抓取或数据库操作。本文将展示如何使用简单的 Python 库和其内置功能来获取网上的电影信息,并将它们存储在本地的 SQLite 数据库中,之后还可以查询电影数据并进行数据分析。我们可以将它看作是一个构建自己迷你 IMDB 数据库的项目!更多干货内容请关注微信公众号“AI 前线”,(ID:ai-front)

通常学习了 Python 入门课程之后,初学者会开始思考如何编写一个很酷的 Python 程序,来演示一些高级的语言能力,比如 web 抓取或数据库操作。在本文中,我将展示如何使用简单的 Python 库和其内置功能来获取网上的电影信息,并将它们存储在本地的 SQLite 数据库中,之后还可以查询电影数据并进行数据分析。我们可以将它看作是一个构建自己迷你 IMDB 数据库的项目!

这种类型的数据工程任务——从网上收集数据并建立与数据库的关联——通常是数据分析项目的第一步。在做任何预测建模之前,你都需要掌握这一步骤。这一步的数据通常是凌乱且非结构化的,也就是说,没有能够帮你一步到位完成这些工作的方案或代码库。因此,你必须从 web 上提取数据,检查它的结构,并构建你的代码,以便成功地抓取它。

具体来说,这个 demo 将展示以下功能的用法:

    Python urllib 库
  • 用于检索数据的 Web API 服务 (带有密匙)

  • Python json 库

  • Python OS 模块

  • Python SQLite 库

以下是对它们简要的描述:

Python urllib 模块

连接 Python 和 web 是通过 urllib 模块完成的。urllib 是一个用于抓取 url 的 Python 模块 (统一资源定位器)。它用 urlopen 函数提供了一个非常简单的接口,可以使用各种不同的协议来获取 url。它还提供了一个稍微复杂的接口来处理常见的场景,比如基本身份验证、cookie、代理等等。这些功能是由 handlers 类和 openers 类的对象提供的。

用于检索数据的 Web API 服务 (带有密匙)

Web 抓取通常由外部网站托管的 API 服务来完成。将它们作为存储库或远程数据库,你可以通过从自己的小程序中发送搜索字符串来查询。在这个例子中,我们将从 Open Movie Database (OMDB) 网站获得帮助,该网站为注册用户提供用于电影信息下载的 API 密钥。因为这是一个免费的服务,所以他们每天限制 1000 个请求。注意,你必须在他们的网站上注册,并为你的 Python 程序访问网站获取你自己的 API 密钥。

使用这个 API 服务获得的数据会作为一个 JSON 文件返回。因此,我们需要将 JSON 文件解析 / 转换成 Python 对象,这样可以方便我们接下来的操作。

Python json 模块

JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式。既让人类容易阅读和书写,也让机器容易解析和生成。它是基于 1999 年 12 月 ECMA-262 标准第三版 JavaScript 编程语言的一个子集。JSON 是一种完全独立于语言的文本格式,但它使用的是 C 族语言的程序员所熟悉的约定,包括 C、c++、c#、Java、JavaScript、Perl、Python 等等。这些属性使 JSON 成为一种理想的数据交换语言。

json 库可以从字符串或文件中解析 json 页面。它将 JSON 解析为 Python 字典或 list。还可以将 Python 字典或 list 转换为 JSON 字符串。这是一个非常有用的模块,学习起来非常简单。这个模块很可能被用于任何基于 Python 的 web 数据分析程序,因为现在大多数的 web 页面都使用 JSON 作为返回数据的主要对象类型。

Python OS 模块

该模块提供了一种使用操作系统相关功能的方法。如果你只想读取或写入文件,请参见 open(),如果你想要操作路径,请参见 os.path 模块,如果你想用命令行读取文件中所有行,请查看 fileinput 模块。要创建临时文件和目录,请查看 tempfile 模块,高级文件和目录处理查看 shutil 模块。在这个 demo 中,我们将使用 OS 模块的方法检查现有目录并操作文件以保存一些数据。

SQLite 和 Python SQLite3

SQLite 是一个 C 库,它提供了一个轻量级的基于磁盘的数据库,不需要单独的服务器进程,并且允许使用 SQL 查询语言的非标准变体访问数据库。一些应用程序可以使用 SQLite 进行内部数据存储。还可以使用 SQLite 对应用程序进行原型化,然后将代码移植到更大的数据库中,比如 PostgreSQL 或 Oracle。Python 的 sqlite3 模块提供了符合 DB-API 2.0 规范的 SQL 接口。

程序的主要流程

程序的流程如下所示。请注意,我的示例代码已经提交到 Github repository 上。如果你有兴趣,可以下载。

程序主要流程

基本思路是,使用用户输入的电影标题向外部 API 发送请求。然后程序尝试下载数据,如果成功,打印出来。

举个例子,其中 JSON 文件如下图所示:

由 API 抓取的 JSON 数据示例

如果程序在电影海报中发现有图像文件的链接,它会询问用户是否想要下载图片。如果用户允许,它会将图像文件下载到一个以电影标题做为文件名的本地目录中。

接下来,它会询问用户是否希望在本地数据库中保存有关电影的基本信息。如果用户允许,它会将下载的电影信息的子集插入一个 SQLite 数据库中,假如之前没有的话,会创建数据库。

下面是保存数据库的函数定义。

代码中还包含一个函数,用于从现有数据库中保存信息到 Excel 文件中。

关于密钥 API

你应该注意到程序需要一个 API 密钥来访问数据。这个密钥可以通过访问 OMDB 网站免费获得,每天最多使用 1000 次。使用密钥 (用户特有的) 进行 web 抓取是非常通用的做法。我保护我个人 API 密钥的方法是,我在 Jupyter notebook 的同一个目录中创建一个小的 JSON 文件,称为 APIkeys.json。该文件的内容对于不关注我代码的人是隐藏的。Jupyter notebook 读取这个 JSON 文件为字典类型,并复制电影网站需要的相应的 key,将其拼接到 urllib.request 方法发送的 URL 请求字符串上。

总结

本文介绍了一个 Python notebook demo 项目,演示如何使用免费的 API 服务检索有关电影的基本信息,并将电影海报和下载的信息保存在一个轻量级的 SQLite 数据库中。

最重要的是,它演示了简单使用 Python 库,如 urllib、json 和 sqlite3 的方法,它们对于数据分析 / web 数据挖掘任务来说是非常有用的 (和强大的) 工具。

我希望读者能从我的 Notebook 中获益,并根据他们自己的需求和思考进行程序构建。需要更多的 web 数据分析相关的 Notebook,可以查看我的项目库。

英文原文链接:

https://towardsdatascience.com/step-by-step-guide-to-build-your-own-mini-imdb-database-fc39af27d21b


AI前线

紧跟前沿的AI技术社群

如果你想看到更多这类文章,请点个赞再走哦!

如未说明则本站原创,转载请注明出处:NULL » 手把手搭建自己的“迷你IMDB”电影数据库