Google Cloud FunctionsでSeleniumを動かしたい
Q&A
Closed
解決したいこと
Cloud FunctionsでSeleniumを使ってWebスクレイピングをしたい。
下記URLのコードをそのままデプロイし、テストを実行するとエラーが発生しました。
トリガーはCloud Pub/Subを使用したいのでエントリポイントのみmain(data,context):に変更しています。
ランタイムはPython3.12に設定しています。
環境は第1世代、メモリを1GB割り当てています。
ログ
テストのログです。
7~9行目のログに重大度のエラーマークがついています。
Function execution started
driver setting
copy headless-chromium
copy chromedriver
get driver
ERROR in app: Exception on / [POST]
testcsss0xm48uvg Traceback (most recent call last):
File "/layers/google.python.pip/pip/lib/python3.12/site-packages/flask/app.py", line 2529, in wsgi_app
response = self.full_dispatch_request()
File "/layers/google.python.pip/pip/lib/python3.12/site-packages/flask/app.py", line 1825, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/layers/google.python.pip/pip/lib/python3.12/site-packages/flask/app.py", line 1823, in full_dispatch_request
rv = self.dispatch_request()
File "/layers/google.python.pip/pip/lib/python3.12/site-packages/flask/app.py", line 1799, in dispatch_request
return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args)
File "/layers/google.python.pip/pip/lib/python3.12/site-packages/functions_framework/__init__.py", line 171, in view_func
function(data, context)
File "/workspace/main.py", line 65, in main
settingDriver()
File "/workspace/main.py", line 60, in settingDriver
driver = webdriver.Chrome(executable_path=driverPath, options=chrome_options)
Function execution took 990 ms, finished with status: 'crash'
TypeError: WebDriver.__init__() got an unexpected keyword argument 'executable_path'
該当するソースコード
main.py
import os
import shutil
import stat
from pathlib import Path
from selenium import webdriver
global driver
def add_execute_permission(path: Path, target: str = "u"):
"""Add `x` (`execute`) permission to specified targets."""
mode_map = {
"u": stat.S_IXUSR,
"g": stat.S_IXGRP,
"o": stat.S_IXOTH,
"a": stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH,
}
mode = path.stat().st_mode
for t in target:
mode |= mode_map[t]
path.chmod(mode)
def settingDriver():
print("driver setting")
global driver
driverPath = "/tmp" + "/chromedriver"
headlessPath = "/tmp" + "/headless-chromium"
# copy and change permission
print("copy headless-chromium")
shutil.copyfile(os.getcwd() + "/headless-chromium", headlessPath)
add_execute_permission(Path(headlessPath), "ug")
print("copy chromedriver")
shutil.copyfile(os.getcwd() + "/chromedriver", driverPath)
add_execute_permission(Path(driverPath), "ug")
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument("--headless")
chrome_options.add_argument("--disable-gpu")
chrome_options.add_argument("--window-size=1280x1696")
chrome_options.add_argument("--no-sandbox")
chrome_options.add_argument("--hide-scrollbars")
chrome_options.add_argument("--enable-logging")
chrome_options.add_argument("--log-level=0")
chrome_options.add_argument("--v=99")
chrome_options.add_argument("--single-process")
chrome_options.add_argument("--ignore-certificate-errors")
chrome_options.add_argument("--disable-dev-shm-usage")
chrome_options.binary_location = headlessPath
print("get driver")
driver = webdriver.Chrome(executable_path=driverPath, options=chrome_options)
def main(data,context):
settingDriver()
global driver
try:
print("URL get")
driver.get("http://[hoge]")
targetPath = '[HOGE]'
ret = driver.find_element_by_xpath(targetPath)
ret = ret.get_attribute("alt")
print(ret)
finally:
print("driver quit")
driver.quit()
return ret
requirements.txt
google-cloud-error-reporting==0.30.0
selenium
setuptools
chromedriver、headless-chromiumファイルを含む
自分で試したこと
- 再デプロイ
変化なし - Seleniumのバージョンを指定「selenium==3.141.0」
変化なし - ランタイムをPython 3.8に変更
変化なし - 元記事と同じくトリガーをHTTPにし、エントリポイントをmain(request)にする
変化なし