Webスクレイピングとテストのためのブラウザ設定自動化:完全なソリューション

はじめに

Web自動化ツールは、複数のオンラインプラットフォームを扱う開発者、テスター、デジタルマーケターにとって欠かせないものです。自動テストを実行する場合でも、データをスクレイピングする場合でも、複数サイトにまたがってコンテンツを管理する場合でも、信頼できるブラウザ環境は重要です。特にブラウザとそのWebDriverの互換性を保つ必要があるため、セットアップはしばしば面倒になります。

課題

多くの開発者は、ブラウザ自動化環境を準備するときに同じような問題に直面します。

  • ブラウザとドライバーのバージョン不一致
  • ディスプレイパラメータ設定時の構成ミス
  • 各マシンで繰り返される手動セットアップ
  • 複数Webサイトにまたがるセッション管理

YouTube、小紅書、抖音などのプラットフォームを扱う場合、特にヘッドレス環境やXサーバーのディスプレイが関係する環境では、こうした問題がよりはっきり現れます。

包括的なソリューション

これらの問題に対処するために、私はWeb自動化向けにChromeまたはChromiumをセットアップするプロセスを自動化するスクリプトを作成しました。このスクリプトは、ブラウザのインストール、ドライバーのダウンロード、環境設定、エイリアス設定を一度に処理します。

主な機能

  • ブラウザ選択:ChromeまたはChromiumのどちらかをインストールできます。
  • 自動バージョン照合:ブラウザのバージョンを検出し、対応するドライバーをダウンロードします。
  • 設定可能なディスプレイ:0:1など、Xディスプレイサーバーを指定できます。
  • 事前設定済みエイリアス:主要プラットフォーム向けに、すぐ使えるコマンドを作成します。
  • 検証:ブラウザ、ドライバー、エイリアスが利用可能か確認します。

スクリプトの使い方

このスクリプトは、シンプルでありながら柔軟に使えるよう設計されています。

# デフォルトでの基本的な使い方:Chrome と display :0
./install_chrome_driver_for_selenium.sh

# Chrome の代わりに Chromium をインストール
./install_chrome_driver_for_selenium.sh chromium

# 別のディスプレイを使用
./install_chrome_driver_for_selenium.sh --display=:1

# オプションを組み合わせる
./install_chrome_driver_for_selenium.sh chromium --display=:2

新しいLinuxマシンで実行する前に、通常必要な依存関係が利用可能であることを確認してください。

sudo apt update
sudo apt install -y wget gpg unzip

このスクリプトはaptを備えたDebianまたはUbuntu系の環境を想定しており、ドライバーを/usr/local/binに書き込むため、インストール手順ではsudoを使用します。

スクリプト

#!/bin/bash
# install_chrome_driver_for_selenium.sh
# Automatically installs Chrome/Chromium, the matching driver, and sets up aliases
# Usage: ./install_chrome_driver_for_selenium.sh [chrome|chromium] [--display=:X]

set -e  # Exit on error

# Function to display usage
usage() {
    echo "Usage: $0 [chrome|chromium] [--display=:X]"
    echo "  chrome|chromium - Browser to install (default: chrome)"
    echo "  --display=:X    - X display to use (default: :0)"
    echo "Examples:"
    echo "  $0                      # Install Chrome with display :0"
    echo "  $0 chromium             # Install Chromium with display :0"
    echo "  $0 chrome --display=:1  # Install Chrome with display :1"
}

# Function to install Chrome
install_chrome() {
    echo "=== Installing Google Chrome ==="

    # Check if Chrome is already installed
    if command -v google-chrome &> /dev/null; then
        echo "Google Chrome is already installed."
    else
        echo "Adding Google Chrome repository..."
        wget -q -O - https://dl.google.com/linux/linux_signing_key.pub | sudo gpg --dearmor -o /usr/share/keyrings/google-chrome-keyring.gpg
        echo "deb [arch=amd64 signed-by=/usr/share/keyrings/google-chrome-keyring.gpg] http://dl.google.com/linux/chrome/deb/ stable main" | sudo tee /etc/apt/sources.list.d/google-chrome.list > /dev/null

        echo "Updating package lists..."
        sudo apt update

        echo "Installing Google Chrome..."
        sudo apt install -y google-chrome-stable
    fi
}

# Function to install Chromium
install_chromium() {
    echo "=== Installing Chromium ==="

    # Check if Chromium is already installed
    if command -v chromium-browser &> /dev/null; then
        echo "Chromium is already installed."
    else
        echo "Installing Chromium..."
        sudo apt update
        sudo apt install -y chromium-browser
    fi
}

