【Webスクレイピング入門 第1回】PythonでWebページから情報を取得!requestsとBeautifulSoup4のはじめの一歩 🕵️‍♂️

「Webサイトに載っている情報を、いちいち手でコピー&ペーストするのはもうやめたい…」
「株価や天気、ニュースの見出しを自動で収集するプログラムって作れるの?」
「PythonでWebスクレイピングを始めたいけど、何から手をつければいいか分からない!」

こんにちは! Pythonプログラミング探検隊、隊長のPythonistaです! これまで私たちは、自分のコンピュータの中にあるデータや、自分で作成したデータを扱ってきました。今回から始まる新シリーズ「Webスクレイピング入門」では、いよいよインターネットという広大な情報の海に飛び込み、Webページ上のデータを自動で収集する技術を探求していきます。

そのための強力なツールが、Webページを取得するためのrequestsライブラリと、取得したHTMLを解析してデータを抽出するためのBeautifulSoup4ライブラリです。第1回となる今回は、Webスクレイピングの基本的な仕組みと、絶対に守らなければならない**マナーやルール**、そしてこの2つのライブラリを使った**最初のデータ抽出**までを、ステップバイステップで分かりやすく解説します。この記事を読めば、あなたもWeb情報収集の第一歩を踏み出せます!


1.【最重要】スクレイピングを始める前の「黄金律」 - マナーと注意点

Webスクレイピングは非常に強力な技術ですが、その力を無思慮に使うと、相手のWebサイトに大きな迷惑をかけてしまったり、場合によっては法的な問題に発展したりする可能性もあります。技術を学ぶ前に、まず以下の「黄金律」を心に刻んでください。

  1. サイトの利用規約を確認する: 多くのWebサイトでは、「利用規約」ページにサイトの利用方法に関するルールが記載されています。スクレイピングを明示的に禁止しているサイトもありますので、必ず確認しましょう。
  2. robots.txtを尊重する: 多くのサイトは、https://example.com/robots.txt のようなURLで、プログラム(クローラー)に対して「このページにはアクセスしないでください」という意思表示をしています。このルールは必ず守りましょう。
  3. サーバーに負荷をかけない: プログラムは人間とは比較にならない速さでリクエストを連続して送信できます。これは相手のサーバーにとって、サービスを妨害する攻撃(DoS攻撃)と見なされかねません。複数ページにアクセスする際は、必ずtime.sleep()などを使って、アクセスごとに1秒以上の適切な間隔を空けましょう。
  4. 取得したデータの取り扱いに注意: 収集したデータの著作権は、元のWebサイトの運営者に帰属します。私的利用の範囲を越えて、無断で再配布したり、販売したりすることは著作権侵害にあたります。

私たちは「良き市民」として、技術を正しく、そして敬意をもって利用することを約束しましょう。


2. 探検の準備:スクレイピング用ライブラリのインストール

Webスクレイピングには、主に以下の2つの外部ライブラリが必要です。ターミナルやコマンドプロンプトで、pipを使ってインストールしましょう。

pip install requests beautifulsoup4 lxml

それぞれの役割は以下の通りです。

  • requests: PythonからHTTPリクエストを送信し、WebページのHTMLコンテンツを簡単に取得するためのライブラリです。人間にとって非常に分かりやすい使い方ができます。
  • BeautifulSoup4: `requests`が取得してきた生のHTML文字列を、Pythonが扱いやすいオブジェクトの構造に変換(パース)してくれるライブラリです。HTMLのタグや属性を手がかりに、目的のデータを簡単に探し出すことができます。
  • lxml: `BeautifulSoup4`がHTMLを解析する際に内部で利用する、非常に高速なパーサー(解析エンジン)です。これを入れておくことで、処理速度が向上します。

これで、Webの海を探検するための道具が揃いました!


3. Webスクレイピングの基本的な3ステップ

Webスクレイピングの基本的な流れは、どんなサイトが相手でも、ほとんどの場合以下の3つのステップで構成されます。

  1. HTMLの取得 (Fetch): `requests`を使って、目的のWebページのHTMLデータを取得する。
  2. HTMLの解析 (Parse): `BeautifulSoup4`を使って、取得したHTMLデータをPythonが扱いやすい形に変換する。
  3. データの抽出 (Extract): 解析したデータの中から、必要な情報(テキスト、リンクなど)を抜き出す。

この3ステップを、具体的なコードで見ていきましょう!

ステップ1:HTMLの取得 (`requests`)

まずは、ターゲットとなるWebページのHTMLを取得します。練習として、Pythonの公式サイトの、技術的な内容ではなくシンプルな構造のページ(例: 沿革ページ)を使ってみましょう。

