Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

chromium+selenium+RasPiで動いていたパーサーをAWS LightSailに載せ替える

shuzo-kino.hateblo.jp
のシリーズの実質的続編。

これまではseleniumで動くパーサーをRasPi4Bに載せて運用していました。
RasPi4BはARMコアなので少し環境づくりが面倒だったこと、それ以上にずっと繋いでないと動かない仕様もどうかと思い、載せ替えを検討。
Wordpresを構築する際に活用したAWS LightSailを使う事にしました。

実際のところ

環境

手順

前準備

例のごとくaptを最新に。
どこかのアホのように横着するとchromium-browserが見つからないとか言われ無駄な時間を過ごす事になります。

$ sudo apt update
$ sudo apt upgrade

AWS LightSailで入るUbuntu20LTSに入ってないパッケージ群を先に導入。
chromiumdriverを動作させるのに必要なlibss3*1と、解凍用のzipコマンド。

$ sudo apt install libss3-dev zip
pipの導入

デフォではpipが入っていないので導入。
aptだとpip自体の更新が上手くいかないという情報も出てますが……一旦動かすだけなのでね……。

$ sudo apt install pip
seleniumを導入

はい、本チャンのseleniumです。
pipが入っているので楽々。

$ pip install selenium
chromium-browserとchromedriver

続いてchromium本体と、chromedriverを導入。

$ sudo apt install chromium-browser 
$ apt install libnss3-dev 

以下のChromium公式サイトから、入れたChromiumにあったchromiumdriverを導入
執筆時点で導入できたバージョンは93.0.4577.63 なので、chromedriverもこれに合わせるように。
ChromeDriver - WebDriver for Chrome - Downloads
わたしの場合は以下のような感じに。

$ wget https://chromedriver.storage.googleapis.com/93.0.4577.63/chromedriver_linux64.zip
$ unzip chromedriver_linux64.zip

解凍が終わったchromedriverを実行パスが届いてるトコに移動。
元のzipファイルは混乱を避ける意味でも消しておく。

$ sudo mv chromedriver /usr/local/bin
$ rm chromedriver*

これで環境導入は完了。
次はスクリプトを。

スクリプトを書く

ログイン=> ページ内のテーブルから要素を引っ張り出して標準出力に吐くという基本は前回と同じ動き。
せっかくなので、BeautifulSoupで内部でパースするように書き換え。
リモートデバッグ扱いになるのは前と同じなので、当該オプションを忘れぬよう*2

# -*- coding: utf-8 -*-

import time
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from bs4 import BeautifulSoup

CHROME_BIN   = '/usr/bin/chromium-browser'
CHROMEDRIVER = '/usr/local/bin/chromedriver'

# LogIn Info

USER_ID   = '###'
USER_PASS = '###'


# TargetURL

LOGINPAGE = '###'
TOPPAGE   = '###'


def get_driver():
    options = Options()
    options.binary_location = CHROME_BIN
    options.add_argument("--remote-debugging-port=9222")
    options.add_argument('--headless')
    return webdriver.Chrome(CHROMEDRIVER, options=options)

if __name__ == '__main__':

    print("start...\r\n")
    driver = get_driver()

    # URL
    print("Connect URL...\r\n")
    driver.get(LOGINPAGE)


    # ID/PAS
    print("Enter ID/PASS\r\n")
    id = driver.find_element_by_name("lid")
    id.send_keys(USER_ID)
    password = driver.find_element_by_name("lpd")
    password.send_keys(USER_PASS)

    # login
    print("Click Button\r\n")
    login_button = driver.find_element_by_class_name('btn-entry')
    login_button.click()

    # nextbutton
    print("NextPage....\r\n")
    driver.get(TOPPAGE)
    html = driver.page_source
    soup = BeautifulSoup(html, 'html.parser')

    for items in soup.select('tbody tr'):
      data = [item.text for item in items.select('td.device-data')]
      print(data)

    driver.quit()

*1:これは、セキュリティを考慮したクライアント・サーバアプリケーションのクロス プラットフォームな開発の補助を目的としたライブラリ群です。SSLv2 および v4, TLS, PKCS #5, #7, #11, #12, S/MIME, X.509 v3 証明書や、その他のセキュリティ 標準に対応しています。 https://packages.debian.org/ja/sid/libnss3 より

*2:私は忘れて30分ほど無駄にしました