🐍

Ubuntu 22.04 + Python × Selenium 環境構築まとめ

2022/12/30に公開

はじめに

Ubuntu 22.04上でPython×Seleniumでスクレイピングをするための環境構築をブラウザごとにまとめていきます。
ここで取り扱うブラウザは、Chrome, Microsoft Edge, Firefoxの3つです。
何も考えずにサクッと構築したい人向けなので、細かいことを知りたい方は参考リンクなどからたどっていただければと思います。
※2023年9月17日追記:ブラウザやライブラリなどのバージョン変化が原因の操作性違いは追いきれないところがあるので、そのあたりはご自身でうまく読み替えて頂きたいと思います。

環境

下記環境では構築できることを確認済みです。
OS : Ubuntu 22.04
Python : 3.10.6

sudo を使用している所は適宜パスワード入力をするか、パスワード無しでsudoを使える設定にするかしてうまくやっていただければと思います。

パスワード無しでsudo

visudoによってsudoersファイルを編集します。
ここではエディタとしてnanoを使います。nanoが入っていない場合はインストールしておきます。

$ sudo apt install -y nano
$ sudo visudo

nanoが起動したら、

/etc/suders
...
# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL

# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL

# See sudoers(5) for more information on "@include" directives:

@includedir /etc/sudoers.d

のように出てくるので、下記のように追記します。

/etc/suders
[ユーザー名] ALL=NOPASSWD: ALL

あとは[Ctrl + X]→[Y]→[Enter]で保存してnanoを閉じます。

Selenium

$ pip install selenium

Chrome

Chromeのインストール

$ sudo apt -y update
$ sudo apt install -y wget
$ wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
$ sudo apt install -y ./google-chrome-stable_current_amd64.deb
$ sudo apt install -y -f

インストールできたかは下記コマンドのように確認できます。

$ google-chrome -version
Google Chrome 108.0.5359.124

chromedriverのインストール

chromedriver-autoinstallerライブラリを使用してPythonで処理を行います。

$ pip install chromedriver-autoinstaller
$ python3 setting_chromedriver.py
setting_chromedriver.py
#!/usr/bin/env python3

import os
import chromedriver_autoinstaller

if __name__=='__main__':
    chrome_ver = chromedriver_autoinstaller.get_chrome_version().split('.')[0]
    driver_path = f'./{chrome_ver}/chromedriver'
    if os.path.exists(driver_path):
        print(f"chrom driver is insatlled: {driver_path}")
    else:
        print(f"install the chrome driver(ver: {chrome_ver})")
        chromedriver_autoinstaller.install(True)
        os.system(f'sudo cp {driver_path} /usr/local/bin/')
        os.system('sudo chmod 755 /usr/local/bin/chromedriver')

インストールできたかは下記コマンドのように確認できます。

$ which chromedriver
/usr/local/bin/chromedriver

Microsoft Edge

Microsoft Edgeのインストール

こちらの「コマンドラインからインストール」の項で、
「チャネル」のプルダウンから開発チャネルかベータチャネルを選択します。
ここでは開発チャネルをインストールします。

Platform : Debian / Ubuntu
Channel : 開発チャネル

$ sudo apt install -y curl
$ curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg
$ sudo install -o root -g root -m 644 microsoft.gpg /usr/share/keyrings/
$ sudo sh -c 'echo "deb [arch=amd64 signed-by=/usr/share/keyrings/microsoft.gpg] https://packages.microsoft.com/repos/edge stable main" > /etc/apt/sources.list.d/microsoft-edge-dev.list'
$ sudo rm microsoft.gpg
$ sudo apt update
$ sudo apt install microsoft-edge-dev

インストールできたかは下記コマンドのように確認できます。

$ microsoft-edge --version
Microsoft Edge 110.0.1556.0 dev

msedgedriverのインストール

こちらもPythonを使って処理を行っていきます。

$ sudo apt install -y zip unzip
$ python3 setting_msedgedriver.py
setting_msedgedriver.py
#!/usr/bin/env python3

import os
import subprocess
import re

if __name__=='__main__':
    command = ['microsoft-edge','--version']
    res = subprocess.run(command,stdout=subprocess.PIPE,stderr=subprocess.STDOUT)
    l = str(res.stdout)
    ver = re.sub('[^0-9\.]','',l)
    link = f'https://msedgedriver.azureedge.net/{ver}/edgedriver_linux64.zip'
    os.system(f'wget {link}')
    os.system('unzip edgedriver_linux64.zip')
    os.system('sudo mv msedgedriver /usr/local/bin/')

インストールできたかは下記コマンドのように確認できます。

$ which msedgedriver
/usr/local/bin/msedgedriver

Firefox

Firefoxのインストール

snap版のFirefoxにもいろいろと問題があるようなので、ここではMozilla Firefox の deb パッケージ版をインストールします。
一行目のsnap版のremoveはsnap版が既に入っている人向けです。

$ sudo snap remove firefox
$ sudo apt install -y software-properties-common
$ sudo add-apt-repository -y ppa:mozillateam/ppa
## [Enter]か[Ctrl + C]を押下するように言われるので、[Enter]を押下

$ cat <<EOF > mozillateamppa
Package: firefox*
Pin: release o=LP-PPA-mozillateam
Pin-Priority: 1001
EOF
$ sudo mv mozillateamppa /etc/apt/preferences.d/mozillateamppa
$ sudo apt -y update
$ sudo apt install -y firefox

