官方示例 100+ 行看不懂?本文把它拆成 中文注釋 + 簡化模板,幫你 5 分鐘 批量抓取任意公開賬號的圖片,并自動保存到本地文件夾。
instagram.com/賬號名
→ 解析 JSON 找到 user_id
display_url
./instagram_賬號名/
已去掉視頻、故事、登錄等復(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)
}
步驟 | 命令/操作 | 說明 |
---|---|---|
① 安裝 | go mod init ig && go get github.com/gocolly/colly/v2 |
一鍵拉庫 |
② 保存 | 復(fù)制上方代碼 → main.go |
零配置 |
③ 運(yùn)行 | go run main.go codingcat |
抓取 @codingcat 公開圖片 |
? 已下載 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 行 |
---|---|
分頁繼續(xù) | 解析 end_cursor 再調(diào) GraphQL |
存 CSV | 把下載改成寫 CSV 記錄 |
存 Redis | 用隊(duì)列 + Redis 持久化 |
更多建議: