Colly 實(shí)戰(zhàn):批量下載 Instagram 公開圖片

2025-07-14 18:05 更新

官方示例 100+ 行看不懂?本文把它拆成 中文注釋 + 簡化模板,幫你 5 分鐘 批量抓取任意公開賬號的圖片,并自動保存到本地文件夾。

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

  1. 先拿用戶 ID:訪問 instagram.com/賬號名 → 解析 JSON 找到 user_id
  2. 再調(diào) GraphQL:滾動分頁拿每 12 張圖片的 display_url
  3. 邊下載邊存盤:按文件名保存到 ./instagram_賬號名/

二、精簡中文代碼(40 行)

已去掉視頻、故事、登錄等復(fù)雜邏輯,僅保留「公開圖片下載」核心功能。

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]


    // 創(chuàng)建收集器
    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 + "/")
}


// 通用下載函數(shù)
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 一鍵拉庫
② 保存 復(fù)制上方代碼 → main.go 零配置
③ 運(yùn)行 go run main.go codingcat 抓取 @codingcat 公開圖片

四、結(jié)果

? 已下載 12 張圖片到 ./instagram_images/codingcat/

目錄結(jié)構(gòu):

instagram_images/
└── codingcat/
    ├── 1234567890123456789_1.jpg
    ├── 1234567890123456789_2.jpg
    └── ...

五、常見問題速查

癥狀 原因 解決
403 Forbidden Instagram 反爬 加 User-Agent / 代理池
0 張圖片 賬號私有或改版 確保公開賬號,更新選擇器
視頻也被下載 未過濾 is_video 已跳過視頻,僅圖片

六、1 分鐘進(jìn)階

需求 改動 1 行
分頁繼續(xù) 解析 end_cursor 再調(diào) GraphQL
存 CSV 把下載改成寫 CSV 記錄
存 Redis 用隊(duì)列 + Redis 持久化
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號