把官方 100+ 行示例拆成 3 步 30 行代码,中文注释 + 选择器速查,零基础也能 5 分钟导出 Coursera 课程清单 JSON!
一、整体思路(先背下来)
- 列表收集器:只爬
/browse
→ 拿到所有课程链接
- 详情收集器:深度爬
/learn/xxx
→ 解析标题、评分、语言等
- 结果输出:一次性导出 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 教程) |
更多建议: