🔥

ウェブスクレイピング | Python3

に公開

概要

Python を使ってウェブスクレイピングする場面があったので、そのメモ。Python によるスクレイピングには、静的に HTML を取得する方法と、ブラウザを使って動的に HTML を取得する方法がある。今回は、後者のほうのやり方。

環境

  • Windows 11 x64
  • Python 3.12.10
  • pip 25.0.1

Geckodriver のインストール

Geckodriver には Firefox ブラウザが必要。Chrome 用のものもあるが、今回は使わなかった。また、FireFox のバージョンと Python のバージョンによって、使用する Geckodriver のバージョンを選ぶ必要がある。バージョンの互換性については、このページから確認できる。Geckodrive 本体は、このページからダウンロードする。

依存関係のインストール

pip install selenium webdriver_manager urllib3

コード

scraping.py
import sys
import codecs
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.firefox.service import Service
from webdriver_manager.firefox import GeckoDriverManager
from urllib.parse import urlparse
import time

# 結果出力の文字コードを UTF-8 にする
sys.stdout.reconfigure(encoding="utf-8")

# コマンドライン引数からURLを取得
if len(sys.argv) < 2:
	print("使い方: python script.py {URL}")
	sys.exit(1)

url = sys.argv[1]

# Firefox ドライバーのセットアップ
driver = webdriver.Firefox()

# hogehoge サイトをスクレイピング
def scrape_hogehoge(driver):
	title = driver.find_element(By.CSS_SELECTOR, ".main")
	inner = driver.find_element(By.CSS_SELECTOR, ".inner")
	p = inner.find_element(By.CSS_SELECTOR, "p")
	print(f"{title.text}: {p.text.strip()}")

# piyopiyo サイトをスクレイピング
def scrape_piyopiyo(driver):
	title = driver.find_element(By.CSS_SELECTOR, "h1")
	print(title.text)

# その他のサイトをスクレイピング
def scrape_other_site(driver):
	title = driver.title # h1 はよく使うので勝手に取得してくれる
	print(title)

try:
	# 指定されたURLにアクセス
	driver.get(url)
    # 読み込み完了を待つ
	time.sleep(3)
	# ドメインを取得して処理を振り分け
	domain = urlparse(driver.current_url).netloc

	if "hogehoge.com" in domain:
		scrape_hogehoge(driver)
	elif "piyopiyo.io" in domain:
		scrape_piyopiyo(driver)
	else:
		scrape_other_site(driver)
finally:
	driver.quit()

Discussion