Colly 实战:批量抓取 OpenEdX 课程信息
2025-07-14 18:19 更新
想一键爬完 IndonesiaX(或其他 OpenEdX 站点)的全部课程?官方示例 70+ 行已精简成 20 行中文注释版,复制即可跑,直接输出 JSON!
一、整体思路(先背下来)
- 列表页:从
/courses
开始 → 找所有/courses/xxx
链接 - 详情页:解析标题、起止时间、课程号等字段
- 结果输出:一次性导出 JSON,Excel 直接打开
二、精简中文代码(20 行)
package main
import (
"encoding/json"
"fmt"
"strings"
"time"
"github.com/gocolly/colly/v2"
)
// 课程结构体
type Course struct {
CourseID string `json:"课程ID"`
Name string `json:"课程名称"`
Number string `json:"课程编号"`
StartDate *time.Time `json:"开始时间"`
EndDate *time.Time `json:"结束时间"`
URL string `json:"课程链接"`
}
func main() {
c := colly.NewCollector(
colly.AllowedDomains("www.indonesiax.co.id", "indonesiax.co.id"),
colly.CacheDir("./cache"), // 断点续爬
)
var courses []Course
// 1. 课程列表页 → 进入详情
c.OnHTML(`a[href^="/courses/"]`, func(e *colly.HTMLElement) {
e.Request.Visit(e.Attr("href"))
})
// 2. 详情页解析
c.OnHTML(`.course-info`, func(e *colly.HTMLElement) {
title := strings.TrimSpace(strings.Split(e.ChildText(".course-title"), "\n")[0])
id := e.ChildAttr("input[name=course_id]", "value")
start, _ := time.Parse("Jan 02, 2006", e.ChildText(".start-date"))
end, _ := time.Parse("Jan 02, 2006", e.ChildText(".final-date"))
courses = append(courses, Course{
CourseID: id,
Name: title,
Number: e.ChildText(".course-number"),
StartDate: &start,
EndDate: &end,
URL: "https://www.indonesiax.co.id/courses/" + id,
})
})
// 3. 启动
c.Visit("https://www.indonesiax.co.id/courses")
// 4. 输出 JSON
jsonData, _ := json.MarshalIndent(courses, "", " ")
fmt.Println(string(jsonData))
}
三、3 步跑通
步骤 | 命令/操作 | 说明 |
---|---|---|
① 安装依赖 | go mod init openedx && go get github.com/gocolly/colly/v2 |
一键拉库 |
② 保存文件 | 复制上方代码 → main.go |
零配置 |
③ 一键爬取 | go run main.go > courses.json |
生成 JSON,可导入 Excel |
四、结果示例(courses.json)
[
{
"课程ID": "course-v1:ITB+CS101+2024_T1",
"课程名称": "Pemrograman Dasar",
"课程编号": "CS101",
"开始时间": "2024-01-15T00:00:00Z",
"结束时间": "2024-05-15T00:00:00Z",
"课程链接": "https://www.indonesiax.co.id/courses/course-v1:ITB+CS101+2024_T1"
}
// …更多课程
]
五、常见问题速查
症状 | 原因 | 解决 |
---|---|---|
0 条数据 | 选择器失效 | 浏览器 F12 更新 .course-title 等 |
日期解析失败 | 格式变化 | 改 time.Parse("2006-01-02", ...) |
403 被拦截 | 缺 UA / 反爬 | 加 colly.UserAgent("...") |
六、1 分钟换站
目标站点 | 改动 2 处 |
---|---|
edX.org | 把域名和 /courses 换成 www.edx.org/courses |
慕课中国 | 域名 + 选择器同步调整 |
以上内容是否对您有帮助:
更多建议: