PANOS不具合の効率的な解析: ウェブスクレイピングとGPTAPIを活用したツールの開発

# 作成経緯
最近Paloalto 製品のファームアップをすることが多くそのたびに対象のOS を適用して問題ないか、いちいちExcelに転記して翻訳して全部抽出する作業をやってました。

１つのバージョンを調べるだけでも不具合は７０件前後あるので、かなり労力がかかり退屈な作業であんまり好きではありませんでした。

というわけで情報収集、翻訳、Excel作成をウェブスクレイピングで自動化してしまおうと思い作成しました。

# 既知不具合のページ  

![sc1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533083/eedd3419-31f7-78f4-f983-c6dd3376d26b.png)



[pan-os10.2.6 Known Issue](https://docs.paloaltonetworks.com/pan-os/10-2/pan-os-release-notes/pan-os-10-2-6-known-and-addressed-issues/pan-os-10-2-6-known-issues)  

不具合番号と内容が書かれてあるものです。
これを一個一個読んで、不具合の対象なのか、対象なら何が起きてどんな対処が必要なのかを調べます。
英語得意な人ならまだしも、苦手な人は蕁麻疹でちゃいますね。

# 実際に作成したコード

```Python
from bs4 import BeautifulSoup
from html.parser import HTMLParser
from urllib.request import urlopen
import os
import openai
import openpyxl
from openai.api_resources.abstract.engine_api_resource import EngineAPIResource
import time


def ChatAIConnect(prompt):
    EngineAPIResource.class_url = lambda a, b, c: ""

    openai.api_type = "azure"
    openai.api_key = OPENAI_API_KEY
    openai.api_base = OPENAI_BASE
    openai.api_version = "2023-05-15"

    chat_completion = openai.ChatCompletion.create(
        deployment_id="",
        model="",
        messages=[
            {"role": "user", "content": "次の文章を翻訳してください。翻訳した内容のみ出力してください。" + prompt},
        ]
    )

    return chat_completion.choices[0].message.content


def main():
    # 現在のUNIX時間を取得
    current_unix_time = int(time.time())

    # ページの取得
    # ex) url = "https://docs.paloaltonetworks.com/pan-os/10-2/pan-os-release-notes/pan-os-10-2-6-known-and-addressed-issues/pan-os-10-2-6-known-issues"

    url = input("\n\nスクレイピングするknown-issuesのURLを入力してください \n>> ")
    if url == "":
        print("URLが入力されていません…処理を終了します。")
        exit()

    html = urlopen(url)
    soup = BeautifulSoup(html, "html.parser")

    # ページ内のテーブル⓪番目を取得。# trタグを取得
    table = soup.findAll("table")[0]
    rows_data = table.findAll("tr")

    # 出力先のExcelファイルを指定、ワークブックを指定
    base_file_path = "format.xlsx"
    workbook = openpyxl.load_workbook(base_file_path)

    # フォーマットをシート名を変更してコピー、先頭に移動させる
    sheet = workbook.copy_worksheet(workbook["format"])
    sheet.title = url[115:]
    workbook.move_sheet(sheet, offset=-1)

    # 取得したデータ
    for i, row_data in enumerate(rows_data):
        issue_id = None
        description = None
        desc_translated = None

        for j, data in enumerate(row_data.find_all(["td", "th"])):
            # 先頭行はヘッダーなので回避
            if i == 0:
                continue

            # td 要素の中から b タグを探す
            if j == 0:
                issue_id = data.find("b").text.strip()

            # DESCRIPTION を取得
            elif j == 1:
                description = data.text.strip()
                # デバッグ用
                print("\n" + "-" * 50)
                print("【", issue_id, "】", i, "/", int(len(rows_data)) - 1)
                print(description[:100], "...")

                # ChatAIにdescription内容を翻訳させる(翻訳不要ならコメントアウト)
                desc_translated = ChatAIConnect(description)

            # B列（Issue ID列）に書き込み
            sheet.cell(row=i + 2, column=3, value=issue_id)

            # C列（Description列）に書き込み
            sheet.cell(row=i + 2, column=4, value=description)

            # D列（日本語訳列）に書き込み
            sheet.cell(row=i + 2, column=5, value=desc_translated)

    workbook.save(url[115:] + "_" + str(current_unix_time) + ".xlsx")
    print("\nDone !!\n")


if __name__ == "__main__":
    main()

```

用意したエクセルフォーマットを開き、シートをリネームしてコピー。
![f.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533083/a0153b2b-d569-48e6-8354-fb99bd174b6a.png)


BS4でリンク先のテーブルを取得し、ループでテーブルの中身を取り出して、都度ChatGPT に翻訳させています。

最後にIssue番号、Description、翻訳結果を書き込む処理をして、別ファイル名で出力します。

# 実行
![res1-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533083/d47fb5d0-c6cf-5253-32d2-e2aaaa19386b.png)

![res2-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533083/62c6cea6-1bda-793e-abfa-7b1ecc2d9953.png)

プロンプトで調査対象のリンクを投げるだけでOKです。

# 実行結果

![res3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533083/c81cbd67-0059-a221-2026-7a31b578bffe.png)
普通に作業したら３，４時間はかかるところ、10分もかからず完了します。

# 所感

調査したいリンクを投げて、待つだけなので非常に楽になりました。特に複数のバージョンを調査する場合により効果を発揮します。

OS 選定に時間を取られることがなくなり、この作業に対する精神的な辛さの軽減になりました。筆者はおっちょこちょいなので転記ミスが起きないのが良い。

本ツールではChatGPTのAPIキーが必要ですが、持ってない場合は翻訳処理をコメントアウトするか、精度は落ちますがDeepLのAPIに置き換えても使えます。