Ubuntu 20.10 on Raspberry Pi 4B にSeleniumの環境を構築してスクレイピング その4:healessでもクリックしてダウンロードする

shuzo-kino.hateblo.jp
の続き。

前はブラウザ表示してからやるパターンですが、今回はヘッドレスモードの時。

実際のところ

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import time
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.action_chains import ActionChains

# headless用のアクション
def enable_download_headless(browser,download_dir):
    browser.command_executor._commands["send_command"] = ("POST", '/session/$sessionId/chromium/send_command')
    params = {'cmd':'Page.setDownloadBehavior', 'params': {'behavior': 'allow', 'downloadPath': download_dir}}
    browser.execute("send_command", params)


# 実行オプション
options = Options()
options.binary_location = CHROME_BIN
options.add_argument('--headless')

downloadPath = "/home/ubuntu"

# サンドボックスなし
options.add_argument('--no-sandbox')

# headless時のダウンロード処理
options.add_experimental_option("prefs", {
    "download.default_directory": downloadPath,
    "download.prompt_for_download": False,
    "download.directory_upgrade": True,
    "safebrowsing_for_trusted_sources_enabled": False,
    "safebrowsing.enabled": False

})

# 実行インスタンスの作成
print("start...\r\n")
driver = webdriver.Chrome(CHROME_DRIVER, options=options)
# この時、冒頭で指定した関数を実行する
enable_download_headless(driver, downloadPath)

# driverの初期化とか前処理とか....

print("NextPage....\r\n")
driver.get('TARGET URL')
print(driver.get_window_rect())

#マウスの挙動を再現するActionChainsのインスタンス
actions = ActionChains(driver)

# 参考元をベースにhtmlタグをベースに
targetElement = driver.find_element_by_tag_name('html')
# 左上を基準点に。move_to_elementでは重心になる。
actions.move_to_element_with_offset(targetElement,0,0)
# target_x、target_yの分だけ移動
actions.move_by_offset(target_x,target_y)
#左クリック。右クリックはcontext_click、ダブルクリックはdouble_click
actions.click()
# スタックしたコマンド群を実行
actions.perform()

# 展開した蛇腹メニューからdownload_item_yだけ動いてダウンロード
actions.move_by_offset(0,download_item_y)
actions.click()
actions.perform()

# インスタンスを片付ける。整理整頓は基本。
driver.quit()

参考もと

stackoverflow.com