import requests

# ターゲットURL
url = 'https://www.python.org/doc/versions/'

# requests.get()でページにアクセスし、レスポンスを取得
try:
    response = requests.get(url)
    # ステータスコードが200 (OK) であることを確認
    response.raise_for_status() 
    print(f"'{url}' へのアクセスに成功しました。")
    
    # response.text にHTMLの文字列が格納されている
    html_content = response.text
    # print(html_content[:500]) # 最初の500文字だけ表示してみる

except requests.exceptions.RequestException as e:
    print(f"エラー: サイトにアクセスできませんでした - {e}")
    html_content = None

response.raise_for_status()は、アクセスが失敗した場合(404 Not Foundや500 Server Errorなど)にエラーを発生させてくれる便利なメソッドです。

ステップ2:HTMLの解析 (`BeautifulSoup4`)

次に、取得したHTML文字列を、BeautifulSoupが解析できるオブジェクトに変換します。

from bs4 import BeautifulSoup

# html_contentが取得できている前提
if html_content:
    # BeautifulSoupオブジェクトを作成 (第2引数にはパーサーを指定)
    soup = BeautifulSoup(html_content, 'lxml')
    print("\nHTMLの解析が完了しました。")
    
    # soup.prettify()を使うと、整形されたHTMLを見ることができる
    # print(soup.prettify()[:500])

このsoupオブジェクトが、私たちの探検の舞台となります。

ステップ3:データの抽出(要素を見つける)

解析したsoupオブジェクトから、目的のデータを探し出します。

・タグ名で要素を見つける (.find(), .find_all())

# soupオブジェクトが作成されている前提
if 'soup' in locals():
    # 最初に登場する

タグを1つ見つける

h1_tag = soup.find('h1') if h1_tag: print(f"\nページのタイトル(h1): {h1_tag.text}") # 全てのタグ(リンク)を見つける all_a_tags = soup.find_all('a') print(f"ページ内のリンクの数: {len(all_a_tags)}") # 最初の5つのリンクのテキストとURLを表示 print("最初の5つのリンク:") for link in all_a_tags[:5]: link_text = link.text.strip() # .strip()で前後の空白を削除 link_url = link.get('href') # .get('href')でhref属性の値を取得 print(f" - テキスト: {link_text}, URL: {link_url}")

・CSSセレクタで要素を見つける (.select(), .select_one()) - 推奨!

CSSセレクタは、Webページのスタイルを指定する際に使われる記法で、要素をより柔軟かつ直感的に指定できます。こちらの方が強力でおすすめです。

# soupオブジェクトが作成されている前提
if 'soup' in locals():
    # CSSセレクタで

タグを1つ見つける

h1_tag_by_select = soup.select_one('h1') if h1_tag_by_select: print(f"\nページのタイトル(select_one): {h1_tag_by_select.text}") # class="section"の中にある

タグを全て見つける

section_h2_tags = soup.select('div.section h2') print(f"\nセクションの見出し (h2):") for h2 in section_h2_tags: print(f" - {h2.text}")

4. まとめと次回予告

今回は、Webスクレイピング入門の第一歩として、以下の内容を学びました。

  • スクレイピングを行う上で非常に重要なマナーと注意点
  • requestsライブラリでWebページのHTMLを取得する方法。
  • BeautifulSoup4ライブラリでHTMLを解析し、Pythonで扱いやすいオブジェクトにする方法。
  • find(), find_all(), そして強力なselect()を使って、解析したデータから目的の要素を抽出する基本的なテクニック。

これで、あなたもWebページから情報を自動で収集する基本的なスキルを身につけました。これは、データ収集の可能性を大きく広げる強力な一歩です!

さて、今回はシンプルなページから情報を抜き出しましたが、「もし対象がニュースサイトの記事一覧だったら?」「抽出したデータをファイルに保存するにはどうすれば?」といった、より実践的な疑問が湧いてきたのではないでしょうか。

次回、第2回では、いよいよ実践編として、ニュースサイトから記事の見出しとリンクをまとめて抽出し、その結果をCSVファイルに保存するという、より本格的なスクレイピングに挑戦します。ブラウザの開発者ツールの使い方も学びますよ。お楽しみに!

その他の投稿はこちら

コメント

このブログの人気の投稿

タイトルまとめ

これで迷わない!WindowsでPython環境構築する一番やさしい方法 #0

【Python標準ライブラリ完結!】11の冒険をありがとう!君のPython力が飛躍する「次の一歩」とは? 🚀