@kd133

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Google Cloud FunctionsでSeleniumを動かしたい

解決したいこと

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)にする
    変化なし
0 likes

2Answer

自己解決しました。 Seleniumのバージョンを「selenium==3.141.0」に指定するとエラー解消されました。 再デプロイするときに新しいコードが上書きされていませんでした。 cloud storageに保存されている古いコードを一度削除してから、新しいコードをデプロイしました。

1Like

Comments

Comments

  1. @kd133

    Questioner

    @jinbei230525
    回答ありがとうございます。
    from selenium.webdriver.chrome.service import Service
    service = Service(executable_path=driverPath)
    を追加し、
    driver = webdriver.Chrome(service=service, options=chrome_options)
    に変更しましたが、結果変わらずでした。

  2. 質問がクローズになってますが、どのように解決されたのでしょうか?

Your answer might help someone💌