想一鍵爬完 IndonesiaX(或其他 OpenEdX 站點(diǎn))的全部課程?官方示例 70+ 行已精簡成 20 行中文注釋版,復(fù)制即可跑,直接輸出 JSON!
一、整體思路(先背下來)
- 列表頁:從
/courses
開始 → 找所有 /courses/xxx
鏈接
- 詳情頁:解析標(biāo)題、起止時(shí)間、課程號(hào)等字段
- 結(jié)果輸出:一次性導(dǎo)出 JSON,Excel 直接打開
二、精簡中文代碼(20 行)
package main
import (
"encoding/json"
"fmt"
"strings"
"time"
"github.com/gocolly/colly/v2"
)
// 課程結(jié)構(gòu)體
type Course struct {
CourseID string `json:"課程ID"`
Name string `json:"課程名稱"`
Number string `json:"課程編號(hào)"`
StartDate *time.Time `json:"開始時(shí)間"`
EndDate *time.Time `json:"結(jié)束時(shí)間"`
URL string `json:"課程鏈接"`
}
func main() {
c := colly.NewCollector(
colly.AllowedDomains("www.indonesiax.co.id", "indonesiax.co.id"),
colly.CacheDir("./cache"), // 斷點(diǎn)續(xù)爬
)
var courses []Course
// 1. 課程列表頁 → 進(jìn)入詳情
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. 啟動(dòng)
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 |
一鍵拉庫 |
② 保存文件 |
復(fù)制上方代碼 → main.go |
零配置 |
③ 一鍵爬取 |
go run main.go > courses.json |
生成 JSON,可導(dǎo)入 Excel |
四、結(jié)果示例(courses.json)
[
{
"課程ID": "course-v1:ITB+CS101+2024_T1",
"課程名稱": "Pemrograman Dasar",
"課程編號(hào)": "CS101",
"開始時(shí)間": "2024-01-15T00:00:00Z",
"結(jié)束時(shí)間": "2024-05-15T00:00:00Z",
"課程鏈接": "https://www.indonesiax.co.id/courses/course-v1:ITB+CS101+2024_T1"
}
// …更多課程
]
五、常見問題速查
癥狀 |
原因 |
解決 |
0 條數(shù)據(jù) |
選擇器失效 |
瀏覽器 F12 更新 .course-title 等 |
日期解析失敗 |
格式變化 |
改 time.Parse("2006-01-02", ...) |
403 被攔截 |
缺 UA / 反爬 |
加 colly.UserAgent("...") |
六、1 分鐘換站
目標(biāo)站點(diǎn) |
改動(dòng) 2 處 |
edX.org |
把域名和 /courses 換成 www.edx.org/courses |
慕課中國 |
域名 + 選擇器同步調(diào)整 |
更多建議: