Linux上でのWebスクレイピング環境構築ガイド

本ガイドでは、Linuxサーバー上でPythonを使用したWebスクレイピング環境を構築する手順について解説します。必要なライブラリ、ブラウザ、および関連ツールのインストール方法から、一般的なエラーへの対処法までを網羅します。

Python 3のセットアップ

Webスクレイピングの基盤として、Python 3をインストールします。ここでは、ソースコードからコンパイルしてインストールする方法を示します。

# 必要なビルドツールのグループと開発ライブラリをインストール
sudo yum -y groupinstall "Development tools"
sudo yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel uuid-devel

# Python 3.7.7のソースコードをダウンロード
wget https://www.python.org/ftp/python/3.7.7/Python-3.7.7.tar.xz

# Pythonをインストールするディレクトリを作成
sudo mkdir -p /usr/local/python3

# ソースコードを解凍し、コンパイル・インストール
tar -xvJf Python-3.7.7.tar.xz
cd Python-3.7.7
./configure --prefix=/usr/local/python3 --enable-optimizations
make && sudo make install

# システム全体でPython 3とpip 3を使えるようにシンボリックリンクを作成
sudo ln -sf /usr/local/python3/bin/python3 /usr/bin/python3
sudo ln -sf /usr/local/python3/bin/pip3 /usr/bin/pip3

Google Chromeブラウザのインストール

SeleniumなどのツールでヘッドレスブラウザとしてChromeを使用するために、Google Chromeをインストールします。

# Google ChromeのRPMパッケージをダウンロード(最新版はGoogleの公式サイトで確認)
# 例: wget https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm

# ダウンロードしたRPMパッケージをローカルインストール
sudo yum localinstall google-chrome-stable_current_x86_64.rpm

pipリポジトリの変更

pipのパッケージダウンロード速度を向上させるため、信頼性の高いミラーサイトに設定を変更することができます。ここでは、中国清華大学のミラーサイトを例に挙げます。

# pipの設定ファイルを作成または編集
mkdir -p ~/.pip
cat <<EOF > ~/.pip/pip.conf
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple/
trusted-host = pypi.tuna.tsinghua.edu.cn
EOF

# または、一時的にコマンドラインで指定
# pip3 install <package_name> -i https://pypi.tuna.tsinghua.edu.cn/simple/

ChromeDriverの導入

SeleniumでGoogle Chromeを制御するために、ChromeDriverが必要です。Chromeのバージョンに対応したChromeDriverをダウンロードし、適切に配置します。

  1. 使用しているChromeブラウザのバージョンを確認し、対応するChromeDriverをChromeDriver Mirrors (Taobao)または公式ダウンロードページからダウンロードします。例:chromedriver_linux64.zip
  2. ダウンロードしたファイルを解凍します。
  3. 解凍したchromedriver実行ファイルを/usr/local/binや/usr/binなど、PATHが通っているディレクトリにアップロードします。
  4. 実行権限を付与します。
# 例: ChromeDriver 2.41 をダウンロード・配置
# wget http://npm.taobao.org/mirrors/chromedriver/2.41/chromedriver_linux64.zip
# unzip chromedriver_linux64.zip
sudo mv chromedriver /usr/local/bin/chromedriver
sudo chmod +x /usr/local/bin/chromedriver

PhantomJSのインストール

PhantomJSはヘッドレスWebkitブラウザで、かつてはヘッドレススクレイピングによく利用されました。現代ではChromeのヘッドレスモードが推奨されますが、特定の場合にはまだ有用です。

  1. PhantomJS公式サイトからLinux版のアーカイブをダウンロードします。
  2. ダウンロードしたファイルをサーバーにアップロードし、解凍します。
  3. 解凍したディレクトリ名をphantomjsなど、わかりやすい名前に変更し、/usr/localディレクトリに移動します。
  4. 必要な依存ライブラリをインストールします。
  5. 実行ファイルへのシンボリックリンクを作成します。
# 例: PhantomJS 2.1.1をダウンロード・配置
# wget https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-2.1.1-linux-x86_64.tar.bz2
# tar -xvf phantomjs-2.1.1-linux-x86_64.tar.bz2
sudo mv phantomjs-2.1.1-linux-x86_64 /usr/local/phantomjs

