You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python开发Instagram内容下载工具遇阻,求Python/PHP可行实现方案

我明白你现在卡在Instagram Reels下载的问题上了——之前试的几个Python库都没搞定,我来给你几个实际可行的方案,不管是Python还是PHP都能解决:

一、Python 可行方案

1. 用 instagrapi 正确实现(最稳定)

你之前可能没用到正确的登录和调用方式,instagrapi 是目前维护最活跃的Instagram第三方库,完全支持Reels下载。关键是要确保sessionid有效,并且和请求头匹配:

from instagrapi import Client
import time

# 初始化客户端
cl = Client()
# 用有效的sessionid登录(避免输入账号密码)
cl.login_by_sessionid("YOUR_VALID_SESSIONID")

# 替换为目标Reels链接
reel_url = "https://www.instagram.com/reel/XXXXXXX/"
# 从链接获取媒体ID
media_pk = cl.media_pk_from_url(reel_url)
# 获取媒体详情
reel_info = cl.media_info(media_pk)

# 下载Reels到本地
download_filename = f"./reel_{int(time.time())}.mp4"
cl.media_download(media_pk, filename=download_filename)
print(f"Reels已成功下载至: {download_filename}")

注意事项:

  • 定期更新库:pip install --upgrade instagrapi,Instagram接口频繁变动,新版本会跟进修复
  • sessionid从浏览器开发者工具获取(Application → Cookies → instagram.com → sessionid),不要分享给他人

2. 直接用 requests 解析页面(无依赖)

如果不想用第三方库,可以直接爬取页面源码提取视频链接,需要处理反爬和转义字符:

import requests
import re
import time

SESSIONID = "YOUR_VALID_SESSIONID"
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36",
    "cookie": f"sessionid={SESSIONID};",
    "Referer": "https://www.instagram.com/"
}

reel_url = "https://www.instagram.com/reel/XXXXXXX/"
response = requests.get(reel_url, headers=headers)

if response.status_code == 200:
    # 正则提取视频链接(处理转义字符)
    video_match = re.search(r'"video_url":"(https[^"]+)"', response.text)
    if video_match:
        video_url = video_match.group(1).replace("\\u0026", "&")
        # 下载视频
        video_data = requests.get(video_url, headers=headers).content
        with open(f"./reel_{int(time.time())}.mp4", "wb") as f:
            f.write(video_data)
        print("Reels下载成功!")
    else:
        print("未找到视频链接,可能页面结构已更新")
else:
    print("请求被拦截,检查sessionid是否过期或UA是否正确")

3. 修复 instaloader 的用法

你之前只测试了头像下载,其实instaloader也支持Reels,需要正确获取Post对象:

import instaloader

L = instaloader.Instaloader()
# 可选:登录(公开Reels可能不需要,但登录后更稳定)
# L.login("YOUR_USERNAME", "YOUR_PASSWORD")
# 或者用sessionid:
# L.context.session_id = "YOUR_VALID_SESSIONID"

reel_url = "https://www.instagram.com/reel/XXXXXXX/"
# 从链接提取短代码(链接中倒数第二个字段)
shortcode = reel_url.split("/")[-2]
# 获取Post对象并下载
post = instaloader.Post.from_shortcode(L.context, shortcode)
L.download_post(post, target="reels_downloads")
二、PHP 可行方案

用GuzzleHttp发送请求并解析页面,逻辑和Python的无依赖方案类似:

<?php
require 'vendor/autoload.php';
use GuzzleHttp\Client;

$sessionId = "YOUR_VALID_SESSIONID";
$reelUrl = "https://www.instagram.com/reel/XXXXXXX/";

$client = new Client([
    'headers' => [
        'User-Agent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36',
        'Cookie' => "sessionid={$sessionId};",
        'Referer' => 'https://www.instagram.com/'
    ]
]);

try {
    $response = $client->request('GET', $reelUrl);
    $html = $response->getBody()->getContents();
    
    // 正则提取视频链接并处理转义
    preg_match('/"video_url":"(https[^"]+)"/', $html, $matches);
    if (isset($matches[1])) {
        $videoUrl = str_replace('\\u0026', '&', $matches[1]);
        $videoData = $client->request('GET', $videoUrl)->getBody()->getContents();
        
        $filename = './reel_' . time() . '.mp4';
        file_put_contents($filename, $videoData);
        echo "Reels已下载至: {$filename}";
    } else {
        echo "未找到视频链接";
    }
} catch (Exception $e) {
    echo "请求失败: " . $e->getMessage();
}
?>

前置操作:先安装GuzzleHttp:composer require guzzlehttp/guzzle

通用注意事项
  • Instagram反爬严格,避免频繁批量请求,建议添加请求间隔(比如time.sleep(2))
  • sessionid会过期,失效后需要重新从浏览器获取
  • 公开Reels可能不需要登录,但私有账号或限制内容必须登录才能访问

内容的提问来源于stack exchange,提问作者Nitin Kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 17:27:47