selenium web driverを使いheroku上でchromeを起動し自分が仕事で使っているツールをスクレイピング+自動化したいのですがherokuの仕様で30秒超過タイムアウトにより上手く稼働しないです。(汎用的に使いたいのでwebに上げてツール化したいと考えております)
>Web DynoはHTTPリクエストを受信してから30秒以内にレスポンスを返さなければなりません。
30秒を経過すると、Heroku routerによりHTTPコネクションが切断されてしまいます。
ちなみにローカルで立ち上げている際は上手く起動しています。(ローカルではheadlessではなく普通にブラウザが起動します)
まず一部ではありますがコード部分です。
production環境の場合はheadless
で立ち上げる様に条件分岐を書いていて、
option部分をメソッドでまとめています。
アプリのボタンをクリックした後、まず簡単な認証のあるシステムなのでseleniumでidとpassを自動で入力しています。
こちらのコードはログイン処理のみですがそもそもimplicit_wait
で20秒は待つ仕様にしている上に認証が終わった後も、
色々ボタン押下操作があるのでresponseが最終的に返ってくるまでに30秒以上は確実にかかってしまいます。
def login(name, password) Selenium::WebDriver.logger.output = File.join("./", "selenium.log") Selenium::WebDriver.logger.level = :warn if Rails.env.production? Selenium::WebDriver::Chrome.path = ENV.fetch('GOOGLE_CHROME_BIN', nil) @driver = Selenium::WebDriver.for :chrome, options: headless_chrome_options elsif Rails.env.development? @driver = Selenium::WebDriver.for :chrome end @driver.manage.timeouts.implicit_wait = 20 @driver.navigate.to'https://tools' @driver.find_element(:name, 'name').send_keys(name) @driver.find_element(:name, 'password').send_keys(password) sleep 1 @driver.find_element(:name, 'password').send_keys(:return) end private def headless_chrome_options options = Selenium::WebDriver::Chrome::Options.new( prefs: { 'profile.default_content_setting_values.notifications': 2 }, binary: ENV.fetch('GOOGLE_CHROME_SHIM', nil)) options.add_argument('--user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36') options.add_argument('--headless') options.add_argument('--no-sandbox') options.add_argument('--disable-gpu') options.add_argument('--hide-scrollbars') options.binary = '/app/.apt/usr/bin/google-chrome' return options end
どうすればこのタイムアウトを防げますでしょうか?
この様なブラウザ操作を行うアプリはそもそもherokuでやるべきではないのですかね?
もしそうであればherokuの代わりになるホスティングサービスやSaaSがあればご教示いただきたいです。
ご回答いただけると幸いです、よろしくお願いします。
追記
workerなどを使い、認証から何かしらの処理含めた30秒以上かかる処理を非同期で処理する(処理を後置させる分には問題ないです。)ならこれは解決するのですかね?
それともworker内で30秒以上かかる処理もこのH12 errorに引っかかってしまうのでしょうか?
あなたの回答
tips
プレビュー