Pythonを使ってWebスクレイピングやAPI連携を行う際には、標準ライブラリだけでなく外部パッケージを活用することで効率よく開発できます。
本記事では、初心者向けに外部パッケージの基本的なインストール方法から、代表的なパッケージであるrequestsとBeautifulSoupの使い方までを丁寧に解説します。
最後に学んだ内容を確認する演習問題とその解答例も用意しましたので、ぜひ手を動かしながら学習を進めてください。
外部パッケージとは?
Python標準ライブラリには基本的な機能が一通り揃っていますが、スクレイピングやデータ解析、機械学習などの高度な処理を行うには専門的な処理を持つパッケージを追加でインストールする必要があります。
これらを「外部パッケージ(サードパーティパッケージ)」と呼び、PyPI(Python Package Index)というリポジトリからインストールします。
仮想環境の準備
複数のプロジェクトで異なるパッケージバージョンを共存させるために、まずは仮想環境を作成しましょう。
# プロジェクトフォルダを作成して移動
mkdir myproject
cd myproject
# 仮想環境の作成
python3 -m venv venv
# 仮想環境の有効化 (Windows)
venv\Scripts\activate
# 仮想環境の有効化 (macOS/Linux)
source venv/bin/activate
# 仮想環境の無効化
deactivate
仮想環境を有効化した状態でパッケージをインストールすると、システム全体に影響を与えずに依存関係を管理できます。
pipによるパッケージインストール
Python公式パッケージ管理ツール「pip」を使ってパッケージをインストールします。
pip install requests
pip install beautifulsoup4
- requests:HTTPリクエストを簡潔に行うためのライブラリ
- beautifulsoup4:HTMLやXMLを解析し、要素を抽出するためのライブラリ
複数のパッケージをまとめてインストールしたい場合は、requirements.txtを使う方法もあります。
# requirements.txt の例
requests==2.31.0
beautifulsoup4==4.12.2
pip install -r requirements.txt
requestsの基本的な使い方
requestsを使うと、わずか数行でWebページの取得やAPI呼び出しができます。
import requests
# GETリクエストでHTMLを取得
url = "https://example.com"
response = requests.get(url)
# ステータスコードの確認
print(response.status_code) # 200 が返ってくれば成功
# レスポンス本文の取得(テキスト)
html = response.text
print(html[:200]) # 先頭200文字を表示
- response.status_code:HTTPステータスコード
- response.text:取得したレスポンスの文字列(HTMLなど)
- response.json():JSON形式のレスポンスをPythonの辞書型に変換
※API連携時にはresponse.json()が便利です。
BeautifulSoupによるHTML解析
BeautifulSoupを使うと、HTMLの要素を簡単に抽出できます。
from bs4 import BeautifulSoup
# 先ほど取得したHTMLをパース
soup = BeautifulSoup(html, "html.parser")
# タイトル要素を取得
title_tag = soup.find("title")
print("ページタイトル:", title_tag.string)
# 特定のクラスを持つ要素を複数取得
items = soup.find_all("div", class_="item")
for item in items:
print(item.get_text(strip=True))
- find():条件に合う最初の要素を取得
- find_all():条件に合う全ての要素をリストで取得
- get_text():タグ内のテキストを抽出
CSSセレクタを使った抽出も可能です。
# CSSセレクタでaタグをまとめて取得
links = soup.select("a.external-link")
for a in links:
print(a["href"], a.get_text())
実践例:簡易Webスクレイピングスクリプト
以下は、あるページから記事の見出し(h2タグ)を取得して表示するサンプルです。
import requests
from bs4 import BeautifulSoup
def fetch_headlines(url):
res = requests.get(url)
res.raise_for_status() # ステータスコードが200番台以外なら例外発生
soup = BeautifulSoup(res.text, "html.parser")
headlines = [h2.get_text(strip=True) for h2 in soup.find_all("h2")]
return headlines
if __name__ == "__main__":
url = "https://example-blog.com"
for idx, hl in enumerate(fetch_headlines(url), 1):
print(f"{idx}. {hl}")
- raise_for_status():異常系を早期に検知する
- リスト内包表記で簡潔に要素を抽出
演習問題
下記の演習問題に取り組み、この記事で学んだ内容を実践してみましょう。
演習1:Webページの取得とステータスコード確認
- 任意のURL(例:https://httpbin.org/get)に対してGETリクエストを送信し、
- レスポンスのステータスコードを表示
- レスポンスヘッダのContent-Typeを表示
演習2:HTMLからリンクリストを抽出
- ローカルに保存したHTMLファイル(例:sample.html)を読み込み
- <a>タグのhref属性値を全て抽出して出力
演習3:簡易APIクライアントの作成
- https://jsonplaceholder.typicode.com/posts からJSONデータを取得
- レスポンスをパースして、最初の5件の
title
をリスト表示
解答例
演習1 解答例
import requests
url = "https://httpbin.org/get"
res = requests.get(url)
print("ステータスコード:", res.status_code)
print("Content-Type:", res.headers.get("Content-Type"))
演習2 解答例
from bs4 import BeautifulSoup
# sample.html は同じディレクトリに保存されている想定
with open("sample.html", encoding="utf-8") as f:
html = f.read()
soup = BeautifulSoup(html, "html.parser")
links = [a["href"] for a in soup.find_all("a", href=True)]
for link in links:
print(link)
演習3 解答例
import requests
url = "https://jsonplaceholder.typicode.com/posts"
res = requests.get(url)
res.raise_for_status()
data = res.json() # リスト形式のJSONデータ
titles = [post["title"] for post in data[:5]]
for idx, title in enumerate(titles, 1):
print(f"{idx}. {title}")
まとめ
本記事では、Pythonの外部パッケージrequestsとBeautifulSoupを使った基本的なインストール方法と使用例を紹介しました。
実際に手を動かしながら、GETリクエストの送信、HTML解析、JSONパースなどの基本操作をマスターしましょう。
演習問題を解くことで、理解がさらに深まります。今後はさらに発展的なスクレイピングやデータ処理のテクニックにも挑戦してみてください。