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
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()