如何使用Python下载Instagram数据
Instagram是世界上最大的社交媒体网络之一,截至2021年,约有12.1亿用户,占互联网总用户的28%,according to Statista。
本文是关于如何使用Python以两种方法编程下载Instagram中的数据的指南。第一种方法是使用Instaloader下载媒体。第二种方法是编写一个简单的Python脚本来获取有关用户资料的JSON数据。
需要注意的是,抓取数据可能违反Instagram的服务条款,我们建议您只从自己的账户下载数据。
使用Instaloader
Instaloader是一个用于下载Instagram媒体的Python包。它非常易于使用,可以快速方便地提取和下载数据。要开始使用Instaloader,首先使用pip安装它:
pip install instaloader
安装完成后,您可以使用它的命令行界面或作为Python脚本中的一个包来使用。
要从命令行使用它,您可以使用instaloader
命令。例如,要显示帮助信息,请在终端中输入以下命令:
instaloader --help
要下载用户的个人资料图片,您可以使用带有--profile
标签的命令,后面跟着用户名。像这样:
instaloader --profile
但是,要使此命令生效,您需要先登录。为此,您将传递登录选项,如下所示:
instaloader --login --profile
要下载的内容
使用Instaloader,您可以下载不同的媒体。这个手册页面的摘录展示了您可以下载的所有不同内容:
profile 下载个人资料。如果已经下载的个人资料已被重命名,Instaloader会自动通过唯一ID找到它并相应地重命名文件夹。
@profile 下载关注者的所有个人资料。需要--login。考虑使用:feed而不是@yourself。
"#hashtag" 下载#hashtag。
%location_id 下载%location_id。需要--login。
:feed 下载您的动态图片。需要--login。
:stories 下载您关注者的动态。需要--login。
:saved 下载您标记为已保存的帖子。需要--login。
-- -shortcode 下载给定shortcode的帖子
filename.json[.xz] 重新下载给定的对象。
+args.txt 从给定的文本文件中读取目标(和选项)。
要下载特定用户的帖子,您将输入以下命令:
instaloader --login
在这种情况下,您的用户名是您经过身份验证的Instagram账户的用户名;目标用户名是您要下载帖子的个人资料的用户名。
要下载关注者的帖子,您将输入以下命令:
instaloader --login @
请注意,这个命令与前一个命令的区别在于目标用户名之前有一个@
。
使用Instaloader命令行界面的另一种选择是将其作为Python包使用。这个包有很好的文档 here。
使用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模块。然而,您也可以使用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': '' }
接下来,定义一个在请求成功时运行的函数。
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、params和cookies作为参数传递。
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并在Web上打开Instagram。确保您已登录,然后使用Ctrl + Shift + I
或Cmd +Shift + I
打开Dev工具。
使用开发工具打开,打开“应用”选项卡。
然后点击Cookies子菜单,查看Instagram使用的Cookies。
然后从Dev Tools面板中列出的Cookies列表中复制sessionid
cookie的值。
复制会话ID后,将其粘贴到脚本中并执行脚本。在我的情况下,以用户名Instagram(https://instgram.com/instagram?__a=1&__d=1)使用,这是输出结果。
就是这样,我们可以动态下载配置文件数据。从JSON API返回的数据还有很多。当您打印所有数据时,这是输出结果:
这就是从Instagram配置文件中提取数据和帖子的方法。
最后的话
在本文中,我们介绍了如何使用Instaloader下载帖子和媒体。然后编写了一个自定义脚本来提取包含更多内容的配置文件JSON数据。如果您喜欢这个项目,您可能会想查看我们关于Python Timeit to Time Your Code的文章。
如果您对提高Instagram体验有兴趣,请查看我们关于Qoob Stories的文章:Instagram下载器的详细评测。