#chiroruLab

趣味と日々の雑記録

【電力不足?】Raspberry Pi 3B+でselenium使ってスクレイピングするまでの手順【忘備録】

f:id:chiroru_27:20200514033825j:plain

最近疲れてここの文章考える気力ないので省略

その代わり、かわいいハムちゃんの画像でも載っけときますね。

ちなみに全然関係ない話すると、最近読んで面白かった本は
野矢 茂樹氏の「はじめて考えるときのように 」です。おすすめ。



はい、本題。色々ハマったので、久しぶりの忘備録です。

SSHとRDPを使えるようにする

使えるようにしておくと色々楽。

# SSH

# RDP
$ sudo apt-get install xrdp

必要なソフトを入れて環境を整える

ターミナルからSSHでつないで以下コピペ

# パッケージのアップデート
$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get dist-upgrade
# 2020-02-13-raspbian-buster.img を
# クリーンインストールした場合、なぜか起動するとハングアップして死ぬので
# 再インストールで対処する
# 一度きれいに削除
$ sudo apt-get remove chromium-browser
$ sudo apt-get remove chromium
$ sudo apt-get autoremove
$ sudo apt-get clean
# chromium のインストール
$ sudo apt-get install chromium-browser
# chromedriver のインストール
$ sudo apt-get install chromium-chromedriver

# バージョンがあっているか確認
$ chromium-browser --version
Chromium 78.0.3904.108
$ chromedriver --version
ChromeDriver 78.0.3904.108

# selenium のインストール
# 今回はPython3で動かすのでpip3 
$ sudo pip3 install selenium

適当にPythonのコードを書く

Googleで"test"と検索するコード

#!/usr/bin/python3
# coding:utf-8
import sys
import os
sys.path.append('/usr/bin/python3')
import time

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.options import Options

chrome_options = Options()
chrome_options.binary_location = '/usr/bin/chromium-browser'
browser = webdriver.Chrome(executable_path='/usr/bin/chromedriver',options=chrome_options)

URL = 'https://www.google.com/'
INPUT = '//*[@id="tsf"]/div[2]/div[1]/div[1]/div/div[2]/input'
WORD = 'test'

if __name__ == '__main__':
    browser.get(URL)
    time.sleep(3)

    Field = browser.find_element_by_xpath(INPUT)
    Field.click()
    Field.send_keys(WORD)
    Field.send_keys(Keys.RETURN)

問題なく動けばゲームクリアです。

消費電力にも注意

私の環境だとこれプラス、電力供給に不備がありハングアップしていた場面もありました

2個目ってこともあり、スターターセットではない本体単体を購入して裸で
尚且、SSDブート化させた上に、そこらへんに転がってたケーブルとACアダプタで繋いでただけですからね・・・

しっかりしたUSBケーブルとACアダプタは用意しといたほういいです(笑)

end Kernel Panic – not syncing: VFS: Unable to mount root fs on unknown-block(179,7)

赤いパワーランプが常時点灯している場合は要注意
最悪システムファイルぶっ壊れて起動しなくなります。

SD起動でもKernel Panic起きてしまったので、より消費電力の大きいSSD起動はさらにシビア

エラー忘備録

2020年5月14日現在、上をコピペしていれば起きないだろう(ことを願う)けど
一応、試行錯誤して設定していた時に起きたエラーと対処をまとめる

そもそも固まって操作を受け付けない
chromiumを開くとハングアップする

chromiumが悪さしている感じがしたので、一度完全にアンインストール
その後、再インストール

手順の最初に書いたコードを参照

それでも動かない場合

  • 電力不足が考えられる場合(これ見落としがち)
    • 電源やケーブルの交換
  • パッケージが古い
    • アップデート
$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get dist-upgrade
  • OSの再インストール
    • NOOBSを使っていた時は、こういう現象は起きていないのでNOOBSで再インストール
    • balenaEtcher でSSDに書き込んでいたのが失敗したのかも?再インスコ


No module named 'selenium'

パスが通っていない。

  • 実行してるPythonとインストール先のseleniumのバージョンを確認。
# よくある凡ミス
# sudo をつけずにインストールしていた
$ pip3 install selenium

# Python3用で入れていなかった
$ sudo pip install selenium

unknown error: DevToolsActivePort file doesn't exist
直やRDPでは正常に動作するのに、SSHやcronではエラーが出る

今回このエラーが出たのは、コードを定期実行させたくcronに登録しようとした時のこと
まぁ、色々試したがエラーは消せなかった。

状況から分かったのは、GUI環境が立ち上がっていて実行すればエラーは起きない
GUIに依存するエラーだとは思う
・・・が、本質的な解決策は見つけられなかった

個人的解決策

実際に動かしているコードは、特定のサイト上を定期的に巡回さえすればいいので
Pythonのscheduleモジュールで実装した

$ sudo pip3 install schedule


試したこと

以下の設定には効果はないが、忘備録として残す。

# 実行ファイルのchromeオプションに色々指定
chrome_options = Options()
chrome_options.add_argument('--no-sandbox')
chrome_options.add_experimental_option('useAutomationExtension', False)

# ssh接続時にX11 Forwardingを有効にしてみる
## ラズパイ側の設定
$ sudo nano /etc/ssh/sshd_config
X11Forwarding yes
X11DisplayOffset 10
PrintMotd no
PrintLastLog yes
TCPKeepAlive yes


## SSH接続時の設定
$ ssh -X -p Port番号 pi@IPアドレス

# cronに設定時にフルパスで指定、環境変数も指定



ハムスター癒やされる。

トラブったり、なんやかんやでイライラした時は可愛いものみて癒やされましょう。
以上、@chiroru_27 でした。