mei_13のPython講座 ロゴ

【解説】PythonでWeb上の情報を収集する「スクレイピング」の世界:基礎から実践的なマナーまで




PythonでWeb上の情報を収集する「スクレイピング」の世界:基礎から実践的なマナーまで


Hirokiのアイコン
【Hiroki】 Yukiさん、こんにちは!今日は「スクレイピング」という技術について教えてほしいんです。最近、ニュースサイトの見出しや天気の情報を自動的に集めて、自分で整理できたらいいなと思って。でも、どうやって始めたらいいかわからなくて……。


Yukiのアイコン
【Yuki】 こんにちは、Hirokiくん。スクレイピングに興味を持ったのですね。確かに、インターネット上の膨大な情報を一つずつ手作業でコピーするのは、気が遠くなるような作業です……。それをプログラムに任せることができれば、とても便利だと思います。 ただ、スクレイピングはとても強力な技術である反面、相手のサーバーに負担をかけたり、ルールを守らなかったりすると、トラブルになってしまうこともあります。 今日は、Pythonを使ったスクレイピングの基礎と、一番大切な「マナー」について、一緒に学んでいきましょう。

スクレイピングとは何か


Hirokiのアイコン
【Hiroki】 そもそも「スクレイピング」って、具体的に何をしているんですか?ブラウザで見ている画面を読み取っているんでしょうか?


Yukiのアイコン
【Yuki】 簡単に言うと、Webサイトのプログラムコード(HTML)をダウンロードして、その中から「必要なデータだけを抽出する」技術のことです。 私たちが普段ブラウザで見ているWebページは、文字や画像が綺麗に配置されていますが、その裏側にはHTMLというタグで囲まれたテキストデータがあります。 スクレイピングは、そのHTMLの構造を解析して、特定の場所にある文字や画像URLを取り出す作業のことを指します。 データ収集を自動化することで、情報の整理がとても効率的になるはずです……。


Hirokiのアイコン
【Hiroki】 なるほど、裏側のデータから必要な部分だけを抜き出すんですね。難しそうだけど、面白そうです!

守らなければならない大切なルール


Yukiのアイコン
【Yuki】 技術的な話に入る前に、どうしても伝えておかなければならないことがあります。スクレイピングには「絶対に守るべきルール」があるんです。 これを無視してしまうと、Webサイトの管理者に迷惑をかけるだけでなく、最悪の場合、法的な問題に発展する可能性もあります……。


Hirokiのアイコン
【Hiroki】 えっ、法的な問題……?それは怖いですね。具体的にどんなことに気をつければいいんですか?


Yukiのアイコン
【Yuki】 まず一つ目は、「サーバーに負荷をかけないこと」です。 人間がブラウザでページを見る速度とは比べ物にならない速さでリクエストを送ると、相手のサーバーがダウンしてしまうかもしれません。 プログラムを書くときは、1回アクセスしたら最低でも1秒以上は間隔を空ける、といった配慮が必要です。

二つ目は、「利用規約を確認すること」です。 サイトによっては、スクレイピング自体を禁止している場合があります。特に、ログインが必要なサービスや、SNSなどは厳しい制限があることが多いので注意してくださいね。

三つ目は、「著作権」です。 取得したデータを自分のためだけに使うのは問題ありませんが、それをそのまま別のサイトで公開したり、販売したりすると著作権法に触れることがあります。


Hirokiのアイコン
【Hiroki】 サーバーへの負担と、規約、著作権……。自分勝手な使い方をしないことが大事なんですね。


Yukiのアイコン
【Yuki】 その通りです。また、サイトのトップディレクトリにある「robots.txt」というファイルを確認するのも良い習慣です。 例えば、https://example.com/robots.txt にアクセスすると、そのサイトがクローラー(自動巡回プログラム)に対してどの範囲のアクセスを許可しているかが書かれています。 こうしたルールを尊重することは、技術者としてとても大切なことだと、わたしは思います……。

Pythonでスクレイピングを始める準備


Hirokiのアイコン
【Hiroki】 ルールはしっかり守ります!では、Pythonでスクレイピングをするには、どんな道具が必要なんですか?


Yukiのアイコン
【Yuki】 Pythonには便利なライブラリがたくさんありますが、初心者のうちは次の2つを組み合わせるのが一般的です。

  1. Requests: Webサイトのデータを取得するためのライブラリです。
  2. Beautiful Soup 4: 取得したHTMLから特定の要素を抜き出すためのライブラリです。

まずは、これらのライブラリをインストールすることから始めましょう。コマンドプロンプトやターミナルで、以下のコマンドを入力してみてください。

pip install requests beautifulsoup4


Hirokiのアイコン
【Hiroki】 インストールできました!これで準備完了ですね。

Webページの情報を取得してみよう(Requests)


Yukiのアイコン
【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のアイコン
【Hiroki】 おぉ、これだけでWebサイトの内容が取れるんですね!response.status_code が200かどうかを確認するのは、何かの儀式みたいなものですか?


Yukiのアイコン
【Yuki】 ふふ、そうかもしれませんね。でも大切な確認です。 Webサイトが存在しなかったり、アクセスが拒否されたりすると、404や403といったエラーコードが返ってきます。 正常に取得できたことを確認してから処理を進めるのは、プログラムが予期せぬ止まり方をしないための、優しい配慮だと思ってください……。

HTMLを解析して中身を取り出す(Beautiful Soup 4)


Hirokiのアイコン
【Hiroki】 でも、response.text を表示しただけだと、タグだらけで何が書いてあるかよく分かりません……。ここから特定の文字だけを取り出すにはどうすればいいんですか?


