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()
このコードでは、以下の流れで処理が進みます。
- Chromeブラウザを起動
- Googleのトップページにアクセス
- 検索ボックスに「Python 自動化」と入力
- Enterキーを押して検索
- 検索結果のURLを表示
- ブラウザを閉じる
実際に画面が動くので、動作を確認しやすいですね。
要素の探し方いろいろ
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()}")
このコードの流れは以下の通りです。
- requestsでページのHTMLを取得
- BeautifulSoupでHTMLを解析
- 特定のタグやクラスを指定して要素を抽出
- テキストを取り出して表示
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 を中心に、プログラミング教育に情熱を注いでいます。初心者が楽しく学べる環境作りを目指しています。
著者の詳細を見る →