【業務自動化】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を解析するだけで情報を抜き出せるため、初心者がスクレイピングを学ぶ入り口として適しています。

あわせて読みたい
openpyxl使える関数・メソッド・クラス一覧【Excel自動化の基本リファレンス】
openpyxl使える関数・メソッド・クラス一覧【Excel自動化の基本リファレンス】
【Python】勉強猫がノートパソコンを前にして学習を始める様子。記事内の学習スタート用イラスト

requestsとBeautifulSoup|スクレイピングの基本ライブラリ

Webスクレイピングで静的ページを扱う場合、基本となるのが requestsBeautifulSoup という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出力の流れ

サンプルスクリプトを実行すると、次のような処理が自動で行われます。

  1. ニュースサイト(例:Yahoo!ニュース)のトップページにアクセスする
  2. ページ内の見出しテキストとリンクURLを収集する
  3. 収集したデータをExcelファイル(news_headlines.xlsx)に一覧として保存する
  4. 保存が完了したらメッセージで完了通知を表示する

つまり、これまで手作業でニュースサイトを開いてコピーしていた作業を、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への書き込み」という流れで構成されています。

ここでは特に requestsBeautifulSoup に関わる部分を詳しく見ていきましょう。

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に一括保存できる仕組みを作れるようになりました。

まずはこの基本を押さえ、次のステップでは 動的ページのスクレイピング や 差分更新 に進むことで、より実用的な自動化ツールを作れるようになります。

もっと分かりやすい学習サイトにするために

この記事を読んで「ここが分かりにくかった」「ここが難しかった」等の意見を募集しています。

世界一わかりやすいExcel自動化学習サイトにするため、ぜひ 問い合わせフォーム からご意見下さい。

<<前のページ

業務自動化の記事一覧

次のページ>>

記事URLをコピーしました