我正在尝试下载以下格式的音频 https://www.instagram.com/reels/audio/1997779980583970/。下面的代码返回“获取元数据失败”。 我可以下载卷轴,但不能下载单独的音频文件。
我该怎么办?
def get_reel_audio_data(audio_id):
loader = instaloader.Instaloader()
try:
# Fetch the audio post using the audio ID
audio_post = instaloader.Post.from_shortcode(loader.context, audio_id)
audio_url = audio_post.video_url if audio_post.is_video else audio_post.url
return audio_url, True
except Exception as e:
if settings.DEBUG:
import traceback
print(traceback.format_exc())
capture_exception(e)
return None, False
在 https://www.theirdomain.example/robots.txt 阅读该服务的 robots.txt,以确保您遵守其有关自动数据检索的政策, 并出于同样的目的查看他们的隐私政策。 并由您自己负责,
您需要找到音频文件本身的 URL。卷轴的 URL 不起作用。虽然它有一个带有按钮的声音链接,但您无法直接根据卷轴 URL 或按钮下载,因为它们不是音频文件,而您的下载方法可能需要它。
使用浏览器的检查模式或类似名称的功能来查看源代码。 打开浏览器用于检查元素的工具,按照播放声音的按钮的路径进行操作,看看是否可以找到它指向的原始文件。我的简单示例只有在有效时才有效 - 但我找到了它。
一旦找到指向的音频文件,例如或类似的,您可以测试该文件是否可下载,并继续编写用于处理它的Python代码逻辑:
1 从该 HTML 标签中提取 URL 指向的内容 2 使用您已经尝试过的代码中的 URL 来验证下载是否有效
为了构建一个可重复使用的工具来将自动化方法应用于任何卷轴,我们可以假设您正在抓取的服务将在不同卷轴之间保持相同的 HTML 结构。然后每次在reel页面下按相似的“路径”找到音频文件。 您的浏览器检查工具为您手动找到的原始文件提供完整的 XPath: /html/body/div[2]/div/div/div[2]/div/div/div[1]/div[1]/div [1]/section/main/div/div/div[2]/div[1]/div/div[2]/div[3]/div/div[2]/div/audio 然后,您可以在 Python 代码中使用该 XPath 来查找我用作示例的音频标签。
如果您发现所有卷轴具有相同 XPath 的假设不成立,您可以尝试其他策略,例如从网页中查找所有 .m4a URL。
请注意,如果您不遵守服务的使用政策,您的代码在测试后可能不会运行很长时间。