Ubuntu 22.04 + Python × Selenium 環境構築まとめ
はじめに
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が起動したら、
...
# 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
のように出てくるので、下記のように追記します。
[ユーザー名] 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
#!/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
#!/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
#!/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
#!/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
#!/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
#!/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()
まとめ
手打ちのコマンドの部分はシェルスクリプトなどにまとめると、爆速構築ができると思います。
参考
- sudo のパスワードを入力なしで使うには
- 【コマンドだけで一番楽】ubuntu 20.04LTS にChromeをインストール
- Python - Selenium chrome driverの自動インストール
- Microsoft Edge Insider Channels
- Microsoft Edge WebDriver
- Ubuntu 22.04 LTS に Mozilla Firefox の deb パッケージ版を導入する
- Firefoxを含むsnapパッケージとの付き合い方
- Ubuntu Linuxで、add-apt-repositoryしようとして「コマンドがない」って言われたら
- 【Selenium】Ubuntuにgeckodriverをインストールする方法
Discussion