# Function to get Chrome version
get_chrome_version() {
    echo "=== Detecting Chrome version ==="
    CHROME_VERSION=$(google-chrome --version | cut -d ' ' -f 3)
    echo "Detected Google Chrome version: $CHROME_VERSION"
}

# Function to get Chromium version
get_chromium_version() {
    echo "=== Detecting Chromium version ==="
    CHROMIUM_VERSION=$(chromium-browser --version | cut -d ' ' -f 2)
    echo "Detected Chromium version: $CHROMIUM_VERSION"
}

# Function to download Chrome Driver
download_chrome_driver() {
    echo "=== Downloading Chrome Driver for version $CHROME_VERSION ==="

    # Download the appropriate driver
    wget -q -O chromedriver.zip "https://storage.googleapis.com/chrome-for-testing-public/$CHROME_VERSION/linux64/chromedriver-linux64.zip"

    # Unzip the driver
    unzip -q -o chromedriver.zip

    # Move to /usr/local/bin
    sudo mv chromedriver-linux64/chromedriver /usr/local/bin/chromedriver
    sudo chmod +x /usr/local/bin/chromedriver

    # Clean up
    rm -rf chromedriver.zip chromedriver-linux64

    echo "Chrome Driver installed to /usr/local/bin/chromedriver"
}

# Function to download Chromium Driver (uses chrome driver underneath)
download_chromium_driver() {
    echo "=== Downloading Chromium Driver for version $CHROMIUM_VERSION ==="

    # Download the appropriate driver
    # Note: For newer versions, Chromium uses the same driver as Chrome
    wget -q -O chromedriver.zip "https://storage.googleapis.com/chrome-for-testing-public/$CHROMIUM_VERSION/linux64/chromedriver-linux64.zip"

    # Unzip the driver
    unzip -q -o chromedriver.zip

    # Move to /usr/local/bin
    sudo mv chromedriver-linux64/chromedriver /usr/local/bin/chromedriver
    sudo chmod +x /usr/local/bin/chromedriver

    # Create a symlink for chromium-driver if it doesn't exist
    if [ ! -f /usr/local/bin/chromium-driver ]; then
        sudo ln -s /usr/local/bin/chromedriver /usr/local/bin/chromium-driver
    fi

    # Clean up
    rm -rf chromedriver.zip chromedriver-linux64

    echo "Chromium Driver installed to /usr/local/bin/chromedriver with symlink at /usr/local/bin/chromium-driver"
}

# Function to set up the aliases
setup_chrome_aliases() {
    echo "=== Setting up Chrome aliases with display $DISPLAY_NUM ==="

    # Create the scripts directory if it doesn't exist
    mkdir -p ~/scripts

    # Create the aliases file with the specified display
    cat > ~/scripts/chrome_aliases.sh << EOF
#!/bin/bash
# Chrome aliases for various platforms
# Generated by install_chrome_driver_for_selenium.sh

# Create logs directory if it doesn't exist
mkdir -p "$HOME/chrome_dev_session_logs"

# Chrome aliases with DISPLAY=$DISPLAY_NUM
alias start_chrome_xhs='DISPLAY=$DISPLAY_NUM google-chrome --hide-crash-restore-bubble --remote-debugging-port=5003 --user-data-dir="$HOME/chrome_dev_session_5003" https://creator.xiaohongshu.com/creator/post > "$HOME/chrome_dev_session_logs/chrome_xhs.log" 2>&1'
alias start_chrome_douyin='DISPLAY=$DISPLAY_NUM google-chrome --hide-crash-restore-bubble --remote-debugging-port=5004 --user-data-dir="$HOME/chrome_dev_session_5004" https://creator.douyin.com/creator-micro/content/upload > "$HOME/chrome_dev_session_logs/chrome_douyin.log" 2>&1'
alias start_chrome_bilibili='DISPLAY=$DISPLAY_NUM google-chrome --hide-crash-restore-bubble --remote-debugging-port=5005 --user-data-dir="$HOME/chrome_dev_session_5005" https://member.bilibili.com/platform/upload/video/frame > "$HOME/chrome_dev_session_logs/chrome_bilibili.log" 2>&1'
alias start_chrome_shipinhao='DISPLAY=$DISPLAY_NUM google-chrome --hide-crash-restore-bubble --remote-debugging-port=5006 --user-data-dir="$HOME/chrome_dev_session_5006" https://channels.weixin.qq.com/post/create > "$HOME/chrome_dev_session_logs/chrome_shipinhao.log" 2>&1'
alias start_chrome_youtube='DISPLAY=$DISPLAY_NUM google-chrome --hide-crash-restore-bubble --remote-debugging-port=9222 --user-data-dir="$HOME/chrome_dev_session_9222" https://youtube.com/upload > "$HOME/chrome_dev_session_logs/chrome_youtube.log" 2>&1'
alias start_chrome_without_y2b='start_chrome_xhs & start_chrome_douyin & start_chrome_bilibili'
alias start_chrome_all='start_chrome_xhs & start_chrome_douyin & start_chrome_bilibili & start_chrome_shipinhao & start_chrome_youtube'
EOF

    # Make the file executable
    chmod +x ~/scripts/chrome_aliases.sh

    # Check if already sourced in .bashrc
    if ! grep -q "source ~/scripts/chrome_aliases.sh" ~/.bashrc; then
        echo "# Source Chrome aliases" >> ~/.bashrc
        echo "source ~/scripts/chrome_aliases.sh" >> ~/.bashrc
        echo "Added source command to ~/.bashrc"
    else
        echo "Chrome aliases already sourced in ~/.bashrc"
    fi

    # Source the file in the current session
    source ~/scripts/chrome_aliases.sh

    echo "Chrome aliases have been set up and are ready to use"
}

# Function to set up the aliases for Chromium
setup_chromium_aliases() {
    echo "=== Setting up Chromium aliases with display $DISPLAY_NUM ==="

    # Create the scripts directory if it doesn't exist
    mkdir -p ~/scripts

    # Create the aliases file with the specified display
    cat > ~/scripts/chromium_aliases.sh << EOF
#!/bin/bash
# Chromium aliases for various platforms
# Generated by install_chrome_driver_for_selenium.sh

# Create logs directory if it doesn't exist
mkdir -p "$HOME/chromium_dev_session_logs"

# Chromium aliases with DISPLAY=$DISPLAY_NUM
alias start_chromium_xhs='DISPLAY=$DISPLAY_NUM chromium-browser --hide-crash-restore-bubble --remote-debugging-port=5003 --user-data-dir="$HOME/chromium_dev_session_5003" https://creator.xiaohongshu.com/creator/post > "$HOME/chromium_dev_session_logs/chromium_xhs.log" 2>&1'
alias start_chromium_douyin='DISPLAY=$DISPLAY_NUM chromium-browser --hide-crash-restore-bubble --remote-debugging-port=5004 --user-data-dir="$HOME/chromium_dev_session_5004" https://creator.douyin.com/creator-micro/content/upload > "$HOME/chromium_dev_session_logs/chromium_douyin.log" 2>&1'
alias start_chromium_bilibili='DISPLAY=$DISPLAY_NUM chromium-browser --hide-crash-restore-bubble --remote-debugging-port=5005 --user-data-dir="$HOME/chromium_dev_session_5005" https://member.bilibili.com/platform/upload/video/frame > "$HOME/chromium_dev_session_logs/chromium_bilibili.log" 2>&1'
alias start_chromium_shipinhao='DISPLAY=$DISPLAY_NUM chromium-browser --hide-crash-restore-bubble --remote-debugging-port=5006 --user-data-dir="$HOME/chromium_dev_session_5006" https://channels.weixin.qq.com/post/create > "$HOME/chromium_dev_session_logs/chromium_shipinhao.log" 2>&1'
alias start_chromium_youtube='DISPLAY=$DISPLAY_NUM chromium-browser --hide-crash-restore-bubble --remote-debugging-port=9222 --user-data-dir="$HOME/chromium_dev_session_9222" https://youtube.com/upload > "$HOME/chromium_dev_session_logs/chromium_youtube.log" 2>&1'
alias start_chromium_without_y2b='start_chromium_xhs & start_chromium_douyin & start_chromium_bilibili'
alias start_chromium_all='start_chromium_xhs & start_chromium_douyin & start_chromium_bilibili & start_chromium_shipinhao & start_chromium_youtube'
EOF

    # Make the file executable
    chmod +x ~/scripts/chromium_aliases.sh

    # Check if already sourced in .bashrc
    if ! grep -q "source ~/scripts/chromium_aliases.sh" ~/.bashrc; then
        echo "# Source Chromium aliases" >> ~/.bashrc
        echo "source ~/scripts/chromium_aliases.sh" >> ~/.bashrc
        echo "Added source command to ~/.bashrc"
    else
        echo "Chromium aliases already sourced in ~/.bashrc"
    fi

    # Source the file in the current session
    source ~/scripts/chromium_aliases.sh

    echo "Chromium aliases have been set up and are ready to use"
}

# Function to verify installation
verify_installation() {
    echo "=== Verifying installation ==="

    # Check if Chrome/Chromium is installed
    if [ "$BROWSER_TYPE" = "chrome" ]; then
        if ! command -v google-chrome &> /dev/null; then
            echo "ERROR: Google Chrome is not installed properly"
            exit 1
        fi
        echo "✓ Google Chrome is installed"
    else
        if ! command -v chromium-browser &> /dev/null; then
            echo "ERROR: Chromium is not installed properly"
            exit 1
        fi
        echo "✓ Chromium is installed"
    fi

    # Check if the driver is installed
    if ! command -v chromedriver &> /dev/null; then
        echo "ERROR: Chrome Driver is not installed properly"
        exit 1
    fi
    echo "✓ Chrome Driver is installed"

    # Verify driver version matches browser version
    if [ "$BROWSER_TYPE" = "chrome" ]; then
        CHROME_CURRENT_VERSION=$(google-chrome --version | cut -d ' ' -f 3)
        DRIVER_VERSION=$(chromedriver --version | cut -d ' ' -f 2)

        if [[ "$DRIVER_VERSION" == "$CHROME_CURRENT_VERSION"* ]]; then
            echo "✓ Chrome Driver version $DRIVER_VERSION matches Chrome version $CHROME_CURRENT_VERSION"
        else
            echo "WARNING: Chrome Driver version ($DRIVER_VERSION) might not match Chrome version ($CHROME_CURRENT_VERSION)"
        fi
    else
        CHROMIUM_CURRENT_VERSION=$(chromium-browser --version | cut -d ' ' -f 2)
        DRIVER_VERSION=$(chromedriver --version | cut -d ' ' -f 2)

        if [[ "$DRIVER_VERSION" == "$CHROMIUM_CURRENT_VERSION"* ]]; then
            echo "✓ Chrome Driver version $DRIVER_VERSION matches Chromium version $CHROMIUM_CURRENT_VERSION"
        else
            echo "WARNING: Chrome Driver version ($DRIVER_VERSION) might not match Chromium version ($CHROMIUM_CURRENT_VERSION)"
        fi
    fi

    # Check if aliases are set up
    if [ "$BROWSER_TYPE" = "chrome" ]; then
        if ! type start_chrome_youtube &> /dev/null; then
            echo "WARNING: Chrome aliases are not loaded in the current session"
            echo "Please run: source ~/.bashrc"
        else
            echo "✓ Chrome aliases are set up correctly"
        fi
    else
        if ! type start_chromium_youtube &> /dev/null; then
            echo "WARNING: Chromium aliases are not loaded in the current session"
            echo "Please run: source ~/.bashrc"
        else
            echo "✓ Chromium aliases are set up correctly"
        fi
    fi

    echo ""
    echo "Installation completed successfully!"
    if [ "$BROWSER_TYPE" = "chrome" ]; then
        echo "You can now use the following commands:"
        echo "  start_chrome_xhs       - Start Chrome for Xiaohongshu"
        echo "  start_chrome_douyin    - Start Chrome for Douyin"
        echo "  start_chrome_bilibili  - Start Chrome for Bilibili"
        echo "  start_chrome_shipinhao - Start Chrome for Shipinhao"
        echo "  start_chrome_youtube   - Start Chrome for YouTube"
        echo "  start_chrome_without_y2b - Start Chrome for all except YouTube"
        echo "  start_chrome_all       - Start Chrome for all platforms"
    else
        echo "You can now use the following commands:"
        echo "  start_chromium_xhs       - Start Chromium for Xiaohongshu"
        echo "  start_chromium_douyin    - Start Chromium for Douyin"
        echo "  start_chromium_bilibili  - Start Chromium for Bilibili"
        echo "  start_chromium_shipinhao - Start Chromium for Shipinhao"
        echo "  start_chromium_youtube   - Start Chromium for YouTube"
        echo "  start_chromium_without_y2b - Start Chromium for all except YouTube"
        echo "  start_chromium_all       - Start Chromium for all platforms"
    fi

    echo ""
    echo "Using display: $DISPLAY_NUM"
    echo "Note: If the aliases aren't available, run 'source ~/.bashrc' to load them"
}

# Default values
BROWSER_TYPE="chrome"
DISPLAY_NUM=":0"

# Parse command line arguments
while [[ $# -gt 0 ]]; do
    case $1 in
        chrome|chromium)
            BROWSER_TYPE="$1"
            shift
            ;;
        --display=*)
            DISPLAY_NUM="${1#*=}"
            shift
            ;;
        --help|-h)
            usage
            exit 0
            ;;
        *)
            echo "Unknown option: $1"
            usage
            exit 1
            ;;
    esac
done

