【Python】指定したURLの見出しを抽出してテキスト出力するプログラムを作ってみた【スクレイピング】

# はじめに
サイトの見出し情報を取得したい！

**Pythonなら簡単にできますよ(^^)**

プログラミング副業挑戦中の **そばごろう** です。

twitter ☛https://twitter.com/sobagoro1

今回はChatGPTにPythonで指定したURLの見出しを抽出してテキストに出力するプログラムを書いてもらう手順をまとめます。
# １．ChatGPTを起動

https://chat.openai.com/
# ２．以下のプロンプトを入力

```markdown
Pythonで以下のプログラムを書いて
１．ポップアップでURLを指定
２．指定したURLの見出し情報（h1～h6）を取得
３．取得した情報を指定してパスにtxtファイルで保存
※処理完了後に入力したURLはクリアして
※txtファイル名は「output_タイムスタンプ.txt」として
※最初のポップアップにスプレイピングについての注意書きを記載して
```

# 3.ChatGPTの返事を確認する
すぐに返答が表示されました。
何回かやり取りして使い勝手が良いプログラムに修正しました。

#### 最終的なソース
```python
import tkinter as tk
from tkinter import messagebox, filedialog
import requests
from bs4 import BeautifulSoup
from datetime import datetime

# URLを指定して見出しを取得する関数
def get_headings():
    url = url_entry.get()
    
    # URLからHTMLコンテンツを取得
    try:
        response = requests.get(url)
        response.raise_for_status()
    except requests.exceptions.RequestException as e:
        messagebox.showerror("エラー", "URLにアクセスできませんでした。")
        return

    soup = BeautifulSoup(response.text, 'html.parser')
    
    # h1〜h6タグの見出しを取得
    headings = [(heading.name, heading.text) for heading in soup.find_all(['h1', 'h2', 'h3', 'h4', 'h5', 'h6'])]
    
    # タイムスタンプを取得
    timestamp = datetime.now().strftime("%Y%m%d%H%M%S")
    
    # ファイルの保存先をユーザーに選択させる
    file_path = filedialog.asksaveasfilename(defaultextension=".txt", filetypes=[("テキストファイル", "*.txt")], initialfile=f"midashiList_{timestamp}")
    
    if file_path:
        with open(file_path, 'w', encoding='utf-8') as file:
            for tag, text in headings:
                file.write(f'[{tag}] {text}\n')
        messagebox.showinfo("完了", "見出しをファイルに保存しました。")
    
    # URL入力フィールドをクリア
    url_entry.delete(0, tk.END)

# GUIを作成
app = tk.Tk()
app.title("Webページの見出し取得")

# 注意文言を表示するラベル
note_text = "注意: ウェブスクレイピングはウェブサイトの利用規約に従う必要があり、許可されている場合のみ行うべきです。\nまた、スクレイピングの頻度を過度に高く設定しないように注意してください。"
note_label = tk.Label(app, text=note_text)
note_label.pack()

url_label = tk.Label(app, text="URLを入力してください:")
url_label.pack()

url_entry = tk.Entry(app, width=50)
url_entry.pack()

get_button = tk.Button(app, text="見出しを取得", command=get_headings)
get_button.pack()

app.mainloop()

```

# ４．作成したプログラムの動作確認
作成したソースをVS Codeで動作確認します。

https://note.com/sobagoro/n/n8ac8dc7a1ce5

### 正常ケースの確認 ###

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565009/2b466877-a9b5-6e63-eebf-b43811a10324.png)

デバッグ実行ボタンを押すとフォルダ選択のポップアップが表示されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565009/6889edf2-c24a-66ce-c31f-e07f5978c911.png)

見出し情報を取得したいURLを入力します。

**注意: ウェブスクレイピングはウェブサイトの利用規約に従う必要があり、許可されている場合のみ行うべきです。また、スクレイピングの頻度を過度に高く設定しないように注意してください。**

noteの自分のクリエイターページを指定しました。

https://note.com/sobagoro

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565009/aa44769d-bc30-9ede-e3b0-fd1d6b4344ae.png)

ポップアップから保管先をフォルダを指定します。

初期ファイル名は「midashiList_タイムスタンプ.txt」で設定されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565009/d68d17b4-f03d-1997-c8c4-6ecd24220c5d.png)

「保存」を押すと、完了メッセージが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565009/abc0b786-557b-fc84-f408-dfbe19cec6a7.png)

指定したパスにtxtファイルが保存されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565009/424e1549-44fe-30a8-83b3-43d3a618acbf.png)

中を開くと見出しの情報が保管されていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565009/60f48766-782b-169a-a8b1-d37b50e91715.png)

重複して出ている行があるので不要な場合はその分を削除する処理を追加するのも良いでしょう。

最初のポップアップのURLがクリアされました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565009/47f347aa-382e-2c12-05f1-144161d27722.png)

### エラーケースの確認 ###

存在しないURLを入力するとエラーのポップアップが表示されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565009/3bcd572b-6f9b-b555-d301-38ca3c8f32b0.png)


以上で動作確認は完了です。

# ５．作成したプログラムのexe化
以前解説した手順で作成したプログラムのexe化します。

https://note.com/sobagoro/n/n96bf2f96026d

今回は４つのライブラリをインストールしました。

##### pip install requests

##### pip install datetime

##### pip install beautifulsoup4

##### pip install pyinstaller

アイコンを指定してexe化するコマンドを実行

##### pyinstaller -F -w --icon=midashi.ico midashiGet.py

exeファイルができました(^^)/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565009/e3130c1d-a42b-5122-cfbc-033c6679755b.png)


exeを実行して動作確認できたら完了です。

# ６．今回できなかったこと

#### ６－１．出力ファイルが文字化けすることがある
一部のサイトで出力した見出しが文字化けしている事がありました（大体のサイトは問題なく稼働）。

出力の前処理でエンコーディングなどを指定すれば回避できるかも知れませんが、今回は解決できませんでしたm(__)m

# まとめ
ChatGPTにPythonで指定したURLの見出しを抽出してテキスト出力するプログラムを書いてもらう手順をまとめました。

##### 同じように勉強中の方の参考になればうれしいです。

#### 私のプロフィール↓ ####

https://note.com/sobagoro/n/nd89ab75a9bd7

https://note.com/sobagoro/n/nedff221f1d54


#### 勉強メモ シリーズ↓ ####

https://note.com/sobagoro/n/nefeb5d79a0a9

https://note.com/sobagoro/n/n05c18c98276d

https://note.com/sobagoro/n/n96bf2f96026d

#### ChatGPTを使ったプログラミング↓ ####

https://note.com/sobagoro/n/n657ee1a518bd

https://note.com/sobagoro/n/n371e9f0b472c


最後まで閲覧ありがとうございましたm(__)m