質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

Q&A

解決済

1回答

435閲覧

Google Cloud Functionsでスクレイピングを実行したい

babababab

総合スコア3

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

0グッド

0クリップ

投稿2024/05/08 02:59

編集2024/05/08 03:08

実現したいこと

Google Cloud FunctionsでseleniumとPythonを用いてスクレイピングを実行し、スクレイピングした情報をLineBotでLineに通知したいです。

発生している問題・分からないこと

関数を作成し、Google Cloud Functionsにデプロイしようとしたのですが、エラーが発生し、デプロイができません。
以下のサイトを参考に関数を作成し、デプロイしようとしました。
https://somnia.jp/hobby/bunseki_gc_init3/

下記のソースコードは、実際にスクレイピングする部分は省略してあります。

エラーメッセージ

error

1Deploying function (may take a while - up to 2 minutes)...failed. 2ERROR: (gcloud.functions.deploy) OperationError: code=3, message=Function failed on loading user code. This is likely due to a bug in the user code. Error message: /workspace/selenium/webdriver/firefox/firefox_profile.py:206: SyntaxWarning: "is" with a literal. Did you mean "=="? 3 if setting is None or setting is '':

該当のソースコード

main.py

1import os 2import base64, hashlib, hmac 3 4from flask import abort, jsonify 5 6from linebot import ( 7 LineBotApi, WebhookParser 8) 9from linebot.exceptions import ( 10 InvalidSignatureError 11) 12from linebot.models import ( 13 MessageEvent, TextMessage, TextSendMessage 14) 15 16from selenium import webdriver 17from selenium.webdriver.common.by import By 18from selenium.webdriver.support.ui import Select 19from selenium.webdriver.chrome.options import Options 20from selenium.common.exceptions import NoSuchElementException 21from datetime import datetime 22import re 23import pytz 24 25def scraping(): 26 # ブラウザーを起動 27 global driver 28 options = webdriver.ChromeOptions() 29 # 以下は各種オプションを設定 なくても動作するものがほとんどです 30 options.add_argument('--headless') 31 options.add_argument('--disable-gpu') 32 options.add_argument('--disable-extensions') 33 options.add_argument('--single-process') 34 options.add_argument('--proxy-server="direct://"') 35 options.add_argument('--proxy-bypass-list=*') 36 options.add_argument('--blink-settings=imagesEnabled=false') 37 options.add_argument('--lang=ja') 38 options.add_argument('--no-sandbox') 39 options.add_argument('--disable-dev-shm-usage') 40 options.add_argument("--log-level=3") 41 options.add_argument("--disable-logging") 42 options.add_argument('--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36') 43 options.add_experimental_option("excludeSwitches", ["enable-automation"]) 44 options.add_experimental_option('useAutomationExtension', False) 45 options.page_load_strategy = 'eager' 46 47 # WEBブラウザとWEBドライバの場所を指定(GoogleCloudFunction用) 48 options.binary_location=os.getcwd()+"/headless-chromium" 49 driver = webdriver.Chrome(os.getcwd()+"/chromedriver",options=options) 50 # ↑2行をコメントアウトして以下1行に置き換えるとWindowsPC等他の環境でも動きます。 51 #driver = webdriver.Chrome(options=options) 52 53 #スクレイピングするURL 54 url = 'スクレイピングするURL' 55 driver.get(url) 56 driver.implicitly_wait(5) # 見つからないときは、5秒まで待つ 57 58 #ここからスクレイピングを行う処理(省略してあります) 59 #ログイン作業 60 login_url = driver.find_element(By.XPATH, '//*[@id="loginField"]/dl/dt/a') 61 login_url.click() 62 63 input_id = driver.find_element(By.NAME, 'ACCOUNTUID') 64 input_password = driver.find_element(By.NAME, 'PASSWORD') 65 66 id = os.environ.get('USER_ID') 67 pw = os.environ.get('PASSWORD') 68 69 input_id.send_keys(id) 70 input_password.send_keys(pw) 71 72 login_btn = driver.find_element(By.ID, 'uid_submit') 73 login_btn.click() 74 75 #ログイン後の画面をスクレイピング 76 77 return 取得した情報 78 79def main(request): 80 channel_secret = os.environ.get('CHANNEL_SECRET') 81 channel_access_token = os.environ.get('CHANNEL_ACCESS_TOKEN') 82 83 line_bot_api = LineBotApi(channel_access_token) 84 parser = WebhookParser(channel_secret) 85 86 body = request.get_data(as_text=True) 87 hash = hmac.new(channel_secret.encode('utf-8'), 88 body.encode('utf-8'), hashlib.sha256).digest() 89 signature = base64.b64encode(hash).decode() 90 91 if signature != request.headers['X_LINE_SIGNATURE']: 92 return abort(405) 93 94 try: 95 events = parser.parse(body, signature) 96 except InvalidSignatureError: 97 return abort(405) 98 99 100 for event in events: 101 if not isinstance(event, MessageEvent): 102 continue 103 if not isinstance(event.message, TextMessage): 104 continue 105 106 user_message = event.message.text # ユーザーからのメッセージを取得 107 108 # ユーザーのメッセージに基づいて条件分岐し、応答を決定 109 if "xxx" in user_message: 110 str_list = scraping() 111 112 response_message = '' 113 114 for str in str_list: 115 response_message += str 116 117 else: 118 response_message = "xxx" 119 120 # LINE API を使用して応答メッセージを送信 121 line_bot_api.reply_message( 122 event.reply_token, 123 TextSendMessage(text=response_message) 124 125 ) 126 return jsonify({ 'message': 'ok'})

requirements.txt

1line-bot-sdk
gcloud functions deploy func --entry-point=main --runtime=python39 --trigger-http --allow-unauthenticated --region=asia-northeast1 --memory=512MB --timeout=540 --set-secrets="USER_ID=USER_ID:1,PASSWORD=PASSWORD:1,CHANNEL_ACCESS_TOKEN=CHANNEL_ACCESS_TOKEN:1,CHANNEL_SECRET=CHANNEL_SECRET:1"

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

以下のサイトを参考に関数を作成し、デプロイしようとしました。
https://somnia.jp/hobby/bunseki_gc_init3/

このサイトと全く同じ関数で同じコマンドで試した場合はデプロイできました。

補足

もしかしたらスクレイピングする部分に問題があるかもしれないので、(省略してあります)と書いてありますが、一部載せておきます。
簡単に言うと、サイトにログインし、ログイン後の画面からスクレイピングで情報を抜き出しています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

自己解決しました。
webdriver内のfirefoxディレクトリを消去し、init.pyからfirefoxをimportしている行を削除したらデプロイできました。

投稿2024/05/09 04:39

babababab

総合スコア3

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問