Colly 实战:一键爬取 Coursera 全站课程

2025-07-14 17:36 更新

把官方 100+ 行示例拆成 3 步 30 行代码,中文注释 + 选择器速查,零基础也能 5 分钟导出 Coursera 课程清单 JSON!

一、整体思路(先背下来)

  1. 列表收集器:只爬 /browse → 拿到所有课程链接
  2. 详情收集器:深度爬 /learn/xxx → 解析标题、评分、语言等
  3. 结果输出:一次性导出 JSON,Excel 直接打开

二、完整代码(中文注释)

package main


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


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


// 课程结构体(字段与官网一一对应)
type Course struct {
    Title       string `json:"课程标题"`
    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. 列表收集器:负责翻页
    listC := colly.NewCollector(
        colly.AllowedDomains("coursera.org", "www.coursera.org"),
        colly.CacheDir("./cache"), // 断点续爬
    )


    // 2. 详情收集器:负责解析
    detailC := listC.Clone()


    var courses []Course


    /* ---------- 列表页逻辑 ---------- */
    // 找到课程卡片 → 触发详情收集器
    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")),
        }


        // 解析表格里的元数据
        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 步运行

步骤 命令/操作 说明
① 安装依赖 go mod init coursera && go get github.com/gocolly/colly/v2 一键拉库
② 保存文件 复制上方代码 → main.go 零配置
③ 一键爬取 go run main.go > coursera.json 生成 JSON,Excel 直接导入

四、选择器速查表(F12 对照即用)

数据 选择器
课程标题 .course-title
简介 div.content
讲师 div.creator-names > span
语言/难度等 table.basic-info-table tr

五、常见问题 30 秒排查

症状 原因 解决
0 条数据 页面改版或反爬 更新选择器 / 加 User-Agent
爬得慢 未开异步 colly.Async(true) + Limit
内存爆炸 列表太多 用 queue.New() 分批

六、1 分钟进阶

需求 改动 1 行
导出 CSV 把 JSON 编码换成 csv.NewWriter
登录态 先 c.Post("/login", data) 再爬
分布式 把 cache 换成 Redis(见 Redis 教程)
以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号