静的HTMLの解析(requests + BeautifulSoup4)
サーバーから返されるHTMLテキストを直接解析する最も軽量なスクレイピング手法です。
Python
import time
import requests
from bs4 import BeautifulSoup
url = "https://example.com/news"
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"}
response = requests.get(url, headers=headers)
response.raise_for_status() # エラー時に例外を発生
soup = BeautifulSoup(response.text, "html.parser")
# 記事タイトル一覧の抽出
titles = [a.get_text(strip=True) for a in soup.select("h2.article-title a")]
動的サイトの自動操作(Playwright)
JavaScriptで描画されるモダンなWebサイトや、ログイン・ボタンクリック等の操作が必要な場合はPlaywrightを活用します。
Python
import asyncio
from playwright.async_api import async_playwright
async def run():
async with async_playwright() as p:
browser = await p.chromium.launch(headless=True)
page = await browser.new_page()
# ログインページへアクセス
await page.goto("https://example.com/login")
await page.fill("#username", "my_user")
await page.fill("#password", "my_password")
await page.click("button[type='submit']")
# 描画待ちとデータ取得
await page.wait_for_selector(".dashboard-data")
content = await page.inner_text(".dashboard-data")
await browser.close()
asyncio.run(run())
定期実行パイプラインの構築(schedule)
収集したデータを一定間隔で自動更新するバックグラウンドタスクを構築します。
Python
import time
import schedule
def job():
print("スクレイピングタスクを実行中...")
# ここに収集・保存ロジックを記述
# 毎日あさ9時に実行
schedule.every().day.at("09:00").do(job)
# 1時間ごとに実行する場合: schedule.every(1).hours.do(job)
while True:
schedule.run_pending()
time.sleep(60)
スクレイピングの法規とマナー
- アクセス間隔の遵守: リクエスト間隔は最低1秒以上(
time.sleep(1))空け、サーバーへ負荷をかけない。 robots.txtの確認: サイト直下のを確認し、(https://example.com/robots.txt)Example DomainDisallow領域の収集は避ける。- 利用規約と著作権: 規約で禁止されていないか確認し、取得データの無断再配布(著作権侵害)を行わない。
5-2. データ分析・ダッシュボード作成の実務
データのクレンジングと前処理
実務で扱うデータには欠損や不整合が含まれます。pandas を用いて一括で綺麗に整えます。
Python
import pandas as pd
import numpy as np
# サンプルデータの読み込み
df = pd.DataFrame({
"date": ["2026-10-01", "2026-10-02", "2026-10-03", None],
"sales": ["1,000", "1,500", np.nan, "2,000"],
"category": [" A ", "B", "A", " B "]
})
# 1. 日付文字列をdatetime型に変換
df["date"] = pd.to_datetime(df["date"])
# 2. カンマ削除と数値型(float)変換
df["sales"] = df["sales"].str.replace(",", "").astype(float)
# 3. 欠損値(NaN)を平均値で補填
df["sales"] = df["sales"].fillna(df["sales"].mean())
# 4. 前後の不要な空白を削除
df["category"] = df["category"].str.strip()
時系列データ(タイムシリーズ)の集計
Python
# 日付インデックスの設定
df.set_index("date", inplace=True)
# 月次(Monthly)単位での合計値をリサンプリング集計
monthly_sales = df.resample("ME")["sales"].sum()
# 7日間移動平均の算出
df["moving_avg"] = df["sales"].rolling(window=7).mean()
Streamlit による高速Webダッシュボードの構築
数行のPythonコードだけで、Webブラウザ上で操作できるデータダッシュボードが立ち上がります。
Python
# app.py として保存し、Terminalで `streamlit run app.py` を実行
import streamlit as st
import pandas as pd
import numpy as np
st.title("📊 リアルタイム売上分析ダッシュボード")
# サイドバーにユーザーコントロールを設置
st.sidebar.header("フィルター設定")
selected_category = st.sidebar.selectbox("カテゴリ選択", ["すべて", "A", "B"])
# データの可視化
chart_data = pd.DataFrame(
np.random.randn(20, 3),
columns=['商品A', '商品B', '商品C']
)
st.subheader("売上推移チャート")
st.line_chart(chart_data)
st.subheader("生データ")
st.dataframe(chart_data)

コメント