Seleniumでブラウザ自動操作(スクレイピング)
Raspberry Piでない環境で利用したことのあるSleniumの導入を行いました。
各種WEBツールの自動操作(スクレイピング)などが出来ると、更に自宅IoTの幅が広がると思い、導入してみましたが、「Raspberry Pi 3 Model B+」のCPUが1.2GHz、4コアのBroadcom BCM2837から1.4GHz駆動4コアのBCM2837B0は、32bitでありchromedriverの導入方法が限られ、高い信頼性で動作する状態まで構築出来ておりません。とりあえず動作しますが、信頼性が低いです。(数回に1回は失敗します)
pi@raspberrypi:~ $ cat /proc/cpuinfo processor : 0 model name : ARMv7 Processor rev 4 (v7l) BogoMIPS : 38.40 Features : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm crc32 CPU implementer : 0x41 CPU architecture: 7 CPU variant : 0x0 CPU part : 0xd03 CPU revision : 4 processor : 1 model name : ARMv7 Processor rev 4 (v7l) BogoMIPS : 38.40 Features : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm crc32 CPU implementer : 0x41 CPU architecture: 7 CPU variant : 0x0 CPU part : 0xd03 CPU revision : 4 processor : 2 model name : ARMv7 Processor rev 4 (v7l) BogoMIPS : 38.40 Features : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm crc32 CPU implementer : 0x41 CPU architecture: 7 CPU variant : 0x0 CPU part : 0xd03 CPU revision : 4 processor : 3 model name : ARMv7 Processor rev 4 (v7l) BogoMIPS : 38.40 Features : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm crc32 CPU implementer : 0x41 CPU architecture: 7 CPU variant : 0x0 CPU part : 0xd03 CPU revision : 4 Hardware : BCM2835 Revision : a020d3 Serial : 00000000e63ad038 pi@raspberrypi:~ $ cat /etc/debian_version 10.0 pi@raspberrypi:~ $ uname -a Linux raspberrypi 4.19.57-v7+ #1244 SMP Thu Jul 4 18:45:25 BST 2019 armv7l GNU/Linux
Pipでseleniumを導入
root@raspberrypi:~# pip install selenium Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple Collecting selenium Downloading https://files.pythonhosted.org/packages/80/d6/4294f0b4bce4de0abf13e17190289f9d0613b0a44e5dd6a7f5ca98459853/selenium-3.141.0-py2.py3-none-any.whl (904kB) 100% |████████████████████████████████| 911kB 306kB/s Requirement already satisfied: urllib3 in /usr/lib/python2.7/dist-packages (from selenium) (1.24.1) Installing collected packages: selenium Successfully installed selenium-3.141.0
@raspberrypi:~ $ pip list |grep selenium selenium 3.141.0
chromium-browser導入
sudo apt-get install chromium-browser
Chromedirever導入
- オフィシャルサイトよりダウンロード(一番推奨される方法)
ただし、Linux版は64Bitしか提供されていない。https://sites.google.com/a/chromium.org/chromedriver/downloads
よって、https://launchpad.net/ubuntu/trusty/+package/chromium-chromedriverよりダウンロードしたドライバを利用します。
参考URL:Raspberry Piによるスクレイピング 環境構築(Selenium + Chromiumドライバ) - apt sourceを利用したインストール
参考URL:Raspberry pi3上でChromeのheadlessモードによる小型低電力&自動化環境への第一歩 - pipでのインストール
参考URL:【Python】SeleniumでHeadless Chromeを使おう - npmでのインストール
sudo npm -g install chromedriver
2. apt sourceでのインストール
chromiumブラウザともバージョンが合い、まだ安定して動作しました。
sudo apt-get install chromium-chromedriver
3. pipでのインストール
あまり安定して動作しませんでした。
root@raspberrypi:~# pip install chromedriver Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple Collecting chromedriver Downloading https://files.pythonhosted.org/packages/c8/5e/1daf3c71852f5b8536e30b2afa1e6442c454e91947678ac1a37daba2d7f5/chromedriver-2.24.1-py2.py3-none-any.whl (14.3MB) 100% |████████████████████████████████| 14.3MB 16kB/s Installing collected packages: chromedriver Successfully installed chromedriver-2.24.1
miki@raspberrypi:~ $ pip list |grep chromedriver chromedriver 2.24.1
Selenium Webdriverの動作確認
以下のスクリプトでheadlessモードでの動作検証を行いました。タイミングにより失敗するケースも有り、IoT家電のメインパスとして利用するにはもう少し試行錯誤が必要かなという状況です。ただし、APIがなくWEBのみに温度など取得したい情報があるツールなどの情報GET系には利用していこうかなと考えております。
それとは、別に設定変更など操作を行うことはもう少し、信頼のおける構築方法が見つかってから導入したいと考えております。
#!/usr/bin/env python # -*- coding: utf-8 -*- import time from selenium import webdriver from selenium.webdriver.chrome.options import Options CHROME_BIN = "/usr/bin/chromium-browser" CHROME_DRIVER = '/usr/lib/chromium-browser/chromedriver' options = Options() options.binary_location = CHROME_BIN options.add_argument('--headless') driver = webdriver.Chrome(CHROME_DRIVER, options=options) driver.get("https://www.google.co.jp") time.sleep(5) html = driver.page_source print(html) driver.quit()