【業務自動化】Chapter4-2:静的ページをスクレイピングしよう

一つ前のページでは Webスクレイピングの基礎 について学習しました。
今回は 静的ページの情報収集 を体験しましょう。
Chapter1:PythonによるExcel自動化の基本を身につけよう
Chapter2:自動化ツールを.exe化して配布しよう
Chapter3:現場で使える便利な自動化ツールを4つ作ろう
Chapter4:Webスクレイピングでデータを自動で集めよう
・Chapter4-1:Webスクレイピングとは何か
・Chapter4-2:静的ページをスクレイピングしよう ◁今回はここ
・Chapter4-3:動的ページをスクレイピングしよう
Chapter5:自動化ツールを作ってお金を稼ごう
業務で扱う情報の多くはインターネット上から入手できますが、毎日手作業でコピー&ペーストするのは非効率です。
Pythonを使えば、Webサイトから自動的にデータを収集し、Excelに整理して保存する仕組みを簡単に作れます。
この記事では 静的ページのスクレイピング をテーマに、Webサイトに表示されているニュース見出しなどを自動で取得し、Excelにまとめる方法を解説します。
静的ページは仕組みがシンプルで初心者でも扱いやすいため、スクレイピングの第一歩として最適です。
静的ページとは|Webスクレイピングで扱いやすいページの種類
Webスクレイピングを行う上で最初に押さえておきたいのが、Webページの種類です。
大きく分けると「静的ページ」と「動的ページ」がありますが、静的ページはその名の通り内容が固定されており、HTMLを取得すればそのまま必要な情報が含まれています。
例えば、企業の会社概要ページや記事本文など、ページを開くたびに内容が変わらないものは静的ページにあたります。
この特徴により、PythonでアクセスしてHTMLを解析するだけで情報を抜き出せるため、初心者がスクレイピングを学ぶ入り口として適しています。