インストールできたかは下記コマンドのように確認できます。

$ firefox --version
Mozilla Firefox 108.0.1

geckodriverのインストール

geckodriverはGitHubからファイルをダウンロードしてくるので、この処理もPythonで行いたいと思います。

$ pip install requests
$ pip install beautifulsoup4
$ python3 setting_geckodriver.py
setting_geckodriver.py
#!/usr/bin/env python3

import os
import requests
from bs4 import BeautifulSoup
import re

## geckodriverの最新版の64ビット用のtar.gzのダウンロードリンクを取得
res = requests.get('https://github.com/mozilla/geckodriver/releases')
soup = BeautifulSoup(res.content,'html.parser')
href = soup.find('a',{'href':re.compile('.*linux64.tar.gz')}).get('href')

## 取得するhrefは/mozillaからになっているのでプロトコルとドメインを追加
base = 'https://github.com'

## ダウンロードリンク
link = base + href

os.system(f'wget {link}')
os.system('tar -zxvf *.tar.gz')
os.system('sudo chmod +x geckodriver')
os.system('sudo mv geckodriver /usr/local/bin')

インストールできたかは下記コマンドのように確認できます。

$ which geckodriver
/usr/local/bin/geckodriver

おまけ:Selenium挙動確認

Yahooのトップページのcurrent_urlとh1タグのテキストを取得してくることで正常に各ブラウザ用の環境が整っているか確認します。
以下のいずれのコードでも、下記のように出力されれば成功です。

$ python3 [ブラウザごとの.pyファイル名]
https://www.yahoo.co.jp/
Yahoo! JAPAN

Chrome

chrome_selenium.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome import service as chs
from selenium.webdriver.common.by import By

# driverの準備
executable_path=r"/usr/local/bin/chromedriver"

options = Options()

## ユーザーエージェントの指定
UA = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36' 
options.add_argument('--user-agent=' + UA)  ## ユーザーエージェントの設定


### その他optionsの指定
options.add_argument('--no-sandbox')  ## Sandboxの外でプロセスを動作させる
options.add_argument('--headless')  ## ブラウザを表示しない CLIで起動する際は必須
options.add_argument('--disable-dev-shm-usage')  ## /dev/shmパーティションの使用を禁止し、パーティションが小さすぎることによる、クラッシュを回避する。

## driverの作成
chrome_servie = chs.Service(executable_path=executable_path)
driver = webdriver.Chrome(options=options,service=chrome_servie)

url = 'https://www.yahoo.co.jp/'  ## Yahoo
driver.get(url)  ## リクエストを送信

print(driver.current_url)
print(driver.find_element(By.TAG_NAME,'h1').text)

driver.quit()

Microsoft Edge

msedge_selenium.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from selenium import webdriver
from selenium.webdriver.edge.options import Options
from selenium.webdriver.edge import service
from selenium.webdriver.common.by import By

#driverの準備
executable_path=r"/usr/local/bin/msedgedriver"
edge_service = service.Service(executable_path=executable_path)
options = Options()

## ユーザーエージェントの指定
UA = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36' 
options.add_argument('--user-agent=' + UA)  ## ユーザーエージェントの設定

### その他optionsの指定
options.add_argument('--no-sandbox')  ## Sandboxの外でプロセスを動作させる
options.add_argument('--headless')  ## ブラウザを表示しない CLIで起動する際は必須
options.add_argument('--disable-dev-shm-usage')  ## /dev/shmパーティションの使用を禁止し、パーティションが小さすぎることによる、クラッシュを回避する。

driver = webdriver.Edge(service=edge_service, options=options)

url = 'https://www.yahoo.co.jp/'  ## Yahoo
driver.get(url)

print(driver.current_url)
print(driver.find_element(By.TAG_NAME,'h1').text)

driver.quit()

Firefox

firefox_selenium.py
#!/usr/bin/env python
# coding: utf-8

from selenium import webdriver
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.firefox.service import Service as FirefoxService
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

## geckodriverのパス指定
executable_path="/usr/local/bin/geckodriver"

## optionの設定
options = Options()

### ユーザーエージェントの設定
user_agent = 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:102.0) Gecko/20100101 Firefox/102.0'
options.add_argument('--user-agent=' + user_agent)

### ブラウザの言語設定を日本語にする
options.set_preference("intl.accept_languages", "jpn")

### その他optionsの指定
options.add_argument('--no-sandbox')  ## Sandboxの外でプロセスを動作させる
options.add_argument('--headless')  ## ブラウザを表示しない CLIで起動する際は必須
options.add_argument('--disable-dev-shm-usage')  ## /dev/shmパーティションの使用を禁止し、パーティションが小さすぎることによる、クラッシュを回避する。

## driverの作成
service = FirefoxService(executable_path=executable_path)
driver = webdriver.Firefox(options=options,service=service)

url = 'https://www.yahoo.co.jp/'  ## Yahoo
driver.get(url)

print(driver.current_url)
print(driver.find_element(By.TAG_NAME,'h1').text)

driver.quit()

まとめ

手打ちのコマンドの部分はシェルスクリプトなどにまとめると、爆速構築ができると思います。

参考

Discussion