# 依存環境のインストール
sudo yum -y install fontconfig freetype freetype-devel fontconfig-devel libstdc++

# シンボリックリンクの作成
sudo ln -s /usr/local/phantomjs/bin/phantomjs /usr/bin/phantomjs

よくあるエラーとその対処法

エラー: unknown error: DevToolsActivePort file doesn't exist (Chrome/Selenium)

Linux環境でrootユーザーとしてChromeをヘッドレスモードで実行する際に発生しやすいエラーです。SeleniumのChromeOptionsに特定の引数を追加することで解決できます。

from selenium import webdriver
from selenium.webdriver.chrome.options import Options as ChromeOptions

# Chromeオプションを設定
options = ChromeOptions()
options.add_argument('--headless')          # ヘッドレスモードで実行(GUIなし)
options.add_argument('--no-sandbox')        # サンドボックスを無効化(rootユーザーでの実行に必要)
options.add_argument('--disable-dev-shm-usage') # /dev/shmの使用を無効化(メモリ不足エラー対策)
options.add_argument('--disable-gpu')       # GPUハードウェアアクセラレーションを無効化(一部環境で必要)

# WebDriverの初期化
try:
    driver = webdriver.Chrome(options=options)
    print("WebDriverが正常に初期化されました。")
    # ここでスクレイピング処理を実行
    # driver.get("http://example.com")
    # print(driver.title)
except Exception as e:
    print(f"WebDriverの初期化に失敗しました: {e}")
finally:
    if 'driver' in locals() and driver:
        driver.quit()

エラー: Max retries exceeded with url (requestsライブラリ)

ネットワークの不安定さやサーバーの一時的な応答不能により、requestsライブラリが接続に失敗することがあります。リトライ設定を強化することで、この種のエラーを軽減できます。

import requests
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.retry import Retry

# リトライ戦略の定義
# 最大リトライ回数、バックオフ係数、リトライするステータスコードなどを設定
retry_strategy = Retry(
    total=5, # 最大リトライ回数
    backoff_factor=1, # リトライ間隔の指数関数的な増加係数
    status_forcelist=[429, 500, 502, 503, 504], # リトライするHTTPステータスコード
    allowed_methods=["HEAD", "GET", "OPTIONS"] # リトライを許可するHTTPメソッド
)

# HTTPAdapterをマウントし、リトライ戦略を適用
adapter = HTTPAdapter(max_retries=retry_strategy)
http_session = requests.Session()
http_session.mount("http://", adapter)
http_session.mount("https://", adapter)

# Keep-Aliveを無効にする設定(オプション:接続を毎回閉じることで、リソースリークを防ぐ場合がある)
http_session.headers.update({'Connection': 'close'})

target_url = "https://www.example.com" # ターゲットURL
print(f"URL取得を試行中: {target_url}")

try:
    response = http_session.get(target_url, timeout=10) # タイムアウト設定も重要
    response.raise_for_status() # HTTPエラーが発生した場合に例外を発生させる
    print(f"URL取得成功: ステータスコード {response.status_code}")
    # print(response.text[:200]) # 応答内容の一部を表示
except requests.exceptions.RequestException as e:
    print(f"URL取得失敗: {e}")
finally:
    http_session.close() # セッションを明示的に閉じる

SSH接続が切断され、コマンド実行が中断される問題

PuTTYなどのSSHクライアントでサーバーに接続中に、ネットワークの不安定さやアイドルタイムアウトにより接続が切れてしまうことがあります。screenコマンドを使用すると、SSHセッションが切断されてもコマンドの実行を継続できます。

# screenのインストール
sudo yum install screen -y

# 新しいscreenセッションを作成(例: セッション名 'my_scraper')
screen -S my_scraper

# セッション内でコマンドを実行(例: Pythonスクリプトの実行)
# python3 my_script.py

# セッションからデタッチ(C-a d を押すか、以下のコマンドを入力)
# (SSH接続を切断しても、セッションはバックグラウンドで実行され続ける)
# detach

# 既存のscreenセッションの一覧を表示
screen -ls

# 既存のscreenセッションに再接続(PIDまたはセッション名を指定)
screen -r <PIDまたはセッション名>
# 例: screen -r 12345
# 例: screen -r my_scraper

タグ: Python linux Web Scraping Selenium ChromeDriver

11月2日 01:57 投稿