Pythonでブラウザ操作!初心者でも簡単にできる自動化の基本

python icon
Python

こんにちは、とまだです。

「Pythonでブラウザを操作したい」 「定型作業を自動化したい」

こんな風に思ったことはありませんか?

実は、Pythonを使えばブラウザの操作を自動化できるんです。

毎日同じウェブサイトにログインしてデータを取得したり、フォームに情報を入力したり。 そんな繰り返し作業から解放されます。

今回は、Pythonでブラウザ操作を行う方法を、実践的なコード例とともに解説していきます。

ブラウザ操作の2つのアプローチ

Pythonでブラウザを操作する方法は、大きく分けて2つあります。

それぞれの特徴を理解しておくと、目的に合った方法を選べます。

1. 実際のブラウザを操作する方法

Seleniumなどのツールを使って、ChromeやFirefoxといった実際のブラウザを起動し、操作する方法です。

普段みなさんがブラウザでクリックしたり、文字を入力したりする動作を、プログラムで再現できます。

メリット:

  • JavaScriptが動くページでも操作可能
  • 実際の画面を見ながら確認できる
  • 複雑な操作も実現できる

デメリット:

  • 処理速度が遅め
  • ブラウザとドライバーの準備が必要

2. HTTPリクエストを直接送る方法

requestsやBeautifulSoupを使って、ブラウザを使わずにサーバーと直接やり取りする方法です。

見えないところで通信だけを行うイメージですね。

メリット:

  • 処理が高速
  • リソース消費が少ない
  • サーバーだけで動作可能

デメリット:

  • JavaScriptで生成される内容は取得できない
  • 画面操作の確認ができない

どちらを選ぶかは、対象のウェブサイトや目的によって決まります。

動的なページならSelenium、静的なページならrequestsという使い分けが基本です。

Seleniumでブラウザを自動操作する

それでは、実際にSeleniumを使ってブラウザを操作してみましょう。

セットアップ

まずはSeleniumをインストールします。

pip install selenium

次に、使用するブラウザに対応したWebDriverが必要です。

Chromeを使う場合は、ChromeDriverをダウンロードしてください。 ブラウザのバージョンと合わせることが重要です。

基本的な操作例

実際にGoogleで検索する例を見てみましょう。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time

# Chromeを起動
driver = webdriver.Chrome()

# Googleにアクセス
driver.get("https://www.google.com")

# 検索ボックスを見つける
search_box = driver.find_element(By.NAME, "q")

# 検索ワードを入力
search_box.send_keys("Python 自動化")

# Enterキーを押して検索実行
search_box.send_keys(Keys.RETURN)

# 3秒待つ(結果が表示されるまで)
time.sleep(3)

# 現在のURLを表示
print(f"検索結果のURL: {driver.current_url}")

# ブラウザを閉じる
driver.quit()

このコードでは、以下の流れで処理が進みます。

  1. Chromeブラウザを起動
  2. Googleのトップページにアクセス
  3. 検索ボックスに「Python 自動化」と入力
  4. Enterキーを押して検索
  5. 検索結果のURLを表示
  6. ブラウザを閉じる

実際に画面が動くので、動作を確認しやすいですね。

要素の探し方いろいろ

Seleniumでは、ページ内の要素をさまざまな方法で探せます。

# ID属性で探す
element = driver.find_element(By.ID, "submit-button")

# クラス名で探す
element = driver.find_element(By.CLASS_NAME, "form-input")

# CSSセレクタで探す
element = driver.find_element(By.CSS_SELECTOR, "div.content > p")

# XPathで探す
element = driver.find_element(By.XPATH, "//button[text()='送信']")

どの方法を使うかは、ページの構造によって決めます。

開発者ツールでHTMLを確認しながら、最適な方法を選びましょう。

requestsとBeautifulSoupで効率的にデータ取得

JavaScriptを使わないシンプルなページなら、requestsとBeautifulSoupの組み合わせが便利です。

基本的な使い方

ニュースサイトから記事タイトルを取得する例です。

import requests
from bs4 import BeautifulSoup

# ページを取得
url = "https://example-news.com"
response = requests.get(url)

# HTMLを解析
soup = BeautifulSoup(response.text, "html.parser")

# 記事タイトルを全て取得
titles = soup.find_all("h2", class_="article-title")

# タイトルを表示
for i, title in enumerate(titles, 1):
    print(f"{i}. {title.get_text().strip()}")

このコードの流れは以下の通りです。

  1. requestsでページのHTMLを取得
  2. BeautifulSoupでHTMLを解析
  3. 特定のタグやクラスを指定して要素を抽出
  4. テキストを取り出して表示

