PythonでWeb上の情報を収集する「スクレイピング」の世界:基礎から実践的なマナーまで
![]()
【Hiroki】
Yukiさん、こんにちは!今日は「スクレイピング」という技術について教えてほしいんです。最近、ニュースサイトの見出しや天気の情報を自動的に集めて、自分で整理できたらいいなと思って。でも、どうやって始めたらいいかわからなくて……。
![]()
【Yuki】
こんにちは、Hirokiくん。スクレイピングに興味を持ったのですね。確かに、インターネット上の膨大な情報を一つずつ手作業でコピーするのは、気が遠くなるような作業です……。それをプログラムに任せることができれば、とても便利だと思います。
ただ、スクレイピングはとても強力な技術である反面、相手のサーバーに負担をかけたり、ルールを守らなかったりすると、トラブルになってしまうこともあります。
今日は、Pythonを使ったスクレイピングの基礎と、一番大切な「マナー」について、一緒に学んでいきましょう。
スクレイピングとは何か
![]()
【Hiroki】
そもそも「スクレイピング」って、具体的に何をしているんですか?ブラウザで見ている画面を読み取っているんでしょうか?
![]()
【Yuki】
簡単に言うと、Webサイトのプログラムコード(HTML)をダウンロードして、その中から「必要なデータだけを抽出する」技術のことです。
私たちが普段ブラウザで見ているWebページは、文字や画像が綺麗に配置されていますが、その裏側にはHTMLというタグで囲まれたテキストデータがあります。
スクレイピングは、そのHTMLの構造を解析して、特定の場所にある文字や画像URLを取り出す作業のことを指します。
データ収集を自動化することで、情報の整理がとても効率的になるはずです……。
![]()
【Hiroki】
なるほど、裏側のデータから必要な部分だけを抜き出すんですね。難しそうだけど、面白そうです!
守らなければならない大切なルール
![]()
【Yuki】
技術的な話に入る前に、どうしても伝えておかなければならないことがあります。スクレイピングには「絶対に守るべきルール」があるんです。
これを無視してしまうと、Webサイトの管理者に迷惑をかけるだけでなく、最悪の場合、法的な問題に発展する可能性もあります……。
![]()
【Hiroki】
えっ、法的な問題……?それは怖いですね。具体的にどんなことに気をつければいいんですか?
![]()
【Yuki】
まず一つ目は、「サーバーに負荷をかけないこと」です。
人間がブラウザでページを見る速度とは比べ物にならない速さでリクエストを送ると、相手のサーバーがダウンしてしまうかもしれません。
プログラムを書くときは、1回アクセスしたら最低でも1秒以上は間隔を空ける、といった配慮が必要です。
二つ目は、「利用規約を確認すること」です。 サイトによっては、スクレイピング自体を禁止している場合があります。特に、ログインが必要なサービスや、SNSなどは厳しい制限があることが多いので注意してくださいね。
三つ目は、「著作権」です。 取得したデータを自分のためだけに使うのは問題ありませんが、それをそのまま別のサイトで公開したり、販売したりすると著作権法に触れることがあります。
![]()
【Hiroki】
サーバーへの負担と、規約、著作権……。自分勝手な使い方をしないことが大事なんですね。
![]()
【Yuki】
その通りです。また、サイトのトップディレクトリにある「robots.txt」というファイルを確認するのも良い習慣です。
例えば、https://example.com/robots.txt にアクセスすると、そのサイトがクローラー(自動巡回プログラム)に対してどの範囲のアクセスを許可しているかが書かれています。
こうしたルールを尊重することは、技術者としてとても大切なことだと、わたしは思います……。
Pythonでスクレイピングを始める準備
![]()
【Hiroki】
ルールはしっかり守ります!では、Pythonでスクレイピングをするには、どんな道具が必要なんですか?
![]()
【Yuki】
Pythonには便利なライブラリがたくさんありますが、初心者のうちは次の2つを組み合わせるのが一般的です。
- Requests: Webサイトのデータを取得するためのライブラリです。
- Beautiful Soup 4: 取得したHTMLから特定の要素を抜き出すためのライブラリです。
まずは、これらのライブラリをインストールすることから始めましょう。コマンドプロンプトやターミナルで、以下のコマンドを入力してみてください。
pip install requests beautifulsoup4
![]()
【Hiroki】
インストールできました!これで準備完了ですね。
Webページの情報を取得してみよう(Requests)
![]()
【Yuki】
まずは、基本となる「Webサイトのデータを取ってくる」部分を書いてみましょう。
ここでは例として、仮のURLを使いますが、実際には取得したいサイトのURLを指定します。
import requests
# 取得したいURLを指定します
url = "https://www.python.org/"
# Webサイトにアクセスします
response = requests.get(url)
# ステータスコードを確認します(200なら成功です)
if response.status_code == 200:
print("データの取得に成功しました!")
# 取得したHTMLの冒頭100文字を表示してみます
print(response.text[:100])
else:
print(f"エラーが発生しました。ステータスコード: {response.status_code}")
![]()
【Hiroki】
おぉ、これだけでWebサイトの内容が取れるんですね!response.status_code が200かどうかを確認するのは、何かの儀式みたいなものですか?
![]()
【Yuki】
ふふ、そうかもしれませんね。でも大切な確認です。
Webサイトが存在しなかったり、アクセスが拒否されたりすると、404や403といったエラーコードが返ってきます。
正常に取得できたことを確認してから処理を進めるのは、プログラムが予期せぬ止まり方をしないための、優しい配慮だと思ってください……。
HTMLを解析して中身を取り出す(Beautiful Soup 4)
![]()
【Hiroki】
でも、response.text を表示しただけだと、タグだらけで何が書いてあるかよく分かりません……。ここから特定の文字だけを取り出すにはどうすればいいんですか?
![]()
【Yuki】
そこで登場するのが Beautiful Soup です。
これを使うと、HTMLの中にある「<h1>タグの中身」や「特定のクラス名がついた要素」を、ピンポイントで指定して取り出すことができます。
先ほどのコードに続けて、サイトのタイトルを取得してみましょう。
import requests
from bs4 import BeautifulSoup
url = "https://www.python.org/"
response = requests.get(url)
if response.status_code == 200:
# BeautifulSoupオブジェクトを作成します
# 第2引数の "html.parser" は、Python標準の解析器を使うという意味です
soup = BeautifulSoup(response.text, "html.parser")
# <title>タグを取得します
title_tag = soup.title
# タグの中のテキストだけを表示します
print(f"サイトのタイトル: {title_tag.string}")
![]()
【Hiroki】
すごい!「Welcome to Python.org」って表示されました!タグを取り除いて、中身のテキストだけを抜き出せるんですね。
CSSセレクタを使って高度な抽出をする
![]()
【Hiroki】
タイトルだけじゃなくて、もっと特定の場所……例えば「ニュースの見出し一覧」みたいに、同じような要素が並んでいる場所をまとめて取るにはどうすればいいんですか?
![]()
【Yuki】
その場合は、find_all メソッドや select メソッドを使うと便利です。
特に select メソッドは、Webデザインで使われる 「CSSセレクタ」 という仕組みを使って指定できるので、とても強力ですよ。
例えば、Python.orgのトップページにあるニュースのリストを取得するコードは、こんな風になります。
import requests
from bs4 import BeautifulSoup
import time # 間隔を空けるために必要です
url = "https://www.python.org/"
response = requests.get(url)
if response.status_code == 200:
soup = BeautifulSoup(response.text, "html.parser")
# ニュース項目が含まれている要素をCSSセレクタで指定します
# ここでは例として、blog-widget内にある li タグを探します
news_items = soup.select(".blog-widget li")
print("--- 最新のニュース見出し ---")
for item in news_items:
# 見出しのテキストと、リンク先のURLを取得します
title = item.find("a").text
link = item.find("a")["href"]
print(f"タイトル: {title}")
print(f"リンク: {link}")
print("-" * 20)
# 連続でリクエストを送る場合は、必ず sleep を入れましょう
time.sleep(1)
![]()
【Hiroki】
for文を使って、見出しを一つずつ取り出しているんですね。.blog-widget li というのが、場所を特定するための「住所」みたいなもの、ということでしょうか。
![]()
【Yuki】
ええ、その通りです。ブラウザの「開発者ツール(F12キーを押すと出てくるもの)」を使うと、その要素がどんなタグで、どんなクラス名(class)やID(id)を持っているか調べることができます。
HTMLの構造をじっくり観察して、その「住所」を見つける作業は、少しパズルのようで楽しいかもしれませんね。
ただ、サイトのデザインが変わってしまうと、この「住所」も変わってしまうことがあります。
そうなるとプログラムが動かなくなるので、その時はまた新しい住所を探してあげる必要があります……。
データの保存と実践的なテクニック
![]()
【Hiroki】
取得したデータを画面に表示するだけじゃなくて、ファイルに保存しておきたい時はどうすればいいですか?
![]()
【Yuki】
よく使われるのは、CSV形式での保存です。Pythonの標準ライブラリである csv モジュールを使えば、Excelなどで開ける形式で保存できます。
import csv
# データをリストの形で用意します
data = [
["タイトル", "URL"],
["News 1", "https://example.com/1"],
["News 2", "https://example.com/2"]
]
# csvファイルとして書き出します
with open("news_data.csv", "w", encoding="utf-8", newline="") as f:
writer = csv.writer(f)
writer.writerows(data)
print("保存が完了しました。")
![]()
【Yuki】
このように、情報を集めて、整理して、保存する。ここまでの一連の流れがスクレイピングの基本になります。
最初は簡単なサイトから始めて、徐々に自分の欲しい情報を集められるようになると、プログラミングがもっと楽しくなると思いますよ。
動的なサイトへの対応(Selenium)
![]()
【Hiroki】
Yukiさん、実はさっき自分の好きなサイトで試してみたんですけど、うまく中身が取れなかったんです。ブラウザで見るとちゃんと表示されているのに、response.text を見ると真っ白だったり、読み込み中の表示しかなかったりして……。
![]()
【Yuki】
あ……それはきっと、そのサイトが 「JavaScript」 を使って後からデータを読み込んでいるからですね。
requests は、最初にサーバーから送られてきたHTMLファイルをそのまま受け取るだけなので、その後に実行されるプログラム(JavaScript)によって表示される内容は取得できないんです。
![]()
【Hiroki】
そんなサイトもあるんですね。どうすればいいんでしょうか?
![]()
【Yuki】
そういった「動的なサイト」をスクレイピングするには、Selenium(セレニウム) というツールを使うことが多いです。
Seleniumは、プログラムから本物のブラウザ(Chromeなど)を遠隔操作する技術です。
実際にブラウザを立ち上げて、ページが完全に読み込まれるのを待ってからデータを取得するので、人間が見ているのとほぼ同じ状態の情報を取ることができます。
ただし、Seleniumは動作が重く、設定も少し複雑になります……。
まずは Requests と Beautiful Soup で基本的な構造を理解してから、必要に応じて挑戦してみるのがいいかもしれませんね。
まとめ:技術を正しく使うために
![]()
【Hiroki】
今日はありがとうございました!スクレイピングって、ただ情報を取るだけじゃなくて、相手への思いやりや、HTMLの構造を読み解く力が必要なんですね。
![]()
【Yuki】
はい。技術を身につけることは素晴らしいことですが、それと同じくらい、その技術をどう使うかが大切だと思います。
インターネットの世界は、お互いの信頼とルールで成り立っています。
Hirokiくんが、ルールを守って、誰かの役に立つような素敵なツールを作れるようになるのを、わたしも応援しています……。
もし、HTMLの解析で行き詰まったり、もっと効率的なデータの整理方法が知りたくなったら、いつでも聞いてくださいね。 わたしも、Hirokiくんと一緒に学べる時間を大切にしたいと思っていますから。
![]()
【Hiroki】
はい!まずは自分の興味のあるニュースを集めるツールから作ってみます。また分からないことがあったら教えてください!
![]()
【Yuki】
ええ、喜んで。次は、取得したデータをどうやって美しく整形するか、なんてお話もできるといいですね。
焦らずに、一歩ずつ進んでいきましょう。
それじゃあ、今日はこの辺りで……お疲れ様でした。
参考サイト
- Requests: Python HTTP for Humans
- Beautiful Soup Documentation
- Python公式ドキュメント(csvモジュール)
- Webスクレイピングの注意事項(総務省) ※一般的な法的・倫理的ガイドラインの参照として
「スクレイピング」のサンプルコードを見る
この記事では基礎を解説しましたが、実務においては「もっと複雑なデータを扱いたい」「独自のシステムに組み込みたい」といった、個別の課題に直面することも多いはずです。
「自分で書く時間は最小限に抑え、プロの品質でツールを完成させたい」という方は、ぜひ一度ご相談ください。
- 専門家の知見に基づいた、保守性の高いコード設計
- AIの専門家による、Gemini API等の最新AIを組み合わせた高度な自動化
- ChatGPT等が生成したコードのデバッグ・最適化
「教わる」だけでなく「形にする」パートナーとして、フリーランスエンジニアのmei_13が最短ルートでの解決をサポートします。


