CONTENTS コンテンツ

ポケモン図鑑の説明文を生成しよう!(1)

生成AIを使おう!

2024.06.08

 生成AIで架空のポケモンを作るためのデータベースを作るためのコードを理解するためにHTMLを学んだところ。教材が具体的な画面製作に寄っていたのが心配だが、そろそろ先に進もう。

入力:

下記のコードを理解するためのステップ3としてrequestsを学びたいです。
まずはpythonのrequestsライブラリが用意された理由を教えてください。

import requests
from bs4 import BeautifulSoup
import sqlite3

# ウェブページからデータを抽出
url = "https://www.example.com"
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')

# 特定の要素を抽出
text_data = soup.find_all('p')  # <p>タグのテキストを全て抽出

# SQLiteデータベースに接続
conn = sqlite3.connect('example.db')
c = conn.cursor()

# データベーステーブルを作成
c.execute('''CREATE TABLE IF NOT EXISTS texts (content TEXT)''')

# データをデータベースに保存
for text in text_data:
    c.execute("INSERT INTO texts (content) VALUES (?)", (text.text,))

# 変更をコミットし、接続を閉じる
conn.commit()
conn.close()

出力:

Pythonのrequestsライブラリが用意された理由は、HTTPリクエストを簡単かつ効率的に行うためです。ウェブ上のリソースにアクセスする際に必要となるHTTPリクエストの作成と処理を、シンプルかつ使いやすいインターフェースで提供することを目的としています。具体的な理由を以下に示します:

  1. シンプルで直感的なインターフェース:
    • requestsライブラリは、HTTPリクエストの送信を簡単に行うための直感的なAPIを提供しています。URLを指定してGETリクエストを送る場合、requests.get(url)とするだけでリクエストを送信し、そのレスポンスを受け取ることができます。
  2. 冗長なコードの排除:
    • Pythonの標準ライブラリであるurllibを使用してHTTPリクエストを送信する場合、非常に冗長なコードを書く必要がありました。requestsライブラリは、これを大幅に簡素化します。
  3. 一般的なHTTP操作のサポート:
    • GET、POST、PUT、DELETEなどのHTTPメソッドに対応しており、APIと通信する際に必要となる基本的な操作をすべてカバーしています。
  4. 自動的なエンコーディングとデコーディング:
    • リクエストの送信時やレスポンスの受信時に、自動的にエンコーディングやデコーディングを行ってくれるため、文字コードの扱いが簡単になります。
  5. セッション管理:
    • requestsはセッションをサポートしており、同じセッション内でクッキーや認証情報を保持することができます。これにより、複数のリクエストを行う際に認証情報を毎回設定する必要がなくなります。
  6. エラーハンドリングの容易さ:
    • レスポンスのステータスコードに基づいてエラーハンドリングを行いやすくなっています。例えば、response.raise_for_status()を使用して、リクエストが成功したかどうかを簡単にチェックできます。
  7. 豊富なドキュメントとコミュニティサポート:
    • requestsライブラリは詳細なドキュメントと広範なコミュニティサポートがあり、問題が発生した場合に参考にできるリソースが豊富です。

これらの理由から、requestsライブラリはPythonでHTTPリクエストを行う際のデファクトスタンダードとなっています。

requestsライブラリの基本的な使い方

以下に、requestsライブラリを使った簡単な例を示します:

import requests

# URLを指定してGETリクエストを送信
url = "https://api.example.com/data"
response = requests.get(url)

# レスポンスのステータスコードをチェック
if response.status_code == 200:
    # レスポンスボディをテキストとして取得
    data = response.text
    print(data)
else:
    print(f"Failed to retrieve data: {response.status_code}")

出力:この例では、指定したURLにGETリクエストを送り、レスポンスのステータスコードをチェックしています。ステータスコードが200(成功)であれば、レスポンスボディをテキストとして取得して表示します。

 webからデータを引っ張ってくるためのライブラリで、上の例ではrequests.get(url)で、目的のurlからデータを引っ張ってきてテキストで出力しているようだ。ライブラリ内には様々な機能があるんだろうけど、今回のコードでは使うのはgetメソッドくらいかな。次に進もう。