# Main execution
echo "Installing $BROWSER_TYPE and its WebDriver..."
echo "Using display: $DISPLAY_NUM"

# Install the selected browser
if [ "$BROWSER_TYPE" = "chrome" ]; then
    install_chrome
    get_chrome_version
    download_chrome_driver
    setup_chrome_aliases
else
    install_chromium
    get_chromium_version
    download_chromium_driver
    setup_chromium_aliases
fi

# Verify installation
verify_installation

echo "Done!"

コンポーネントを理解する

ブラウザとドライバーのインストール

このスクリプトはまず、インストールするブラウザをChromeまたはChromiumのどちらにするか判定します。次に、ブラウザがまだ存在しない場合はインストールします。バージョン番号を検出した後、GoogleのChrome for Testingリポジトリから対応するWebDriverをダウンロードします。

実際には、ブラウザのパッケージングはディストリビューションによって異なることがあります。検出された正確なバージョンがChrome for Testingのストレージパスで利用できない場合は、インストール済みブラウザのバージョンをローカルで確認し、公式のChrome for Testing availabilityページから最も近い互換性のある安定版ドライバーをダウンロードしてください。

ディスプレイ設定

Xディスプレイ設定は、特にDockerコンテナ、仮想デスクトップ、リモートサーバーでのブラウザ自動化において重要です。--displayオプションを使うと、ブラウザエイリアスが使用するディスプレイを選択できます。

たとえば、自動化用デスクトップが:1で動作している場合は、次のようにセットアップを起動します。

./install_chrome_driver_for_selenium.sh chrome --display=:1

アクティブなディスプレイは、次のようなコマンドで確認できます。

echo "$DISPLAY"
xdpyinfo -display :1 >/dev/null && echo "display is available"

生産性を高めるエイリアス

特に便利な機能の一つが、複数プラットフォーム向けにすぐ使えるエイリアスを作成することです。

  • start_chrome_youtube:YouTubeのアップロードページをChromeで開きます。
  • start_chrome_douyin:抖音のクリエイターポータルをChromeで開きます。
  • start_chrome_bilibili:Bilibiliのアップロード画面をChromeで開きます。
  • start_chrome_xhs:小紅書のクリエイターページをChromeで開きます。
  • start_chrome_shipinhao:WeChat Channelsの投稿作成画面をChromeで開きます。

各エイリアスは、別々のリモートデバッグポートと別々のユーザーデータディレクトリを使用します。これにより、セッションを分離しやすくなる一方で、Selenium、Playwright、または直接Chrome DevTools Protocolを使うクライアントなどの自動化ツールが、実行中のブラウザへ接続できるようになります。

インストール後、エイリアスがすぐに利用できない場合は、シェル設定を再読み込みしてください。

source ~/.bashrc

次に、エイリアスが存在することを確認します。

type start_chrome_youtube

実際の活用例

このスクリプトは、特に次のような用途で役立ちます。

  • コンテンツクリエイター:複数プラットフォームへのアップロードを管理する人。
  • デジタルマーケター:コンテンツ配信ワークフローを自動化する人。
  • QAエンジニア:一貫したブラウザテスト環境を必要とする人。
  • データサイエンティスト:Webスクレイピング用のブラウザ環境を設定する人。
  • DevOpsチーム:開発マシンやサーバー全体でブラウザ自動化を標準化するチーム。

運用メモ

いくつかの実用的なチェックを行うことで、このセットアップはより信頼性の高いものになります。

  • ドライバー問題をデバッグする前に、google-chrome --versionまたはchromium-browser --versionを実行します。
  • インストール後にchromedriver --versionを実行し、メジャーバージョンをブラウザと比較します。
  • Cookieやセッションが衝突しないよう、各プラットフォームを別々の--user-data-dirに分けます。
  • 同じリモートデバッグポートで無関係な自動化ジョブを実行することは避けます。
  • 認証済みブラウザプロファイルにはアクティブなセッションが含まれる可能性があるため、機密データとして扱います。

まとめ

ブラウザ自動化は、何時間ものセットアップや設定から始まるべきではありません。このスクリプトを使えば、対応するドライバー、設定可能なディスプレイ、一般的なワークフロー向けの便利なエイリアスを備えた、実用的なブラウザ自動化環境を数分で準備できます。

開発者、テスター、コンテンツクリエイター、データワーカーのいずれであっても、このアプローチは反復的なセットアップ作業を取り除き、本来の自動化タスクに集中できるようにします。ワークフローが成長するにつれて、このスクリプトにはさらに多くのエイリアス、追加のブラウザプロファイル、プロジェクト固有の起動フラグを拡張していくこともできます。

Leave a Reply