如何使用 Python 下载 Instagram 数据

根据Statista的数据显示,Instagram是全球最庞大的社交媒体平台之一,截至2021年,用户数量达到约12.1亿,这大约占据了互联网用户总数的28%。

本文将指导您如何使用Python,通过两种不同的方式,以编程方式下载Instagram个人资料的数据。第一种方法是利用Instaloader工具下载媒体内容;第二种方法则是编写一个简单的Python脚本,以获取有关个人资料的JSON数据。

请务必注意,数据抓取行为可能违反Instagram的服务条款,我们建议您仅下载自己账户的数据。

使用 Instaloader

Instaloader是一个专门用于下载Instagram媒体的Python包。它操作简便,能够快速便捷地提取并下载所需数据。若要开始使用Instaloader,首先需要使用pip进行安装:

pip install instaloader

安装完成后,您既可以通过命令行界面使用,也可以将其作为Python脚本中的一个包来调用。

若要通过命令行使用,可直接使用`instaloader`命令。例如,若要显示帮助信息,可以在终端输入以下指令:

instaloader --help

若要下载用户的个人资料图片,需要输入带有`–profile`标记的命令,并随后输入用户名,如下所示:

instaloader --profile <目标用户名>

然而,要使此命令生效,您需要先进行登录。为此,需要添加`–login`选项:

instaloader --login <您的用户名> --profile <目标用户名>

下载内容

借助Instaloader,您可以下载多种类型的媒体。以下是手册页的节选,列出了您可以下载的各种内容:

  profile               下载个人资料。若已下载的个人资料被重命名,Instaloader会根据其唯一ID自动查找并重命名文件夹。
  @profile              下载个人资料关注的所有用户。需要`--login`选项。建议使用`:feed`代替`@yourself`。
  "#hashtag"            下载#标签。
  %location_id          下载%位置ID。需要`--login`选项。
  :feed                 下载您的动态中的图片。需要`--login`选项。
  :stories              下载您关注用户的快拍。需要`--login`选项。
  :saved                下载您标记为保存的帖子。需要`--login`选项。
  -- -shortcode         下载具有给定短代码的帖子。
  filename.json[.xz]    重新下载给定的对象。
  +args.txt             从给定的文本文件中读取目标(和选项)。

若要下载特定用户的帖子,您可以输入如下命令:

instaloader --login <您的用户名> <目标用户名>

其中,您的用户名是经过身份验证的Instagram账户的用户名;目标用户名是您希望下载其帖子的个人资料。

若要下载某个用户关注者的帖子,您可以输入以下命令:

instaloader --login <您的用户名> @<目标用户名>

请注意,此命令与前一个命令的区别在于目标用户名前的`@`。

除了使用Instaloader的命令行界面,您还可以将其作为Python包来使用。该软件包的详细文档在此处。

使用Instaloader,您可以下载各种媒体文件。然而,如果需要提取元数据,例如用户的个人资料页面信息,仅依靠Instaloader是不足够的。接下来介绍的方法中,您将编写一个Python脚本来提取用户个人资料的数据。

编写Python脚本以下载Instagram数据

概述

在本节中,我们将编写一个简单的Python脚本来下载Instagram数据。此方法依赖于利用一个相对不太公开的Instagram JSON API来提取公共个人资料的数据。

该API的工作原理是,如果您在个人资料URL的末尾附加`__a=1&__d=1`查询参数,Instagram将返回关于该个人资料的JSON数据。

例如,我的用户名是`0xanesu`。因此,如果我向`https://instagram.com/instagram/?__a=1&__d=1`发出请求,我将获得关于我的个人资料的JSON数据作为响应。

编写脚本

要在Python中发送请求,我们将使用Python的requests模块。当然,您也可以使用pycURL,urllib或您偏爱的其他任何HTTP客户端库。首先,使用pip安装requests模块:

pip install requests

安装完成后,创建一个文件来编写脚本,并从requests模块导入`get`函数。此外,还要从json模块导入`loads`函数,它将用于解析JSON响应。

from requests import get
from json import loads

导入必要模块后,创建一个变量来存储您的Instagram个人资料的URL。

url="https://instagram.com/<您的用户名>"

如前所述,要提取Instagram数据,需要添加`__a=1`和`__d=1`查询参数。为了定义这些参数,我们创建一个带有这些参数的字典对象。

params = { '__a': 1, '__d': 1 }

为了授权我们的请求,Instagram需要会话ID。稍后,我将向您展示如何获取会话ID。现在,只需放置一个占位符值,稍后会被替换。

cookies = { 'sessionid': '<您的会话ID>' }

接下来,定义一个函数,在请求成功时运行。

def on_success(response):
    profile_data_json = response.text
    parsed_data = loads(profile_data_json)

    print('用户全名:', parsed_data['graphql']['user']['full_name'])
    print('用户简介:', parsed_data['graphql']['user']['biography'])

我定义的函数会接收响应对象,从响应主体中提取JSON,然后将JSON解析为一个对象。在此之后,我仅提取个人资料的全名和简介。

接下来,定义一个在发生错误时将运行的函数。

def on_error(response):
    # 如果出现错误,则打印错误信息
    print('发生错误')
    print('错误代码:', response.status_code)
    print('原因:', response.reason)

然后,我们调用`get`函数来发送请求,将URL、参数和cookie作为参数传递。

response = get(url, params, cookies=cookies)

最后,我们检查错误的状态码。如果状态码为200,我们调用`on_success`函数,否则调用`on_error`函数。

if response.status_code == 200:
    on_success(response)
else:
    on_error(response)

至此,我们完成了代码的编写。接下来就是获取`sessionid`。要获取会话ID,请打开您的Google Chrome浏览器,并在网页上打开Instagram。请确保您已登录,然后使用`Ctrl + Shift + I`或`Cmd + Shift + I`打开开发者工具。

在打开的开发者工具中,点击“Application”选项卡。

然后单击“Cookies”子菜单,以查看Instagram使用的cookie。

之后,从开发者工具面板中列出的cookie列表中复制`sessionid` cookie的值。

复制会话ID后,将其粘贴到脚本中,然后执行脚本。在我的示例中,使用Instagram作为用户名 (https://instgram.com/instagram?__a=1&__d=1),输出如下所示:

就这样,我们成功地动态下载了个人资料数据。JSON API返回的数据非常丰富,这是打印所有内容时的输出:

以上就是您如何从Instagram个人资料中提取数据和帖子的方法。

总结

在本文中,我们介绍了如何使用Instaloader下载帖子和媒体内容。此外,我们还编写了一个自定义脚本来提取个人资料的JSON数据,其中包含比媒体内容更丰富的信息。如果您对这个项目感兴趣,您可能还想了解我们关于Python Timeit的文章,它可以帮助您测量代码的运行时间。

如果您有兴趣进一步探索Instagram体验,请查看我们关于Qoob Stories的文章:一篇关于Instagram下载器的详细评论。