Pythonを使ったスクレイピング実例：h3タグを抽出するステップバイステップガイド

## はじめに
今回は、Pythonを使って指定されたWebページからh3タグの情報をスクレイピングする方法を紹介します。実際に試してみる中でエラーに遭遇したことも含めて、その解決までの道のりをまとめます。

自分への備忘録も兼ねて、記事として整理していきます。

## スクレイピングとは？
スクレイピングとは、Webページから特定のデータをプログラムで抽出する技術です。

![スクリーンショット 2024-10-23 22.15.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/2dfa6ef5-f280-ed34-2eab-1717de0300d0.png)
引用画像：https://qiita.com/Octoparse_Japan/items/3a766a5615d82674b873

これを使うと、自動的にウェブ上の情報を収集できるため、データ分析やリサーチに役立てることができます。

https://qiita.com/Octoparse_Japan/items/3a766a5615d82674b873

## 要注意：スクレイピングは許可されているか？
スクレイピングを行う前に、必ずそのサイトの利用規約やrobots.txtファイルを確認し、スクレイピングが許可されているか確認する必要があります。

:::note alert
違法にデータを取得することはトラブルの原因となるため、事前に必ず確認しましょう。
**・利用規約を確認する**
**・robots.txtファイルで許可されているか調べる**
:::

**多くのサイトでは、スクレイピング行為を禁止している場合があります。**

## スクレイピングに使うライブラリ
:::note
今回使用する主なPythonライブラリは以下の2つです。
・``requests``: ウェブページのHTMLデータを取得するライブラリ
・``BeautifulSoup4``: 取得したHTMLデータを解析し、特定のタグや情報を抽出するライブラリ
:::

## パッケージのインストール
まず、これらのライブラリがインストールされていない場合は、以下のコマンドでインストールします。

```bash
pip install requests beautifulsoup4
```

## スクレイピングのコード
次に、実際のスクレイピングコードを紹介します。今回は指定されたウェブページからh3タグをすべて抽出し、そのテキストを表示するプログラムです。

```test.py
import requests
from bs4 import BeautifulSoup

# URLを設定
url = 'https://metrosisetu.com/echo-show-15/'

# ページを取得
response = requests.get(url)

# ページ内容をパース
soup = BeautifulSoup(response.content, 'html.parser')

# 全てのh3タグを取得
h3_tags = soup.find_all('h3')

# h3タグのテキストを表示
for h3 in h3_tags:
    print(h3.get_text())
```

:::note alert
ここでスクレイピングしているサイトは、私が過去に運用していたサイトのブログ記事です。
:::

### コードの説明
**``requests.get(url)``**
指定したURLにHTTPリクエストを送り、ウェブページのHTMLデータを取得します。

**``BeautifulSoup(response.content, 'html.parser')``**
取得したHTMLデータをBeautifulSoupで解析し、構造化された形式に変換します。

**``soup.find_all('h3')``**
ページ内のすべてのh3タグを抽出します。

**``print(h3.get_text())``**
各h3タグ内のテキストを取り出して表示します。

## 実際に実行してみた結果
初めてこのコードを実行した際、以下のエラーが発生しました。

```bash
python test.py
```

実際のエラー内容は省略していますが、以下のようなエラーが表示されました。

```bash
ModuleNotFoundError: No module named 'chardet'
```

### エラーの原因と解決策
調査の結果、これはrequestsライブラリが依存しているchardetモジュールがインストールされていないことが原因でした。

**chardetは文字エンコーディングを検出するためのライブラリで、requestsがウェブページの文字コードを正しく扱うために必要です。**

この問題を解決するために、以下の手順を試しました。以下のコマンドを実行し、requestsとその依存関係を再インストールしました。

```bash
pip uninstall requests charset_normalizer chardet
pip install requests
```

エラーメッセージを見ると、システムのアーキテクチャ（arm64）と依存ライブラリのアーキテクチャ（x86_64）が不一致だったため、正しいバージョンを再インストールしました。

:::note alert
私の環境では、2021年のM1 MacBook Proを使用しています。
:::

### 解決後の実行結果
再度コードを実行すると、無事にページ内のh3タグが取得できました。

```bash
➜  Desktop git:(honda-branch) ✗ python test.py                                   
【Echo Show 15】新登場 15.6インチフルHDスマートディスプレイ with Alexa
【Echo Show 5】第2世代 – スマートディスプレイ 2メガピクセルカメラ付き
【Echo Show 8】第2世代 – HDスマートディスプレイ 13メガピクセルカメラ付き
【Echo Show 10】第3世代 – モーション機能付きスマートディスプレイ with Alexa
【セット買い】Echo Show 10 + Nature Remo mini2スマートリモコン

      【最新モデル】テンキーのおすすめ14選。Macbookにも使えるワイヤレス！    

      【使ってみた感想】ドン・キホーテで安く買える「最強ノイキャンイヤホン」。    

      【完全版】トラベルポーチの選び方＆おすすめ21選。アウトドアや旅行に最適！    

      【2020年決定版】プログラミング人気おもちゃ13選。【教育におすすめ】    

      【最新】おすすめマイク付きイヤホン4選。コスパ良し、性能良し！【高評価】    
最近の投稿
アーカイブ
カテゴリー
```

## まとめ
今回のスクレイピングプロジェクトでは、単にコードを動かすだけではなく、途中でエラーに遭遇し、その解決方法も学ぶことができました。

特に依存関係の問題や、Python環境におけるアーキテクチャの違いを考慮することが大切だと感じました。

また、**スクレイピングを行う際には、必ず事前に対象サイトの利用規約や許可条件を確認することを忘れずに**。適切にルールを守って行えば、スクレイピングはとても強力なツールとして活用できます。

## 参考文献

https://qiita.com/yuji_sakurai/items/c3720c899593b7ab3ba8

https://qiita.com/ito_futa/items/7dc0bb0955b326efd816