入力:BeautifulSoapライブラリが用意された理由を教えてください。

出力:

BeautifulSoupライブラリが用意された理由は、ウェブページからデータを抽出(スクレイピング)する作業を簡単かつ効率的に行うためです。具体的な理由を以下に示します:

  1. HTMLやXMLドキュメントの解析の容易化:
    • ウェブページはHTMLやXMLで構成されていますが、これらの構造はしばしば複雑で、手動で解析するのは困難です。BeautifulSoupはこれらのドキュメントをパース(解析)し、簡単に操作できるオブジェクトを提供します。
  2. 簡潔で直感的なAPI:
    • BeautifulSoupは、簡単かつ直感的にHTMLやXMLからデータを抽出するためのAPIを提供します。特定のタグや属性を検索し、その内容を取得する操作を非常に簡単に行うことができます。
  3. HTMLの修復機能:
    • ウェブページのHTMLはしばしば非標準的で不完全なものがありますが、BeautifulSoupはそのような「壊れた」HTMLを自動的に修復し、正確にパースできるようにします。これにより、スクレイピング対象のページが完全に正しいHTMLでなくても問題なく処理できます。
  4. 複数のパーサーサポート:
    • BeautifulSoupは複数のHTMLパーサーをサポートしており、標準のPythonパーサーに加えて、高速で機能豊富なlxmlパーサーや、より厳密なhtml5libパーサーを利用できます。これにより、ニーズに応じて最適なパーサーを選択できます。
  5. 便利なナビゲーションメソッド:
    • BeautifulSoupは、HTMLツリーを簡単にナビゲートするための多くのメソッドを提供します。例えば、親タグや子タグ、兄弟タグを容易に取得できるため、複雑なHTML構造から特定の要素を探し出す作業が容易です。
  6. 広範なドキュメントとサポート:
    • BeautifulSoupは広範なドキュメントと活発なコミュニティサポートを持っており、問題が発生した際にも多くのリソースを利用できます。

これらの特性により、BeautifulSoupはウェブスクレイピングにおけるデファクトスタンダードのライブラリとなっています。

BeautifulSoupライブラリの基本的な使い方

以下に、BeautifulSoupを使った簡単な例を示します:

from bs4 import BeautifulSoup

# 解析するHTMLドキュメント
html_doc = """
<html>
  <head>
    <title>Example Page</title>
  </head>
  <body>
    <h1>Example Header</h1>
    <p class="content">This is an example paragraph.</p>
    <p class="content">Another example paragraph.</p>
  </body>
</html>
"""

# BeautifulSoupオブジェクトを作成
soup = BeautifulSoup(html_doc, 'html.parser')

# タイトルタグを取得
title = soup.title
print("Title:", title.string)

# すべての<p>タグを取得
paragraphs = soup.find_all('p')
for p in paragraphs:
    print("Paragraph:", p.string)

# クラス属性が"content"の<p>タグを取得
content_paragraphs = soup.find_all('p', class_='content')
for cp in content_paragraphs:
    print("Content Paragraph:", cp.string)

この例では、以下の操作を行っています:

  1. HTMLドキュメントの解析:
  • BeautifulSoupオブジェクトを作成し、解析するHTMLドキュメントを渡します。ここでは文字列としてHTMLを直接渡していますが、実際の使用ではウェブページの内容を取得して渡します。
  1. 特定のタグの取得:
  • soup.titleを使って、<title>タグを取得し、その内容を表示します。
  • soup.find_all('p')を使って、すべての<p>タグをリストとして取得し、それぞれの内容を表示します。
  1. 特定の属性を持つタグの取得:
  • soup.find_all('p', class_='content')を使って、クラス属性が"content"<p>タグをリストとして取得し、その内容を表示します。

BeautifulSoupを使うことで、複雑なHTMLドキュメントから必要な情報を簡単に抽出することができるため、ウェブスクレイピングが効率的に行えます。

 requestsで取得したのはHTMLで記載されたデータの塊だから、その塊から必要な情報を抽出するために必要な機能をそろえた、みたいな感じか。概要はつかめたので具体的なコードを見ていこう。

次回に続く

この記事をシェアする