Yukiのアイコン
【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のアイコン
【Hiroki】 すごい!「Welcome to Python.org」って表示されました!タグを取り除いて、中身のテキストだけを抜き出せるんですね。

CSSセレクタを使って高度な抽出をする


Hirokiのアイコン
【Hiroki】 タイトルだけじゃなくて、もっと特定の場所……例えば「ニュースの見出し一覧」みたいに、同じような要素が並んでいる場所をまとめて取るにはどうすればいいんですか?


Yukiのアイコン
【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のアイコン
【Hiroki】 for文を使って、見出しを一つずつ取り出しているんですね。.blog-widget li というのが、場所を特定するための「住所」みたいなもの、ということでしょうか。


Yukiのアイコン
【Yuki】 ええ、その通りです。ブラウザの「開発者ツール(F12キーを押すと出てくるもの)」を使うと、その要素がどんなタグで、どんなクラス名(class)やID(id)を持っているか調べることができます。 HTMLの構造をじっくり観察して、その「住所」を見つける作業は、少しパズルのようで楽しいかもしれませんね。 ただ、サイトのデザインが変わってしまうと、この「住所」も変わってしまうことがあります。 そうなるとプログラムが動かなくなるので、その時はまた新しい住所を探してあげる必要があります……。

データの保存と実践的なテクニック


Hirokiのアイコン
【Hiroki】 取得したデータを画面に表示するだけじゃなくて、ファイルに保存しておきたい時はどうすればいいですか?


Yukiのアイコン
【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のアイコン
【Yuki】 このように、情報を集めて、整理して、保存する。ここまでの一連の流れがスクレイピングの基本になります。 最初は簡単なサイトから始めて、徐々に自分の欲しい情報を集められるようになると、プログラミングがもっと楽しくなると思いますよ。

動的なサイトへの対応(Selenium)


Hirokiのアイコン
【Hiroki】 Yukiさん、実はさっき自分の好きなサイトで試してみたんですけど、うまく中身が取れなかったんです。ブラウザで見るとちゃんと表示されているのに、response.text を見ると真っ白だったり、読み込み中の表示しかなかったりして……。


Yukiのアイコン
【Yuki】 あ……それはきっと、そのサイトが 「JavaScript」 を使って後からデータを読み込んでいるからですね。 requests は、最初にサーバーから送られてきたHTMLファイルをそのまま受け取るだけなので、その後に実行されるプログラム(JavaScript)によって表示される内容は取得できないんです。


Hirokiのアイコン
【Hiroki】 そんなサイトもあるんですね。どうすればいいんでしょうか?


Yukiのアイコン
【Yuki】 そういった「動的なサイト」をスクレイピングするには、Selenium(セレニウム) というツールを使うことが多いです。 Seleniumは、プログラムから本物のブラウザ(Chromeなど)を遠隔操作する技術です。 実際にブラウザを立ち上げて、ページが完全に読み込まれるのを待ってからデータを取得するので、人間が見ているのとほぼ同じ状態の情報を取ることができます。

ただし、Seleniumは動作が重く、設定も少し複雑になります……。 まずは RequestsBeautiful Soup で基本的な構造を理解してから、必要に応じて挑戦してみるのがいいかもしれませんね。

まとめ:技術を正しく使うために


Hirokiのアイコン
【Hiroki】 今日はありがとうございました!スクレイピングって、ただ情報を取るだけじゃなくて、相手への思いやりや、HTMLの構造を読み解く力が必要なんですね。


Yukiのアイコン
【Yuki】 はい。技術を身につけることは素晴らしいことですが、それと同じくらい、その技術をどう使うかが大切だと思います。 インターネットの世界は、お互いの信頼とルールで成り立っています。 Hirokiくんが、ルールを守って、誰かの役に立つような素敵なツールを作れるようになるのを、わたしも応援しています……。

もし、HTMLの解析で行き詰まったり、もっと効率的なデータの整理方法が知りたくなったら、いつでも聞いてくださいね。 わたしも、Hirokiくんと一緒に学べる時間を大切にしたいと思っていますから。


Hirokiのアイコン
【Hiroki】 はい!まずは自分の興味のあるニュースを集めるツールから作ってみます。また分からないことがあったら教えてください!


Yukiのアイコン
【Yuki】 ええ、喜んで。次は、取得したデータをどうやって美しく整形するか、なんてお話もできるといいですね。 焦らずに、一歩ずつ進んでいきましょう。 それじゃあ、今日はこの辺りで……お疲れ様でした。

参考サイト



「スクレイピング」のサンプルコードを見る

< 機械学習
コラム一覧に戻る
データ分析 >

この記事では基礎を解説しましたが、実務においては「もっと複雑なデータを扱いたい」「独自のシステムに組み込みたい」といった、個別の課題に直面することも多いはずです。

「自分で書く時間は最小限に抑え、プロの品質でツールを完成させたい」という方は、ぜひ一度ご相談ください。

「教わる」だけでなく「形にする」パートナーとして、フリーランスエンジニアのmei_13が最短ルートでの解決をサポートします。

➡ ココナラで制作・相談を依頼する(見積もり無料)


初心者から始められるPythonレッスン

プログラミング未経験者・初心者歓迎!
月額4,000円で質問し放題!!
● 完全オンライン
● 翌日までには必ず返信
● 挫折しない独自の学習メソッド
● 圧倒的高評価!!
テキストベースで時間を選ばない
● 高品質なサンプルコード
詳細はこちら
興味がある方はまず質問だけでもどうぞ!



AIアシスタント Yuki