この記事は 茨大 Advent Calendar 2021 11日目の記事です。
他の記事はこちら
ドリカスのシラバス検索に立ち向かったお話
素人がいろいろ適当に書いてるのでまさかり投げないでね

はじめに

茨大工学電電1年の加尾須と申します(少なくとも大学垢はそんな名前),今回はシラバス検索にブチギレてなんとか便利な方法を模索した話をさせていただきます.
いろいろ適当に書いてるので,変なところや間違ったところがあっても気にしないでください.また,記事の内容を実行した際に発生した問題について一切の責任を負いません. 大学のサーバーに要求を投げます,やらかすとそれなりの確立で怒られその他が発生する可能性があります.

問題は後期基盤科目事前登録のとき

学務から公開されたリストを見て,シラバスを確認しながら事前登録のアンケートに回答,多分茨大21なら皆やったことがあるはず. けどシラバス検索には,\

  • 基盤科目の対象学部指定が出来ない
  • シラバスコード,ナンバリングでの一括検索が出来ない
  • ナンバリングがナンバリングと呼べたものではない(個人の感想です)
  • etc…
    といった問題がある.

正直言って使ってらんねえ ただ基盤科目は基本連番でシラバスコードが割り当てられるため,足搔きようがありそう.

そうだ!スクレイピングしよう

ここからが本題,とりあえずシラバス検索を分析しよう.
一般に西暦hoge年度,シラバスコードpiyoのシラバスのURLは

https://idc.ibaraki.ac.jp/Portal/Public/Syllabus/DetailMain.aspx?lct_year=hoge&lct_cd=piyo&je_cd=1

となっている,ちなみにje_cdの値は2にすると英語版が表示されヘッダの青いところがピンク色になる(あまりに差分がなさ過ぎて最初色が変わるだけだと思った). あとは各内容はspan要素内にあるのでidで検索すればよさげ.(シラバスページの生成の仕組みを想像すれば自明な気がしないでもない)

テキトーに実装

ここまで来ればまあ容易である.コーディングなんてやってらんないのでライブラリに丸投げである,私は情報系ではないのだ. beautifulsoup使えば楽でいいとgoogle先生が教えてくれたので言語にはpythonを選定,諸事情によりお手軽にExcelで開けるcsv形式での入出力とした. ひとまず基盤科目向けにシラバスコードはすべてKBで始まることとした.

import urllib.request, urllib.error
from bs4 import BeautifulSoup
import csv

def scrape(classcode):
    classcode ="KB"+classcode
    #アクセス先指定
    url ="https://idc.ibaraki.ac.jp/Portal/Public/Syllabus/DetailMain.aspx?lct_year=2021&je_cd=1&lct_cd="+str(classcode)
    print(url)
    #内容を記録する配列の作成。
    csvlist = []
    
    #URLを開く
    html = urllib.request.urlopen(url)
    # BeautifulSoupで利用するパーサ指定
    #soup = BeautifulSoup(html, "html.parser")
    soup = BeautifulSoup(html, "lxml")


    #soup.find('span',id=).text
    #hogeをお好みのidで置換する.適宜増やす.
    csvlist.append(str(soup.find('span',id="hoge").text))

    # CSVファイルを開く。ファイルがなければ新規作成する。
    f = open("piyo.csv", "a")
    writecsv = csv.writer(f, lineterminator='\n')

    #CSVに出力
    writecsv.writerow(csvlist)

    # CSVファイルを閉じる。
    f.close()


#CSVファイルを開く
f = open('./piyo.csv','r')
csvfile = csv.reader(f)
#定義したscrapeを走らせる
for i in range(0,len(csvfile)):
    scrape(str(csvfile[i])) 

今回の反省点

反省点としては以下がある,

  1. 外部でリストを作成する必要がある
  2. ゆーて実行速くない
  3. 検索まで手が回ってない
  4. そもそもあまり賢いコードが書けてない

1についてはfor文でいいなと後から気づいたがどのみち専門科目となるとそうはいかないしので何か解決策が要りそう.(A,B班で分かれている講義にはシラバスコードに-Aがついてるなど) 2については相手先のレスポンスが速くないのでどうしようもない.3はいろいろクエリの投げ方に工夫が要りそうなので時間があったらそのうちやってみたい.4は逐次ではなく一括で保存した方がよさげ.(未検証)

付録-idのリスト(不完全)

内容ID
時間割コードctl00_phContents_sylSummary_txtLctCd_lbl
ナンバリングctl00_phContents_sylSummary_txtNumbering_lbl
科目名ctl00_phContents_sylSummary_txtSbjName_lbl
題目ctl00_phContents_ucSylContents_cateTitle_lblNormal
担当教員ctl00_phContents_sylSummary_txtStaffName_link_lbl
開講時間ctl00_phContents_sylSummary_txtDayPeriod_lbl
対象学科ctl00_phContents_sylSummary_txtTermName_lbl
対象学年ctl00_phContents_sylSummary_txtPeriod_lbl
単位数ctl00_phContents_sylSummary_txtCredits_lbl