応用情報技術者試験の過去問を全取得する

R5秋期のAP直前なので(直前すぎますがw)過去問をしようということになりました。

でも、一つ一つダウンロードするのは面倒くさい！ということでPythonを使って一括ダウンロードしてみました
同様の記事はたくさんありますが、IPAのホームページが最近更新された影響でその方法ではできなくなってるっぽいので新たに書いてみました。
# 全体のソースコード
全体のソースコードはこんな感じです
```
from os import makedirs, path
from time import sleep
from urllib.request import urlretrieve

ids = [
    ["ps6vr70000010d6y-att", "2023r05h_ap_"],
    ["gmcbt80000008smf-att", "2022r04a_ap_"],
    ["gmcbt80000009sgk-att", "2022r04h_ap_"],
    ["gmcbt8000000apad-att", "2021r03a_ap_"],
    ["gmcbt8000000d5ru-att", "2021r03h_ap_"],
    ["gmcbt8000000d05l-att", "2020r02o_ap_"],
    ["gmcbt8000000dict-att", "2019r01a_ap_"],
    ["gmcbt8000000ddiw-att", "2019h31h_ap_"],
    ["gmcbt8000000f01f-att", "2018h30a_ap_"],
    ["gmcbt8000000fabr-att", "2018h30h_ap_"],
    ["gmcbt8000000fqpm-att", "2017h29a_ap_"],
    ["gmcbt8000000fzx1-att", "2017h29h_ap_"],
    ["gmcbt8000000g6fw-att", "2016h28a_ap_"],
    ["gmcbt8000000gn5o-att", "2016h28h_ap_"],
    ["gmcbt8000000gxj0-att", "2015h27a_ap_"],
    ["ug65p90000000f52-att", "2015h27h_ap_"],
    ["ug65p90000000ye5-att", "2014h26a_ap_"],
    ["ug65p90000001dzu-att", "2014h26h_ap_"],
    ["ug65p900000027za-att", "2013h25a_ap_"],
    ["ug65p90000002e6g-att", "2013h25h_ap_"],
    ["ug65p90000002h5m-att", "2012h24a_ap_"],
    ["ug65p900000038er-att", "2012h24h_ap_"],
    ["ug65p90000003ojp-att", "2011h23a_ap_"],
    ["ug65p90000003ya2-att", "2011h23tokubetsu_ap_"],
    ["ug65p90000004d6f-att", "2010h22a_ap_"],
    ["ug65p90000004n2z-att", "2010h22h_ap_"],
    ["gmcbt8000000f3yi-att", "2009h21a_ap_"],
    ["ug65p90000009bhl-att", "2009h21h_ap_"]]

fileTypes = [["am_qs", "am_ans", "pm_qs", "pm_ans"],
             ["AM_問題", "AM_解答", "PM_問題", "PM_解答"]]

baseUrl = "https://www.ipa.go.jp/shiken/mondai-kaiotu/"

for id in ids:
    # 季節を特定する
    filetmp = (id[1])[7]
    if filetmp == "h":
        filetmp = "春季"
    elif filetmp == "a":
        filetmp = "秋季"
    else:
        filetmp = "特別"
    createDir = f"./ap/{(id[1])[0:4]}/{filetmp}"
    # ディレクトリが存在するか判定
    if not path.exists(createDir):
        makedirs(createDir)

    for i, fileType in enumerate(fileTypes[0]):
        url = f"{baseUrl}{id[0]}/{id[1]}{fileType}.pdf"
        filen = f"{(id[1])[0:4]}{filetmp}-{fileTypes[1][i]}.pdf"
        urlretrieve(url, f"{createDir}/{filen}")
        print(f"{filen} saved successflly.")
        sleep(3)
print("ok")

```
# 応用方法
過去問のリンクは以下の形式なので、
h ttps://www.ipa.go.jp/shiken/mondai-kaiotu/{①}/{②}{③}{④}\_{⑤}\_{⑥}\_{⑦}.pdf

1.  年度に固有な文字列
    上記コードの「ids」各要素の0番地の文字列
2.  西暦
3.  和暦
    令和5年→r05、平成22年→h22にする
4.  季節
    |季節|URLの文字|
    |:--:|:--:|
    |春季|s|
    |秋季|a|
    |特別試験|tokubetsu|
5.  試験区分
    |試験区分|URLの文字|
    |:--:|:--:|
    |応用情報技術者試験|ap|
    |ITストラテジスト試験|st|
    |システムアーキテクト試験|sa|
    |プロジェクトマネージャ試験|pw|
    |ネットワークスペシャリスト試験|nw|
    |データベーススペシャリスト試験|db|
    |エンベデッドシステムスペシャリスト試験|es|
    |ITサービスマネージャ試験|sm|
    |システム監査技術者試験|au|
    |情報処理安全確保支援士試験|sc|

    ただし、高度試験の午前Iは全て同じなので、「koudo」を指定
    試験によって実施しない回があるのでその辺りの処理は必要です
6.  時間帯
    |時間帯|URLの文字|
    |:--:|:--:|
    |午前|am|
    |午後|pm|
    |午前I(高度共通)|am1|
    |午前Ⅱ|am2|
    |午後I|pm1|
    |午後Ⅱ|pm2|
7.  種類
    |種類|URLの文字|
    |:--:|:--:|
    |問題|qs|
    |解答|ans|
    |採点講評|cmnt|

使っていただけると幸いです！