情報処理安全確保支援士試験の過去問をダウンロードしたい

# 高度情報安全確保支援士資格の過去問題をスクレイピングで一括ダウンロード
最近、情報処理安全確保支援士の勉強を始めました。
午前Ⅱ試験は[過去問道場](https://www.sc-siken.com/sckakomon.php)で、午後試験は **2025　情報処理安全確保支援士「専門知識+午後問題」の重点対策**で勉強しています。

午後問題の参考書では過去問題をIPAのサイトからダウンロードして勉強すべしとのことでした。
過去問題を一つずつダウンロードするのは面倒なので、スクレイピングを利用して一括ダウンロードを行います！

## 参考記事
以下の記事を参考にしました。  
[情報処理技術者試験の過去問スクレイピング](https://qiita.com/akita0724/items/694cc4e142d8d1d7fdaa)

## 試験制度の変更について
情報処理安全確保支援士試験の午後問題は **2023年春試験までは午後1・午後2に分かれていました** が、**2023年秋試験以降は午後問題が1つに統合されました**。

## スクレイピングコード
以下のPythonコードを使用して、過去問PDFをダウンロードします。

```python
from os import makedirs, path
from time import sleep
from urllib.request import urlretrieve

# 西暦を和暦に変換する関数
def seireki_to_wareki(year):
    eras = [
        (2019, "令和"),
        (1989, "平成"),
        (1926, "昭和"),
        (1912, "大正"),
        (1868, "明治"),
    ]
    for start, era_name in eras:
        if year >= start:
            era_year = year - start + 1
            return f"{era_name}{'元' if era_year == 1 else era_year}年"
    return "対応範囲外の年です"

# ダウンロード対象の試験情報
ids = [
    ["m42obm000000afqx-att", "2024r06a_sc_"],
    ["m42obm000000afqx-att", "2024r06h_sc_"],
    ["ps6vr70000010d6y-att", "2023r05a_sc_"],
    ["ps6vr70000010d6y-att", "2023r05h_sc_"],
    ["gmcbt80000008smf-att", "2022r04a_sc_"],
    ["gmcbt80000009sgk-att", "2022r04h_sc_"],
    ["gmcbt8000000apad-att", "2021r03a_sc_"],
    ["gmcbt8000000d5ru-att", "2021r03h_sc_"],
    ["gmcbt8000000d05l-att", "2020r02o_sc_"],
    ["gmcbt8000000dict-att", "2019r01a_sc_"],
    ["gmcbt8000000ddiw-att", "2019h31h_sc_"],
    ["gmcbt8000000f01f-att", "2018h30a_sc_"],
    ["gmcbt8000000fabr-att", "2018h30h_sc_"],
    ["gmcbt8000000fqpm-att", "2017h29a_sc_"],
    ["gmcbt8000000fzx1-att", "2017h29h_sc_"],
    ["gmcbt8000000g6fw-att", "2016h28a_sc_"],
    ["gmcbt8000000gn5o-att", "2016h28h_sc_"],
    ["gmcbt8000000gxj0-att", "2015h27a_sc_"],
    ["ug65p90000000f52-att", "2015h27h_sc_"],
    ["ug65p90000000ye5-att", "2014h26a_sc_"],
    ["ug65p90000001dzu-att", "2014h26h_sc_"],
    ["ug65p900000027za-att", "2013h25a_sc_"],
    ["ug65p90000002e6g-att", "2013h25h_sc_"],
    ["ug65p90000002h5m-att", "2012h24a_sc_"],
    ["ug65p900000038er-att", "2012h24h_sc_"],
    ["ug65p90000003ojp-att", "2011h23a_sc_"],
    ["ug65p90000003ya2-att", "2011h23tokubetsu_sc_"],
    ["ug65p90000004d6f-att", "2010h22a_sc_"],
    ["ug65p90000004n2z-att", "2010h22h_sc_"],
    ["gmcbt8000000f3yi-att", "2009h21a_sc_"],
    ["ug65p90000009bhl-att", "2009h21h_sc_"]]
]

# 2023年秋以降とそれ以前で異なる問題構成
fileTypes_old = [["pm1_qs", "pm1_ans", "pm2_qs", "pm2_ans"],
                 ["PM1_問題", "PM1_解答", "PM2_問題", "PM2_解答"]]
fileTypes_recent = [["pm_qs", "pm_ans"],
                     ["PM_問題", "PM_解答"]]

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

for id in ids:
    seireki = (id[1])[:4]
    wareki = seireki_to_wareki(int(seireki))

    if int(seireki) == 2024:
        fileTypes = fileTypes_recent
    elif int(seireki) == 2023 and (id[1])[7] == "a":
        fileTypes = fileTypes_recent
    else:
        fileTypes = fileTypes_old

    # 季節の判定
    filetmp = (id[1])[7]
    filetmp = "春季" if filetmp == "h" else "秋季" if filetmp == "a" else "特別"

    # 保存先ディレクトリ作成
    createDir = f"./sc/{(id[1])[0:4]}_{str(wareki)}/{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]}-{str(wareki)}.pdf"
        print(url)
        urlretrieve(url, f"{createDir}/{filen}")
        print(f"{filen} saved successfully.")
        sleep(3)

print("ok")
```

## コードのポイント
1. **和暦変換関数** (`seireki_to_wareki`) を使って西暦を和暦表記に変換 ←西暦和暦ともに確認できたほうが見やすいため。
2. **試験年度と季節（春・秋・特別）を識別**  
3. **IPAの試験問題URLを構築** し、スクレイピングでPDFを一括ダウンロード  
4. **ファイルを適切なディレクトリに分類し保存**  
5. **ダウンロード間隔に `sleep(3)` を挿入**（アクセス過多防止）  

## 注意点
- IPAのサイトの仕様変更があると、URLパターンが変わる可能性があります。  
- サーバーに過剰な負荷をかけないよう、適切な間隔を設けてダウンロードしましょう。  
- また、実際に実行する際はIPAの利用規約を確認しましょう。

---

以上の方法で、 **一括ダウンロード** できます。
他の高度試験をダウンロードしたい場合は、試験の大問数が異なるので適宜書き換えてましょう。
資格勉強は過去問題が大事だと思うので、ともに勉強頑張りましょう。