Colly 实战:批量下载 Instagram 公开图片

2025-07-14 18:05 更新

官方示例 100+ 行看不懂?本文把它拆成 中文注释 + 简化模板,帮你 5 分钟 批量抓取任意公开账号的图片,并自动保存到本地文件夹。

一、先背思路(3 步即可)

  1. 先拿用户 ID:访问 instagram.com/账号名 → 解析 JSON 找到 user_id
  2. 再调 GraphQL:滚动分页拿每 12 张图片的 display_url
  3. 边下载边存盘:按文件名保存到 ./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 持久化
以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号