搭建环境准备
instaloader
用于下载 Instagram 内容Flask
构建 Web 服务python3-venv
构建虚拟环境用于安装instaloader
和flask
nohup
用于脚本在后台运行
编写Flask脚本
创建一个目录,并在其中创建 app.py 文件:
1mkdir instagram-downloade/
2cd instagram-downloade/
3nano app.py
app.py 文件代码如下:
1import os
2from flask import Flask, request, render_template, send_file, url_for
3import instaloader
4import requests
5from datetime import datetime
6
7app = Flask(__name__)
8loader = instaloader.Instaloader()
9
10@app.route('/')
11def index():
12 return render_template('index.html')
13
14@app.route('/download', methods=['POST'])
15def download():
16 url = request.form.get('url')
17 if not url:
18 return "错误:未提供链接", 400
19
20 try:
21 # 获取 Instagram 帖子的 shortcode
22 shortcode = url.split("/")[-2]
23
24 # 获取帖子的 Post 对象
25 post = instaloader.Post.from_shortcode(loader.context, shortcode)
26
27 # 确保创建 downloads 文件夹
28 target_dir = os.path.join(app.static_folder, 'downloads')
29 if not os.path.exists(target_dir):
30 os.makedirs(target_dir)
31
32 filenames = []
33
34 # 获取当前时间戳,用于确保文件名唯一
35 timestamp = datetime.utcnow().strftime('%Y-%m-%d_%H-%M-%S_UTC')
36
37 # 下载单张图片
38 filename = os.path.join(target_dir, f"{timestamp}_{post.shortcode}.jpg")
39 download_file(post.url, filename) # 下载单张图片
40 filenames.append(filename)
41
42 # 如果是多图帖,下载所有图片
43 if post.typename == 'GraphSidecar': # 如果是包含多个图片的帖子
44 for index, node in enumerate(post.get_sidecar_nodes()):
45 high_res_url = node.display_url # 获取高分辨率图片 URL
46 filename = os.path.join(target_dir, f"{timestamp}_{post.shortcode}_{index + 1}.jpg")
47 download_file(high_res_url, filename)
48 filenames.append(filename)
49
50 # 渲染下载完成页面,显示所有下载文件的链接和图片
51 return render_template('download_page.html', filenames=filenames)
52
53 except Exception as e:
54 return f"下载失败:{str(e)}", 500
55
56def download_file(url, filename):
57 """下载文件并保存到指定路径"""
58 # 如果文件已存在,重新命名文件
59 if os.path.exists(filename):
60 filename = generate_unique_filename(filename)
61
62 # 使用 requests 下载文件
63 try:
64 img_data = requests.get(url).content
65 with open(filename, 'wb') as f:
66 f.write(img_data)
67 except Exception as e:
68 print(f"下载文件时出错: {e}")
69
70def generate_unique_filename(filename):
71 """生成一个唯一的文件名,如果文件已存在。"""
72 basename, ext = os.path.splitext(filename)
73 counter = 1
74 while os.path.exists(filename):
75 filename = f"{basename}_{counter}{ext}"
76 counter += 1
77 return filename
78
79if __name__ == '__main__':
80 app.run(host='0.0.0.0', port=5000)
编写前端页面
在 templates
文件夹中创建 index.html
:
1<!DOCTYPE html>
2<html lang="en">
3<head>
4 <meta charset="UTF-8">
5 <meta name="viewport" content="width=device-width, initial-scale=1.0">
6 <title>Instagram Downloader</title>
7</head>
8<body>
9 <h1>Instagram 照片下载工具</h1>
10 <form method="POST" action="/download">
11 <label for="url">输入 Instagram 链接:</label>
12 <input type="text" id="url" name="url" required>
13 <button type="submit">下载</button>
14 </form>
15</body>
16</html>
在 templates
文件夹中再创建 download_page.html
页面:
1<!DOCTYPE html>
2<html lang="en">
3<head>
4 <meta charset="UTF-8">
5 <meta name="viewport" content="width=device-width, initial-scale=1.0">
6 <title>下载完成</title>
7</head>
8<body>
9 <h1>下载完成</h1>
10 <ul>
11 {% for filename in filenames %}
12 <li>
13 <div>
14 <!-- 展示图片 -->
15 <img src="{{ url_for('static', filename='downloads/' + filename.split('/')[-1]) }}" alt="{{ filename }}" width="200" />
16 </div>
17 <div>
18 <!-- 提供下载链接 -->
19 <a href="{{ url_for('static', filename='downloads/' + filename.split('/')[-1]) }}" download>下载 {{ filename.split('/')[-1] }}</a>
20 </div>
21 </li>
22 {% endfor %}
23 </ul>
24</body>
25</html>
安装运行环境
安装虚拟环境工具python3-venv
1sudo apt install python3-venv
2#创建虚拟环境
3python3 -m venv myenv
4#激活虚拟环境
5source myenv/bin/activate
6#安装 instaloader 和 flask
7pip install instaloader flask
8#后台运行app.py
9nohup python app.py &
10#退出虚拟环境
11deactivate
最后项目结构如下
instagram-download/
├── app.py # Flask 应用主文件
├── static/ # Flask 静态文件目录
│ └── downloads/ # 存储下载文件的文件夹
│ ├── 12345_1.jpg # 下载的第一张图片
│ ├── 12345_2.jpg # 下载的第二张图片
│ ├── 12345_3.jpg # 下载的第三张图片
│ └── ... # 其他下载文件
├── templates/ # 存放 HTML 模板的目录
│ ├── index.html # 首页,用户输入链接的表单页面
│ └── download_page.html # 下载完成页面,展示文件下载链接
└── venv/ # 虚拟环境(如果你使用了虚拟环境)
使用下载站
打开浏览器,访问 http://localhost:5000
,输入 Instagram 链接并提交