
【第6回】超入門!Webスクレイピングに挑戦〜 requests + BeautifulSoup でサクッとデータ取得してみよう 〜
以下では、前回の記事(【第5回】pipで外部ライブラリを導入!仮想環境(venv)を使ってプロジェクトを管理しよう)の流れを受けて、実際にPythonコードを動かしながら学べる「Webスクレイピング(Webページからデータを抜き取る)入門」をテーマに記事を作成しました。私のような初心者が「自分の手で動かしながら」学べる構成にしていますので、ぜひ参考にしてみてください!
【第6回】超入門!Webスクレイピングに挑戦
〜 requests + BeautifulSoup でサクッとデータ取得してみよう 〜
こんにちは!
前回は pip & 仮想環境 を使って、Pythonで外部ライブラリをインストールする方法を学びました。
今回は、その外部ライブラリを使った実践例として、Webスクレイピングに挑戦してみましょう。
「スクレイピングって何?」 「requests と BeautifulSoup はよく聞くけど、どう使うの?」 「初心者でも動かせる簡単なサンプルが知りたい!」
こんな方に向けて、実際にコードを動かしながら学んでいけるよう、できるだけ噛み砕いて解説します。
注意!スクレイピング前に知っておくべきこと
利用規約・robots.txt:
スクレイピングを行うサイトの利用規約や「robots.txt」を必ず確認し、無断でデータを取得しても問題ないかをチェックしましょう。負荷・マナー:
頻繁なリクエストや大量アクセスはサーバーに負荷をかけるため、適切な間隔を置くなどの配慮が必要です。著作権・プライバシー:
取得したデータの扱い方にも注意が必要です。公開範囲や二次利用など、法律やサイトの方針を守りましょう。
今回は学習用のサンプルサイトなどを対象に、軽い実験を想定しています。
▼ 目次
Webスクレイピングの仕組みをざっくり理解
準備:BeautifulSoupのインストール
実践:requests + BeautifulSoupでWebページを解析してみる
サンプル:タイトル一覧を抽出してみる
補足:エラー回避のための工夫や拡張例
次回予告:データをCSV保存&Pandasで活用する流れを体験!
1. Webスクレイピングの仕組みをざっくり理解
HTTPリクエスト: まずは requests ライブラリを使い、対象のURLにアクセスしてHTMLデータを取得する。
HTML解析: 取得したHTMLを BeautifulSoup(bs4) を使って解析し、
<title> や <p> などタグごとに必要な情報を抜き出す。
class や id を指定してピンポイントでデータを取得する。
抽出・整形: 抜き出したデータをリストや辞書などのPythonデータ構造に格納して、使いやすい形に整形。
出力や保存: 抽出した結果を画面に表示したり、CSVに保存したりする。
実は、この一連の流れさえ理解できれば、スクレイピングの基本は押さえたと言っても過言ではありません。
2. 準備:BeautifulSoupのインストール
2-1. 仮想環境をアクティブに
前回の記事で紹介したように、プロジェクトごとに仮想環境を使うのがおすすめです。
以下のようにターミナルで移動し、環境をアクティベートしましょう。
cd /path/to/your/project
source venv_sample/bin/activate # Mac/Linux
# もしくは Windowsなら
.\venv_sample\Scripts\Activate.ps1
2-2. インストール
pip install requests beautifulsoup4
requests は前回も使ったHTTPライブラリ
beautifulsoup4 はHTML解析のためのライブラリ(bs4 と呼ばれることも多い)
これで準備完了です!
3. 実践:requests + BeautifulSoupでWebページを解析してみる
実際にWebサイトのURLにアクセスして、HTMLから欲しい要素を抜き出してみましょう。
以下は学習目的で、有名なExample Domain(https://example.com)を使ったサンプルです。
import requests
from bs4 import BeautifulSoup
def main():
url = "https://example.com"
response = requests.get(url)
# ステータスコードが200ならOK
if response.status_code == 200:
# HTMLデータを取得
html_data = response.text
# BeautifulSoupを使ってHTMLを解析
soup = BeautifulSoup(html_data, "html.parser")
# タイトルタグ(<title>)の中身を取り出す
title = soup.find("title") # 1つだけ取得
print("ページタイトル:", title.text)
else:
print("エラーが発生しました:", response.status_code)
if __name__ == "__main__":
main()
コード解説
requests.get(url) : 指定したURLへGETリクエストを送信し、レスポンスを受け取る。
response.text : 取得したHTML内容(文字列)
BeautifulSoup(html_data, "html.parser") : 解析器に "html.parser" を指定。lxml など他のパーサーもあり。
soup.find("title") : <title> ... </title> タグを検索して、最初の1つを返す。
title.text : タグの中身の文字列だけを取り出す。
このスクリプトを実行してみると、「ページタイトル: Example Domain」 のように表示されるはず。
これだけでWebページのタイトルを取得できました。簡単ですね!
4. サンプル:タイトル一覧を抽出してみる
もう少し実践的に、「複数の記事タイトル」を抜き出す例を作ります。
たとえば、学習用サイトとして有名な「Scraping Club」(※1) などが使えます。
(※1) Scraping Club は初心者向けのスクレイピング練習サイトです。
import requests
from bs4 import BeautifulSoup
def main():
url = "https://scrapingclub.com/exercise/list_basic/?page=1"
response = requests.get(url)
if response.status_code == 200:
soup = BeautifulSoup(response.text, "html.parser")
# 商品タイトルを含む要素をすべて取得してみる
cards = soup.find_all("div", class_="p-4")
for card in cards:
title_tag = card.find("h4")
if title_tag:
title = title_tag.text.strip()
print("商品名:", title)
else:
print("エラーが発生しました:", response.status_code)
if __name__ == "__main__":
main()
コード解説
soup.find_all("div", class_="p-4")
タグ名が div かつ class 属性が "p-4" の要素を複数まとめて返す。
こういった「タグ名+class名」検索が初心者にも分かりやすい方法。
card.find("h4")
各カード要素の中にある <h4> ... </h4> をさらに検索。
.text.strip()
タグのテキスト部分を取得し、先頭や末尾の空白・改行を削除。
このように、HTMLの構造やclass属性をヒントに、欲しい部分だけを抽出できます。
実行すると、商品の名称が一覧で表示されるでしょう(※サイトの更新で違う結果が出る場合もあります)。
5. 補足:エラー回避のための工夫や拡張例
5-1. タイムアウトやリトライ
Webサイトにアクセスする際、サーバーが重かったり、ネット環境が不安定だったりすると通信エラーが起きることがあります。
requests.get(url, timeout=10) でタイムアウトを設定したり、エラー時にリトライする仕組みを実装しておくと安心です。
5-2. スリープやヘッダ設定
スクレイピングで大量リクエストを送るときは、適宜スリープ(time.sleep(1)など)を入れるとサーバーへの負荷を軽減でき、ブロックされにくくなります。
また、ヘッダのUser-Agentを書き換えて、通常のブラウザアクセスっぽく偽装する場合もありますが、必ずサイトの規約を確認してから行いましょう。
5-3. ページネーション(複数ページの処理)
商品一覧や記事一覧には、複数ページにわたることが多いです。
page=2, page=3 のようにURLのクエリ部分を変更しながらループすると、全ページの情報を取得できます(ただし取得しすぎに注意!)。
5-4. Seleniumを使った動的サイトの解析
JavaScriptで動的に生成されるページでは、requests + BeautifulSoup だけでは正しく取れないケースも。
その場合は、Selenium というブラウザ自動操作ツールが便利です。
ただし、動的解析は処理が重くなるので注意してください。
6. 次回予告:データをCSV保存&Pandasで活用する流れを体験!
今回の記事で、requests + BeautifulSoup を使ったWebスクレイピングの最初の一歩を踏み出せたかと思います。
「タグを取得して .text で文字列を抜き出す」という手順は、どんなサイトでも基本は同じです。
次回は、スクレイピングで取得したデータをCSVに保存し、
さらに Pandas などのライブラリを使って「データ分析や整形をしてみる」流れを体験しましょう。
「Webから取ってきた情報を表形式でまとめ、グラフ描画する」 なんてことも夢じゃありません!
まとめ
requests でWebページのHTMLを取得
BeautifulSoup でHTMLを解析し、欲しいタグやclassをピンポイントで抽出
Tagの.text で文字列を取り出したり、.find_all() で一括取得したりする
スクレイピングは利用規約や負荷対策に気を配ることが大切
拡張として、ページネーション処理やSelenium などの手段もある
スクレイピングは、「リサーチやデータ収集を自動化したい」「手入力せずに一気に情報を取得したい」といった場面で非常に役立ちます。
ぜひ今回のサンプルコードを実際に動かしてみて、「おお、こんなに簡単にデータが取れるんだ!」という感動を味わってください。
次回はデータの保存や可視化についてさらに踏み込んでいきます。
今回の記事が役に立ったら、ぜひフォローやいいねで応援していただけると嬉しいです。
編集後記
初心者でも、「requests + BeautifulSoup」 という定番ライブラリの組み合わせだけで、かなり多くのサイトから情報を取ってこれます。
最初はエラーやうまく取れないタグがあって困惑するかもしれませんが、デベロッパーツール(ブラウザの検証機能)でHTML構造を確認したり、printデバッグして1つずつ確認していくとだんだん理解が深まりますよ。
ぜひ「何か抽出できるデータがありそうなサイト」を見つけて、小さな実験を繰り返してみてください。自分なりにデータを整理してみると、面白い発見や学びがあるかも……!
それでは、次の記事もどうぞお楽しみに。
最後までお読みいただき、ありがとうございました!