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
相关产品推荐
相关产品推荐

