Skip to content

Instantly share code, notes, and snippets.

@sei0o
Last active September 29, 2021 07:05
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sei0o/b3841681246d14ca47b00a78f005cc4e to your computer and use it in GitHub Desktop.
Save sei0o/b3841681246d14ca47b00a78f005cc4e to your computer and use it in GitHub Desktop.
MCC移行後の高専カリキュラムを取得する
//
const fs = require("fs")
const path = require("path")
const puppeteer = require("puppeteer")
async function getSyllabus(browser, schoolId, departmentId, year, lang) {
const page = await browser.newPage()
const url = `https://syllabus.kosen-k.go.jp/Pages/PublicSubjects?school_id=${schoolId}&department_id=${departmentId}&year=${year}&lang=${lang}`
await page.goto(url)
return await page.evaluate(() => {
const trs = document.querySelectorAll("table#sytablenc > tbody tr")
const syllabus = Array.from(trs).map((tr) => {
if (tr.className === "ctop") return null
const row = Array.from(tr.querySelectorAll("td")).map(
(x) => x.innerText || ""
)
if (row === undefined || (row[0] !== "一般" && row[0] !== "専門"))
return null
const general = row[0] === "一般"
const required = row[1] === "必修"
const title = row[2]
const id = parseInt(row[3], 10)
const gakushu = row[4] === "学修単位"
const credit = parseInt(row[5], 10)
const classes = row.slice(6, 26).flatMap((val, i) => {
if (i % 2 == 0) {
return val.length === 0 ? 0 : parseInt(val, 10)
} else {
return []
}
})
const lecturer = row[26]
const notes = row[27] // 履修上の区分
if (title.includes("留学生") || title.includes("海外研修")) return null
return {
general,
required,
title,
id,
gakushu,
credit,
classes,
lecturer,
notes,
}
})
return syllabus.filter((x) => x !== null)
})
}
function save(filename, object) {
console.log(`Saving to ${filename}...`)
const json = JSON.stringify(object, null, " ")
fs.mkdir(path.dirname(filename), { recursive: true }, (err) => {
if (err) console.log(err)
})
fs.writeFile(filename, json, (err, result) => {
if (err) console.log(err)
})
}
!(async () => {
try {
const browser = await puppeteer.launch()
const schoolId = 27 // 明石高専
// 14 for EJ, 13 for ED, 12 for E, 11 for M, 15 for C, 16 for A
// 21 for ME, 22 for AC
const departmentId = process.argv[3]
const year = process.argv[2]
const lang = "ja"
const syllabus = await getSyllabus(
browser,
schoolId,
departmentId,
year,
lang
)
console.log(syllabus)
const path = `./syllabus/${schoolId}_${departmentId}_${year}_${lang}.json`
save(path, syllabus)
browser.close()
} catch (e) {
console.error(e)
}
})()

$ node syllabus.js 2021 14

puppeteerが必要です。引数についてはソースコードを参照してください。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment