Colly 實戰(zhàn):一鍵爬取 Coursera 全站課程

2025-07-14 17:36 更新

把官方 100+ 行示例拆成 3 步 30 行代碼,中文注釋 + 選擇器速查,零基礎(chǔ)也能 5 分鐘導(dǎo)出 Coursera 課程清單 JSON!

一、整體思路(先背下來)

  1. 列表收集器:只爬 /browse → 拿到所有課程鏈接
  2. 詳情收集器:深度爬 /learn/xxx → 解析標(biāo)題、評分、語言等
  3. 結(jié)果輸出:一次性導(dǎo)出 JSON,Excel 直接打開

二、完整代碼(中文注釋)

package main


import (
    "encoding/json"
    "log"
    "os"
    "strings"


    "github.com/gocolly/colly/v2"
)


// 課程結(jié)構(gòu)體(字段與官網(wǎng)一一對應(yīng))
type Course struct {
    Title       string `json:"課程標(biāo)題"`
    URL         string `json:"課程鏈接"`
    Description string `json:"簡介"`
    Creator     string `json:"講師"`
    Language    string `json:"語言"`
    Level       string `json:"難度"`
    Commitment  string `json:"時長"`
    HowToPass   string `json:"考核方式"`
    Rating      string `json:"評分"`
}


func main() {
    // 1. 列表收集器:負(fù)責(zé)翻頁
    listC := colly.NewCollector(
        colly.AllowedDomains("coursera.org", "www.coursera.org"),
        colly.CacheDir("./cache"), // 斷點(diǎn)續(xù)爬
    )


    // 2. 詳情收集器:負(fù)責(zé)解析
    detailC := listC.Clone()


    var courses []Course


    /* ---------- 列表頁邏輯 ---------- */
    // 找到課程卡片 → 觸發(fā)詳情收集器
    listC.OnHTML(`a[href*="coursera.org/learn"]`, func(e *colly.HTMLElement) {
        courseURL := e.Request.AbsoluteURL(e.Attr("href"))
        detailC.Visit(courseURL)
    })


    /* ---------- 詳情頁邏輯 ---------- */
    detailC.OnHTML(`div[id=rendered-content]`, func(e *colly.HTMLElement) {
        c := Course{
            Title:       strings.TrimSpace(e.ChildText(".course-title")),
            URL:         e.Request.URL.String(),
            Description: strings.TrimSpace(e.ChildText("div.content")),
            Creator:     strings.TrimSpace(e.ChildText("div.creator-names > span")),
        }


        // 解析表格里的元數(shù)據(jù)
        e.ForEach("table.basic-info-table tr", func(_ int, el *colly.HTMLElement) {
            key := strings.TrimSpace(el.ChildText("td:first-child"))
            val := strings.TrimSpace(el.ChildText("td:nth-child(2)"))
            switch key {
            case "Language":
                c.Language = val
            case "Level":
                c.Level = val
            case "Commitment":
                c.Commitment = val
            case "How To Pass":
                c.HowToPass = val
            case "User Ratings":
                c.Rating = val
            }
        })


        courses = append(courses, c)
    })


    /* ---------- 啟動 ---------- */
    listC.Visit("https://coursera.org/browse")


    // 輸出漂亮 JSON
    enc := json.NewEncoder(os.Stdout)
    enc.SetIndent("", "  ")
    enc.Encode(courses)
}

三、3 步運(yùn)行

步驟 命令/操作 說明
① 安裝依賴 go mod init coursera && go get github.com/gocolly/colly/v2 一鍵拉庫
② 保存文件 復(fù)制上方代碼 → main.go 零配置
③ 一鍵爬取 go run main.go > coursera.json 生成 JSON,Excel 直接導(dǎo)入

四、選擇器速查表(F12 對照即用)

數(shù)據(jù) 選擇器
課程標(biāo)題 .course-title
簡介 div.content
講師 div.creator-names > span
語言/難度等 table.basic-info-table tr

五、常見問題 30 秒排查

癥狀 原因 解決
0 條數(shù)據(jù) 頁面改版或反爬 更新選擇器 / 加 User-Agent
爬得慢 未開異步 colly.Async(true) + Limit
內(nèi)存爆炸 列表太多 用 queue.New() 分批

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

需求 改動 1 行
導(dǎo)出 CSV 把 JSON 編碼換成 csv.NewWriter
登錄態(tài) 先 c.Post("/login", data) 再爬
分布式 把 cache 換成 Redis(見 Redis 教程)
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號