QiitaのAPI、webスクレイピング、GPTを使用して記事書いてみた！実装手順(前編)

# はじめに
<!-- 発端や概要を記載 -->
こんにちは、エンジニア2年目の嶋田です。
まずは、この記事を開いていただきありがとうございます！
先日以下の記事を投稿しました。

https://qiita.com/shimada_slj/items/bc2cec77e687db95913b

この記事を実際にどのように生成したのかを解説していきたいと思います！
前編と後編の2部構成にしました。
前編では、プロジェクトの環境構築、使用したツールの紹介、そしてプロジェクトの構造について説明します。

:::note warn
私が作成した記事は、完璧なものではありません。
実際のデータを使用して何か新しいものを作り出す、という基本的な流れのシェアです。
データの精度や記事の正確性に関してはまだまだ改善の余地があると思います。
学習過程の共有であると思いながら読んでいただけるとありがたいです。

もし、読者の皆さんの中で、より良い方法や改善点をお持ちの方がいれば、ぜひ教えてください🙇‍♂️
:::

# 目次
- [概要](#概要)
- [環境構築](#環境構築)
- [各ディレクトリとファイルの詳細](#各ディレクトリとファイルの詳細)
- [最後に](#最後に)

# 概要
「**QiitaのAPIを利用して記事データを取得し、取得したデータを基にして新しい記事を生成すること**」が今回のゴールです。この過程では、複数の技術が用いられています。`requests`と`beautifulsoup4`を使ってWebスクレイピングを行い、`configparser`で設定ファイルを管理します。さらに、`langchain-community`と`openai`ライブラリを使用して、GPTモデルに基づいたテキスト生成を行っています。

# 環境構築
プロジェクトを始める前に、適切な開発環境を設定する必要があります。ここでは、必要なツールのインストールから設定ファイルの作成まで、環境構築の手順を細かく説明します。このガイドに従えば、コピペだけで環境を整えることが可能です。

## Pythonのインストール
このプロジェクトはPython 3.11を使用しています。Pythonがまだインストールされていない場合は、以下のリンクからインストーラーをダウンロードしてインストールしてください。
- [Pythonの公式サイト](https://www.python.org/downloads/)

インストールが完了したら、コマンドラインで以下のコマンドを実行し、インストールされたPythonのバージョンを確認してください。

```bash
python --version
```

## 仮想環境のセットアップ
Pythonの仮想環境は、プロジェクトごとに依存関係を隔離するのに役立ちます。以下のコマンドを使用して、プロジェクト用の仮想環境を作成します。

```bash
python -m venv venv
```

作成した仮想環境をアクティベートします。

Linux/macOSの場合:
```bash
source venv/bin/activate
```

Windowsの場合:
```bash
.\venv\Scripts\activate
```

## 依存関係のインストール
### `requirements.txt`
このプロジェクトで`requirements.txt`ファイルは、プロジェクトの依存関係を管理するために使用されます。このファイルにリストされたパッケージは、プロジェクト実行に必要な外部ライブラリやモジュールです。`pip install -r requirements.txt`コマンドを使って、これらの依存関係を一括でインストールできます。

今回のプロジェクトの`requirements.txt`の内容は以下です。

```
requests
beautifulsoup4
configparser
langchain-community
langchain
openai
```

以下のコマンドを実行して、必要なライブラリをインストールします。

```bash
pip install -r requirements.txt
```

以下に、`requirements.txt`に含まれる主なライブラリとその用途について簡単に説明します。

- `requests`
    - HTTPリクエストを送信するためのライブラリ
    - WebスクレイピングやAPIとの通信に使用
- `beautifulsoup4`
    - HTMLやXMLファイルからデータを抽出するためのライブラリ
    - Webページの解析やデータ抽出に使用
- `configparser`
    - 設定ファイルを解析するためのライブラリ
    - 今回のプロジェクトでは、APIキーなどの設定情報を`config.ini`ファイルから読み込むために使用
- `langchain-community`と`langchain`
    - 自然言語処理や言語モデルに関連する機能を提供するライブラリ
        - 今回のプロジェクトでは、テキスト生成や言語理解のために使用
- `openai`
    - OpenAI提供のAPIを利用するためのライブラリ
    - GPTモデルを用いたテキスト生成にこのライブラリが活用されている

これらのライブラリを使用することで、QiitaのAPIから記事データを取得し、それを基に新しい記事を自動生成することがこのプロジェクトの目的です。各ライブラリの詳細なドキュメントは、それぞれの公式サイトやGitHubリポジトリで確認できます。
これにより、requests, beautifulsoup4, configparser, langchain-community, langchain, openaiなど、プロジェクトで必要なすべてのパッケージがインストールされます。

## 環境変数の設定
セキュアな情報、例えばAPIキーなどは、環境変数を通じて管理することが推奨されます。config.iniファイルを作成し、そこに秘密情報を記載し、configparserを使用してプログラム内で読み込むことができます。

### `config.ini`

```bash
[Qiita]
access_token = あなたのアクセストークン

[OpenAI]
api_key = あなたのAPIキー
```

Qiitaのアクセストークンの取得の仕方は[こちら](https://qiita.com/maiamea/items/680cca06f7825595cba0)の記事を参考にしてください。
OpenAIのAPIキーの取得方法は[こちら](https://qiita.com/Isaka-code/items/b50983796636503b44c5)の記事を参考にしてください。

また、もしgit化する場合(今回私はgit管理かしていません。)はこの`config.ini`ファイルはバージョン管理下に置かないようにしましょう。.gitignoreファイルに.envを追加して、リポジトリには含まれないようにします。

# プロジェクトの構造

```bash
QIITA/
│
├── data/
│ ├── qiita_popular_articles.csv - Qiitaの人気記事データ(コード実行時に生成されます。)
│ └── qiita_shimada_articles.csv - 私自身の記事データ(コード実行時に生成されます。)
│
├── generated/
│ ├── detailed_generated_article.txt - 詳細な内容が追加された記事ファイル(コード実行時に生成されます。)
│ └── generated_article99.txt - 初期生成された記事ファイル(コード実行時に生成されます。)
│
├── src/
│ ├── langchain-qiita.py - 言語モデルを扱うスクリプト
│ └── qiita.py - Qiita APIを扱うスクリプト
│
├── venv/ - Pythonの仮想環境ディレクトリ
│
├── config.ini - プロジェクト設定情報を保持するファイル
└── requirements.txt - プロジェクトの依存関係リストファイル
```

# 各ディレクトリとファイルの詳細

- `data/`
    - Qiita APIから取得した記事の生データが保存される
    - 分析や記事生成のための入力データとして使用
  
- `generated/`
    - このディレクトリには、AIによって生成された記事のドラフトと完成形が保存される
    - ドラフトはさらなる編集やレビューを経て、最終的な記事となる

- `src/`
    - ソースコードを含むメインのディレクトリ
    - 実際のプログラムのロジックやAPIとのインタラクションを扱うスクリプトが含まれている

- `test/`
    - 開発中にプログラムの動作を検証するためのテストコードが格納される場所

- `venv/`
    - Pythonの仮想環境に関連するファイルが置かれるディレクトリ
    - プロジェクトの依存関係を隔離して管理するために使用される
- config.ini
    - プロジェクトの設定を管理するファイル
    - APIキーなどの機密情報を含むため、ソースコードのリポジトリには含めないように注意が必要

- requirements.txt
    - プロジェクトで必要とされるPythonパッケージがリストされている

# 最後に
私自身まだまだ勉強中なので、何か問題を見つけたり、もっといい方法があれば、勉強したいので教えてください！
ここまで読んでいただき、ありがとうございました！
次回は実際のコードを公開します。後編(3/18に投稿予定)もよろしくお願いします。