requestsとBeautifulSoup|スクレイピングの基本ライブラリ
Webスクレイピングで静的ページを扱う場合、基本となるのが requests と BeautifulSoup という2つのライブラリです。
- requests はWebサイトにアクセスしてHTMLデータを取得する役割を持ちます。
- BeautifulSoup は取得したHTMLを解析し、欲しい情報だけを抜き出すためのライブラリです。
この2つを組み合わせることで「ページにアクセスしてデータを持ち帰り、その中から必要な部分を切り出す」という一連の流れをシンプルに実現できます。
特に静的ページのスクレイピングでは、この組み合わせが最も基本的で効率的な方法となります。
これらを使用するには事前にインストールしておく必要があります。
インストール方法は 一つ前の記事 で紹介していますので、まだ準備ができていない場合はそちらを参照してください。
requestsの代表的な関数とプロパティ
requestsはWebページにアクセスしてデータを取得するライブラリです。
主に以下の機能を押さえておくと十分活用できます。
ここで全て暗記するのではなく、必要に応じてここに戻ってきて確認するようにしましょう。
| 関数・プロパティ | 説明 |
|---|---|
requests.get(url, params=None, headers=None) | 指定したURLにアクセスしてHTMLを取得する。 クエリやヘッダーを指定可能。 |
requests.post(url, data=None, json=None) | フォームデータやJSONを送信する際に利用。 ログインや検索条件送信に使う。 |
response.status_code | サーバーからのステータスコードを確認。 200=成功、404=ページなし等。 |
response.text | ページのHTMLを文字列として取得。 BeautifulSoupに渡して解析する。 |
BeautifulSoupの代表的な関数とメソッド
BeautifulSoupはHTMLを解析し、欲しい情報を抽出するライブラリです。
以下のようなメソッドがよく使われます。
| 関数・メソッド | 説明 |
|---|---|
BeautifulSoup(html, "html.parser") | HTML文字列を解析して扱いやすい形に変換。 |
soup.find(tag, attrs) | 条件に合う最初のタグを1つ取得。 例: soup.find("h1")。 |
soup.find_all(tag, attrs) | 条件に合うタグをすべてリストで取得。 ニュースやリンク一覧の収集に便利。 |
.get_text(strip=True) | タグの中のテキストを取得。 余計な空白を除去可能。 |
.get("href") | <a> タグのリンク先URLを取得。記事タイトルとURLをセットで収集可能。 |
サンプルスクリプトの紹介|静的ページから見出しとリンクを抽出
ここからは実際に動作するPythonスクリプトを例に、静的ページのスクレイピングを体験していきます。
サンプルコードではニュースサイトにアクセスし、記事の見出しとリンクを収集してExcelに保存する流れを実装しています。
「requests」でWebページのHTMLを取得し、「BeautifulSoup」でニュース見出しとリンクを抽出し、最後に「openpyxl」でExcelに書き込む、という一連の流れを体験できる構成になっています。
このコードでできること|ニュース見出しとリンクの抽出・Excel出力の流れ
サンプルスクリプトを実行すると、次のような処理が自動で行われます。
- ニュースサイト(例:Yahoo!ニュース)のトップページにアクセスする
- ページ内の見出しテキストとリンクURLを収集する
- 収集したデータをExcelファイル(
news_headlines.xlsx)に一覧として保存する - 保存が完了したらメッセージで完了通知を表示する
つまり、これまで手作業でニュースサイトを開いてコピーしていた作業を、Pythonに任せて一括で自動化できるようになります。
日々の情報収集やレポート作成の効率を大幅に向上させられるのがポイントです。
サンプルスクリプト全文
ここでは実際のコード全体を確認してみましょう。
サンプルでは「ニュース見出しを収集してExcelに保存する」という処理を1本のPythonスクリプトで完結させています。
import openpyxl, pathlib, sys, requests
from bs4 import BeautifulSoup
from tkinter import messagebox
# openpyxl: Excelファイルの操作
# pathlib: ファイルやフォルダのパス操作
# sys: 実行環境の判定や終了処理
# requests: WebページにアクセスしてHTMLを取得
# BeautifulSoup: HTMLを解析して必要な情報を抽出
# tkinter.messagebox: エラーや完了メッセージをポップアップで表示
# === 実行環境に応じた基準ディレクトリを設定 ===
# PyInstallerでexe化した場合と、通常のPythonスクリプト実行で動作する場所が異なるため判定している
if getattr(sys, 'frozen', False):
BASE_DIR = pathlib.Path(sys.executable).parent
else:
BASE_DIR = pathlib.Path(__file__).parent
# 保存用フォルダを作成(存在しなければ自動で作る)
file_path = BASE_DIR / "workbooks"
file_path.mkdir(exist_ok=True)
# 出力するExcelファイル名を指定
output_file = file_path / "news_headlines.xlsx"
# === ニュースサイトのURL ===
# 今回はYahoo!ニュースのトップページを例に使用
url = "https://news.yahoo.co.jp/"
# === HTML取得 ===
try:
# requests.getでWebページにアクセスし、HTMLを取得
response = requests.get(url)
# 日本語サイトの場合、文字化け防止のためエンコーディングを推定して設定
response.encoding = response.apparent_encoding
except requests.RequestException as e:
# 接続に失敗した場合はエラーメッセージを表示して終了
messagebox.showerror("エラー", f"ニュースサイトにアクセスできませんでした\n{e}")
sys.exit(1)
# === HTML解析 ===
# BeautifulSoupで取得したHTMLを解析
# "html.parser" はPython標準のHTMLパーサーを利用する指定
soup = BeautifulSoup(response.text, "html.parser")
# 見出し候補を格納するリストを用意
news_data = []
# ページ内のリンク(<a>タグ)をすべて取得
for a in soup.find_all("a"):
# <a>タグのテキスト部分(見出し)を取得
title = a.get_text(strip=True)
# <a>タグのリンク先URLを取得
link = a.get("href")
# 条件を満たすものだけを抽出
# - タイトルが空でない
# - リンクが存在する
# - Yahoo!ニュースのドメインを含んでいる
if title and link and "news.yahoo.co.jp" in link:
news_data.append((title, link))
# 見出しが1つも取得できなかった場合はエラー表示して終了
if not news_data:
messagebox.showerror("エラー", "ニュース見出しが取得できませんでした")
sys.exit(1)
# === Excelに書き込み ===
# 新しいExcelブックを作成
book = openpyxl.Workbook()
sheet = book.active
sheet.title = "ニュース一覧"
# 1行目にヘッダー(列名)を追加
sheet.append(["タイトル", "リンク"])
# 収集したデータをExcelに1行ずつ書き込み
for title, link in news_data:
sheet.append([title, link])
# Excelファイルを保存
book.save(output_file)
# 完了メッセージを表示
messagebox.showinfo("完了", f"ニュース見出しを保存しました!\n保存先: {output_file}")このコードを実行すると、ニュースサイトにアクセスして見出し一覧を収集し、Excelファイルとして保存されます。
サンプルスクリプトの解説|処理の分解とポイント
このサンプルコードは大きく分けて「HTMLの取得」「HTMLの解析」「Excelへの書き込み」という流れで構成されています。
ここでは特に requests と BeautifulSoup に関わる部分を詳しく見ていきましょう。
requestsでWebページにアクセス|HTTPリクエストとレスポンスの確認
response = requests.get(url) response.encoding = response.apparent_encoding # 日本語対策
requests.get(url) を使って指定したニュースサイトにアクセスし、ページのHTMLを取得しています。
日本語サイトでは文字化けを防ぐために、response.apparent_encoding を推定して response.encoding に設定するのがポイントです。
これにより、取得したHTMLを正しく解析できます。
BeautifulSoupでHTMLを解析|パーサー指定と要素探索の基本
soup = BeautifulSoup(response.text, "html.parser")
response.text で取得したHTMLを BeautifulSoup に渡し、解析用のオブジェクトを作成しています。
"html.parser" を指定することで、Python標準のHTMLパーサーを使ってHTMLを扱いやすい構造に変換します。
見出しとリンクを抽出|find_allと属性取得の実例
for a in soup.find_all("a"):
title = a.get_text(strip=True)
link = a.get("href")
if title and link and "news.yahoo.co.jp" in link:
news_data.append((title, link))soup.find_all("a")でページ内のリンク要素(<a>タグ)をすべて取得します。- 各リンクから
get_text(strip=True)で見出しテキストを、get("href")でリンク先URLを取り出しています。 - さらに
if文で「タイトルがあること」「リンクがあること」「リンク先がニュースサイト内であること」を条件に絞り込み、不要なリンクが混ざらないようにしています。
この処理により、ニュース記事の見出しと対応するリンクを一覧として抽出できるのです。
まとめ|静的ページとrequests・BeautifulSoupの基本を押さえよう
この記事では、静的ページのスクレイピング をテーマに、Pythonを使ってニュースサイトの見出しを自動収集し、Excelに保存する方法を学びました。
これにより、ニュース記事の収集や日常的な情報収集を自動化し、Excelに一括保存できる仕組みを作れるようになりました。
まずはこの基本を押さえ、次のステップでは 動的ページのスクレイピング や 差分更新 に進むことで、より実用的な自動化ツールを作れるようになります。


