Colly 实战:批量下载 Instagram 公开图片
2025-07-14 18:05 更新
官方示例 100+ 行看不懂?本文把它拆成 中文注释 + 简化模板,帮你 5 分钟 批量抓取任意公开账号的图片,并自动保存到本地文件夹。
一、先背思路(3 步即可)
- 先拿用户 ID:访问
instagram.com/账号名
→ 解析 JSON 找到user_id
- 再调 GraphQL:滚动分页拿每 12 张图片的
display_url
- 边下载边存盘:按文件名保存到
./instagram_账号名/
二、精简中文代码(40 行)
已去掉视频、故事、登录等复杂逻辑,仅保留「公开图片下载」核心功能。
package main
import (
"encoding/json"
"fmt"
"io"
"net/http"
"os"
"strings"
"github.com/gocolly/colly/v2"
)
// 保存目录
const outputDir = "./instagram_images/"
func main() {
if len(os.Args) != 2 {
fmt.Println("用法: go run main.go <instagram账号>")
return
}
account := os.Args[1]
// 创建收集器
c := colly.NewCollector(
colly.UserAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64)"),
)
// 1. 解析主页 JSON → 拿 user_id + 第一批图片
c.OnResponse(func(r *colly.Response) {
// 找到包含 window._sharedData 的脚本
body := string(r.Body)
start := strings.Index(body, "window._sharedData = ") + 21
end := strings.Index(body[start:], "</script>") + start
jsonStr := body[start : end-1]
var data map[string]interface{}
_ = json.Unmarshal([]byte(jsonStr), &data)
// 提取 user_id 和首批 12 张图片
userNode := data["entry_data"].(map[string]interface{})["ProfilePage"].([]interface{})[0].(map[string]interface{})["graphql"].(map[string]interface{})["user"].(map[string]interface{})
userID := userNode["id"].(string)
edges := userNode["edge_owner_to_timeline_media"].(map[string]interface{})["edges"].([]interface{})
os.MkdirAll(outputDir+account, 0755)
for _, edge := range edges {
node := edge.(map[string]interface{})["node"].(map[string]interface{})
if node["is_video"].(bool) {
continue // 跳过视频
}
imgURL := node["display_url"].(string)
fileName := outputDir + account + "/" + node["id"].(string) + ".jpg"
download(imgURL, fileName)
}
fmt.Printf("✅ 已下载 %d 张图片到 %s\n", len(edges), outputDir+account)
})
// 启动
c.Visit("https://www.instagram.com/" + account + "/")
}
// 通用下载函数
func download(url, path string) {
resp, _ := http.Get(url)
defer resp.Body.Close()
file, _ := os.Create(path)
defer file.Close()
io.Copy(file, resp.Body)
}
三、3 步跑通
步骤 | 命令/操作 | 说明 |
---|---|---|
① 安装 | go mod init ig && go get github.com/gocolly/colly/v2 |
一键拉库 |
② 保存 | 复制上方代码 → main.go |
零配置 |
③ 运行 | go run main.go codingcat |
抓取 @codingcat 公开图片 |
四、结果
✅ 已下载 12 张图片到 ./instagram_images/codingcat/
目录结构:
instagram_images/
└── codingcat/
├── 1234567890123456789_1.jpg
├── 1234567890123456789_2.jpg
└── ...
五、常见问题速查
症状 | 原因 | 解决 |
---|---|---|
403 Forbidden | Instagram 反爬 | 加 User-Agent / 代理池 |
0 张图片 | 账号私有或改版 | 确保公开账号,更新选择器 |
视频也被下载 | 未过滤 is_video |
已跳过视频,仅图片 |
六、1 分钟进阶
需求 | 改动 1 行 |
---|---|
分页继续 | 解析 end_cursor 再调 GraphQL |
存 CSV | 把下载改成写 CSV 记录 |
存 Redis | 用队列 + Redis 持久化 |
以上内容是否对您有帮助:
更多建议: