このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。

【Python入門】Webページの取得方法(スクレイピング)

Webページの取得方法(スクレイピング)

 Web上の情報をプログラムから自動的に取得・処理する技術をスクレイピングと呼びます。スクレイピングの第一歩は「目的のWebページをどう取得するか」です。Pythonでは、標準ライブラリurllibまたは外部ライブラリRequestsのどちらかを利用するのが一般的です。
 ここでは、各ライブラリを使ったWebページのダウンロード方法を解説し、実際に指定URLからHTMLファイルを取得してみます。次のコンテンツ以降でHTMLの解析・データ抽出へと進めるための準備段階として、しっかり理解しましょう。

プログラムのダウンロード

 「ダウンロード」から、JupyterLab で実行できるサンプルプログラムがダウンロードできます。ファイルは、ESET Endpoint Securityでウイルスチェックをしておりますが、ダウンロードとプログラムの実行は自己責任でお願いいたします。

1.スクレイピング用のサンプルHTMLファイル

今回のスクレイピングで対象となるWebページは、以下のようなHTMLファイルとします。

 このHTMLファイルは、URL「https://www.study-pg.com/scraping/scraping1.html」に配置しています。スクレイピングのプログラムのターゲットをこのURLにすることでスクレイピングのプログラムをテストすることができます。

 ローカル開発環境などでは、このHTMLをファイルとして保存し、Webサーバー上に配置すれば同様に動作をテストできます。

「scraping1.html」の内容

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Scraping Test Page</title>
</head>
<body>
  <h1>Scraping Test Page</h1>
  <p>Welcome to our sample HTML page for scraping!</p>
  
  <div>
    <h2>Data Table</h2>
    <table>
      <tr>
        <th>ID</th><th>Name</th><th>Score</th>
      </tr>
      <tr>
        <td>1</td><td>Alice</td><td>85</td>
      </tr>
      <tr>
        <td>2</td><td>Bob</td><td>90</td>
      </tr>
      <tr>
        <td>3</td><td>Charlie</td><td>75</td>
      </tr>
    </table>
  </div>
  
  <div>
    <h2>Links</h2>
    <ul>
      <li><a href="https://example.com/">Example Domain</a></li>
      <li><a href="https://www.python.org/">Python Official</a></li>
    </ul>
  </div>
  
  <footer>
    <p>© 2025 study-pg scraping test</p>
  </footer>
</body>
</html>

このHTMLファイルを開くと下図のように表示されます。

2.標準ライブラリ(urllib)でWebページを取得

2.1.urllibパッケージの概要

 Pythonの標準ライブラリには、Web上のファイル操作を行うurllib パッケージが含まれます。今回は、その中のurllib.request モジュールにあるurlopen 関数を用いてWebページを開き、読み込み処理を行います。

from urllib.request import urlopen

def fetch_webpage_urllib(url):
    """
    urllibを使って指定したURLのページを取得し、内容を表示するサンプル関数。
    """
    with urlopen(url) as web_file:
        for line in web_file:  # 1行ずつ読み込む
            # lineはバイト列(bytes)なので、UTF-8でデコード
            text = line.decode('utf-8', errors='replace')
            print(text, end='')  # 行末に改行を含むのでend=''
  • with urlopen(url) as web_file: : 指定URLを開くと、ファイルのように扱えるオブジェクトが返る。
  • for line in web_file: : Webページを1行ずつバイト列として読み込む。
  • line.decode('utf-8', errors='replace') : バイト列をUTF-8で文字列に変換。文字化けが起きたときerrors='replace'ですべて置換可能。
  • print(text, end='') : 改行コードを二重に挿入しないよう、end=''を使う。

2.2.ローカルファイルに保存する

 Web上のファイルを、そのままローカルのファイルに保存したい場合はバイナリモード('wb')で書き出します。

from urllib.request import urlopen

def download_html_urllib(url, local_filename="download_urllib.html"):
    """
    urllibを使って指定したURLのページを取得し、
    ローカルのHTMLファイルとして保存するサンプル関数。
    """
    with urlopen(url) as web_file:
        with open(local_filename, 'wb') as local_file:
            local_file.write(web_file.read())  # 取得したWebファイルをそのまま書き込み
    print(f"Saved '{url}' to '{local_filename}'.")
  • with open(local_filename, 'wb') as local_file: : 書き込みバイナリモードで開く。
  • local_file.write(web_file.read())read()でWebファイル全体をバイト列として取得し、そのままローカルに書き出し。

3.RequestsライブラリでWebページを取得

3.1.Requestsの概要

 RequestsはPythonでWebアクセスする際に使いやすい外部ライブラリです。標準ライブラリのurllibよりも簡潔なコードで、以下のようにWebページを取得できます。

import requests

def fetch_webpage_requests(url):
    """
    Requestsを使ってURLのページを取得し、内容を表示するサンプル関数。
    """
    response = requests.get(url)        # HTTP GETリクエストを送信
    print(response.text)               # テキストとして出力
  • requests.get(url) : URLにアクセスしてレスポンスを受け取る。
  • response.text : テキスト(文字列)としてHTML内容を取得。
  • response.content : バイナリデータとして取得。

3.2.ローカルファイルに保存する

 Requestsで取得したデータをファイルに保存するのも同様に簡単です。以下ではHTMLを丸ごと書き出す例を示します。

import requests

def download_html_requests(url, local_filename="download_requests.html"):
    """
    Requestsを使って指定したURLのページを取得し、
    ローカルのHTMLファイルとして保存するサンプル関数。
    """
    response = requests.get(url)  # Web上のファイルを取得
    with open(local_filename, "wb") as file:
        file.write(response.content)  # バイナリとして書き込み
    print(f"Saved '{url}' to '{local_filename}'.")
  • response.content : バイナリ形式でデータ取得。
  • .text と異なり、エンコードなどの問題を考えずに丸ごと保存できる。

4.実行例(JupyterLab上でのテスト)

# 実行例: urllibでscraping1.htmlを取得して表示
URL_TARGET = "https://www.study-pg.com/scraping/scraping1.html"
fetch_webpage_urllib(URL_TARGET)

# 次に、同ページをローカルファイルへ保存
download_html_urllib(URL_TARGET, "download_urllib.html")

# Requestsで同ページを取得して表示
fetch_webpage_requests(URL_TARGET)

# Requestsで同ページをローカルファイルへ保存
download_html_requests(URL_TARGET, "download_requests.html")

実行結果

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Scraping Test Page</title>
</head>
<body>
  <h1>Scraping Test Page</h1>
  <p>Welcome to our sample HTML page for scraping!</p>
  
  <div>
    <h2>Data Table</h2>
    <table>
      <tr>
        <th>ID</th><th>Name</th><th>Score</th>
      </tr>
      <tr>
        <td>1</td><td>Alice</td><td>85</td>
      </tr>
      <tr>
        <td>2</td><td>Bob</td><td>90</td>
      </tr>
      <tr>
        <td>3</td><td>Charlie</td><td>75</td>
      </tr>
    </table>
  </div>
  
  <div>
    <h2>Links</h2>
    <ul>
      <li><a href="https://example.com/">Example Domain</a></li>
      <li><a href="https://www.python.org/">Python Official</a></li>
    </ul>
  </div>
  
  <footer>
    <p>© 2025 study-pg scraping test</p>
  </footer>
</body>
</html>Saved 'https://www.study-pg.com/scraping/scraping1.html' to 'download_urllib.html'.
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Scraping Test Page</title>
</head>
<body>
  <h1>Scraping Test Page</h1>
  <p>Welcome to our sample HTML page for scraping!</p>
  
  <div>
    <h2>Data Table</h2>
    <table>
      <tr>
        <th>ID</th><th>Name</th><th>Score</th>
      </tr>
      <tr>
        <td>1</td><td>Alice</td><td>85</td>
      </tr>
      <tr>
        <td>2</td><td>Bob</td><td>90</td>
      </tr>
      <tr>
        <td>3</td><td>Charlie</td><td>75</td>
      </tr>
    </table>
  </div>
  
  <div>
    <h2>Links</h2>
    <ul>
      <li><a href="https://example.com/">Example Domain</a></li>
      <li><a href="https://www.python.org/">Python Official</a></li>
    </ul>
  </div>
  
  <footer>
    <p>© 2025 study-pg scraping test</p>
  </footer>
</body>
</html>
Saved 'https://www.study-pg.com/scraping/scraping1.html' to 'download_requests.html'.

実行後、以下のファイルが生成されます。

  • download_urllib.html
  • download_requests.html

 それぞれテキストエディタやブラウザで開くと、サンプルHTMLファイルの内容が正しく保存されていることを確認できます。

5.構文のポイントとオプション

  1. from urllib.request import urlopen
    urllibの中でurlopen 関数だけをインポートする。ネットワークで取得したデータはバイト列(bytes)として扱う。
  2. requests.get(url, params=None, headers=None, ...)
    GETリクエストを送信する。paramsでクエリパラメータを指定したり、headersでHTTPヘッダを細かく制御したりできる。
  3. エラー対策
    ネットワーク状況によって失敗する可能性があるため、例外処理(try-except)を組み合わせることも多い。
  4. wbモード
    バイナリ書き込み。HTMLや画像などの形式問わず、安全にローカルファイルへ保存するために使う。
  5. 文字エンコーディング
    HTMLのタグやHTTPヘッダなどで指定されるエンコーディングを解析して正しくデコードするのが望ましいが、ここでは簡易的に'utf-8'固定としている。

まとめ

 スクレイピングの第一ステップである「Webページの取得」は、標準ライブラリ(urllib) あるいは Requestsライブラリ を使う方法のどちらかを理解しておけば十分です。Requestsの方が記述量が少なく、エンコーディングを自動処理してくれるなど扱いやすいことが多いため、人気があります。
 次のコンテンツ以降では、特定のデータを抽出するBeautiful Soup(ビューティフルスープ)応などの、より高度なスクレイピング技術を学んでいきます。まずはここで紹介した方法で、ターゲットサイトのHTMLファイルをローカルに取得し、テキストエディタやブラウザで開いてみるところから始めてみましょう。