Seleniumより高速に動作するので、大量のページを処理する際に向いています。

データの加工と保存

取得したデータをCSVファイルに保存する例も見てみましょう。

import csv

# データを収集
data = []
articles = soup.find_all("article", class_="news-item")

for article in articles:
    title = article.find("h2").get_text().strip()
    date = article.find("span", class_="date").get_text().strip()
    summary = article.find("p", class_="summary").get_text().strip()

    data.append({
        "title": title,
        "date": date,
        "summary": summary
    })

# CSVに保存
with open("news_data.csv", "w", newline="", encoding="utf-8") as f:
    writer = csv.DictWriter(f, fieldnames=["title", "date", "summary"])
    writer.writeheader()
    writer.writerows(data)

print(f"{len(data)}件のデータを保存しました")

このように、取得したデータを構造化して保存できます。

よくあるトラブルと解決方法

要素が見つからないエラー

最もよく遭遇する問題は、「要素が見つからない」というエラーです。

原因はいくつかあります。

1. ページの読み込みが完了していない

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 要素が表示されるまで最大10秒待つ
element = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.ID, "target-element"))
)

2. 動的に生成される要素

JavaScriptで後から追加される要素は、少し待つ必要があります。

# JavaScriptの実行を待つ
time.sleep(2)

# または、要素が現れるまで待機
wait = WebDriverWait(driver, 10)
element = wait.until(
    EC.element_to_be_clickable((By.CLASS_NAME, "dynamic-button"))
)

ログイン処理の自動化

多くのサイトでログインが必要ですが、これも自動化できます。

# ログインページにアクセス
driver.get("https://example.com/login")

# ユーザー名を入力
username_field = driver.find_element(By.ID, "username")
username_field.send_keys("your_username")

# パスワードを入力
password_field = driver.find_element(By.ID, "password")
password_field.send_keys("your_password")

# ログインボタンをクリック
login_button = driver.find_element(By.CSS_SELECTOR, "button[type='submit']")
login_button.click()

# ログイン後のページが表示されるまで待つ
WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.CLASS_NAME, "dashboard"))
)

セキュリティのため、パスワードは環境変数などで管理することをおすすめします。

実務での活用例

在庫確認の自動化

ECサイトの在庫状況を定期的にチェックする例です。

def check_stock(product_url):
    driver.get(product_url)

    try:
        # 在庫状況を確認
        stock_element = driver.find_element(By.CLASS_NAME, "stock-status")
        stock_text = stock_element.text

        if "在庫あり" in stock_text:
            print(f"✅ 在庫あり: {product_url}")
            return True
        else:
            print(f"❌ 在庫なし: {product_url}")
            return False

    except Exception as e:
        print(f"エラー: {e}")
        return False

# 複数の商品をチェック
product_urls = [
    "https://example.com/product1",
    "https://example.com/product2",
    "https://example.com/product3"
]

for url in product_urls:
    check_stock(url)
    time.sleep(1)  # サーバーに負荷をかけないよう待機

レポート作成の自動化

複数のサイトから情報を収集してレポートを作成する例です。

from datetime import datetime

def create_daily_report():
    report_data = []

    # サイト1からデータ取得
    site1_data = scrape_site1()
    report_data.extend(site1_data)

    # サイト2からデータ取得
    site2_data = scrape_site2()
    report_data.extend(site2_data)

    # レポートを作成
    today = datetime.now().strftime("%Y-%m-%d")
    filename = f"daily_report_{today}.csv"

    with open(filename, "w", newline="", encoding="utf-8") as f:
        writer = csv.DictWriter(f, fieldnames=["source", "title", "value", "date"])
        writer.writeheader()
        writer.writerows(report_data)

    print(f"レポートを作成しました: {filename}")

まとめ

Pythonでのブラウザ操作は、適切なツールを選べば難しくありません。

動的なページや複雑な操作が必要な場合 → Seleniumを使って実際のブラウザを操作

静的なページから情報を取得する場合 → requestsとBeautifulSoupで高速処理

どちらの方法も、基本的な使い方を覚えれば応用が効きます。

定型作業の自動化、データ収集、テスト作業など、さまざまな場面で活用できます。

ただし、利用する際は必ずサイトの利用規約を確認してください。 また、サーバーに負荷をかけないよう、適切な待機時間を設けることも大切です。

この記事で紹介した方法を参考に、ぜひ自動化にチャレンジしてみてください。

共有:

著者について

とまだ

とまだ

フルスタックエンジニア

Learning Next の創設者。Ruby on Rails と React を中心に、プログラミング教育に情熱を注いでいます。初心者が楽しく学べる環境作りを目指しています。

著者の詳細を見る →