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

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

新規登録して質問してみよう
ただいま回答率
85.50%
スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Chrome

Google Chromeは携帯、テレビ、デスクトップなどの様々なプラットフォームで利用できるウェブブラウザです。Googleが開発したもので、Blink (レンダリングエンジン) とアプリケーションフレームワークを使用しています。

Heroku

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

selenium

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

Q&A

解決済

1回答

2529閲覧

PythonでGoogleログインをしたい

7vvXi

総合スコア24

スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Chrome

Google Chromeは携帯、テレビ、デスクトップなどの様々なプラットフォームで利用できるウェブブラウザです。Googleが開発したもので、Blink (レンダリングエンジン) とアプリケーションフレームワークを使用しています。

Heroku

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

selenium

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

0グッド

0クリップ

投稿2019/06/19 17:16

編集2019/06/19 17:31

実現したいこと

herokuのサーバ上でpythonプログラムによるスクレイピングを実行したいです。
chrome+chromedriver+seleniumによってgoogleログインを行い、情報を取得したいサイトへ画面遷移を行いたいです。
ローカルの環境では実行および、情報の取得はできています。
herokuで同じように実行するにはどうしたらいいでしょうか?

発生している問題

画面遷移の流れは、
①driver.get(url)でgoogleのメールアドレス入力画面
②googleのパスワード画面
③情報を取得したいページ
となっています。②から③へ遷移ができません。

URL情報について、driver.current_urlで取得すると、
https://accounts.google.com/signin/oauth/identifier?client_id= ...
https://accounts.google.com/signin/v2/challenge/pwd?client_id= ...
③情報を取得したいページ
となるはずですが、
②の後、
https://accounts.google.com/signin/v2/challenge/az?client_id= ...
というよくわからないURLへ遷移してしまいます。

該当のソースコード

Python

1import time 2import requests 3from selenium import webdriver 4from selenium.webdriver.support.ui import WebDriverWait 5from selenium.webdriver.support import expected_conditions as EC 6from selenium.webdriver.common.by import By 7from selenium.webdriver.common.keys import Keys 8from selenium.webdriver.chrome.options import Options 9 10def main(): 11 # chromedriverのPATHを指定(Pythonファイルと同じフォルダの場合) 12 driver_path = '/app/.chromedriver/bin/chromedriver' 13 options = webdriver.ChromeOptions() 14 options.add_argument('--headless') 15 driver = webdriver.Chrome(options=options, executable_path=driver_path) 16 17 # Googleログイン 18 url = 'https://accounts.google.com/' 19 driver.get(url) 20 time.sleep(10) 21 22 #ログイン情報 23 login_id = #メールアドレス 24 login_pw = #パスワード 25 26 #メールアドレス入力 27 el_id = driver.switch_to.active_element 28 time.sleep(5) 29 el_id.send_keys(login_id) 30 time.sleep(5) 31 el_id.send_keys(Keys.ENTER) 32 time.sleep(15) 33 34 #パスワード入力 35 el_pw = driver.switch_to.active_element 36 time.sleep(5) 37 el_pw.send_keys(login_pw) 38 time.sleep(5) 39 el_pw.send_keys(Keys.ENTER) 40 time.sleep(15) 41 42 ### 情報取得 ### 43 # ... 44 ### 情報取得後 ### 45 time.sleep(1) 46 # 終了 47 driver.quit() 48 49if __name__ == '__main__': 50 51 main()

試したこと

現在、「情報をアクティブな場所に送る」という形をとっていますが、多くのサイトを参考にさせていただき、id指定、name指定、xpath指定等を行いましたが、同じ結果になりました。
例として、以下のようなコードです。

Python

1 ### IDを入力 2 login_id_xpath = '//*[@id="identifierNext"]' 3 # xpathの要素が見つかるまで待機します。 4 WebDriverWait(driver, wait_time).until(EC.presence_of_element_located((By.XPATH, login_id_xpath))) 5 driver.find_element_by_name("identifier").send_keys(login_id) 6 driver.find_element_by_xpath(login_id_xpath).click() 7 time.sleep(2) 8 9 ### パスワードを入力 10 login_pw_xpath = '//*[@id="passwordNext"]' 11 # xpathの要素が見つかるまで待機します。 12 WebDriverWait(driver, wait_time).until(EC.presence_of_element_located((By.XPATH, login_pw_xpath))) 13 driver.find_element_by_name("password").send_keys(login_pw) 14 time.sleep(1) # クリックされずに処理が終わるのを防ぐために追加。 15 driver.find_element_by_xpath(login_pw_xpath).click() 16 time.sleep(2)

driver.get(url)により、IDからパスワードまでを直リンクでとぶ、あるいはdriver.refresh()により、再読み込み等行いましたが意味がありませんでした。
time.sleep()の処理ですが、60秒以上指定しても効果ありませんでした。

補足情報

ローカル環境ですが、Windows10を使用しています。
VMによるUbuntuやコマンドプロンプト、git bash等で実行しましたが全てうまくいっています。試しにGCPでも試行錯誤しましたが、同様の結果でした。

なぜ「az」という場所に遷移してしまうのかだけでも構いませんので、教えていただけますでしょうか。

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

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

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

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

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

guest

回答1

0

自己解決

疑問の解決について

https://accounts.google.com/signin/v2/challenge/az?client_id= ... とうURLですが、不正アクセス防止用のページでした。herokuでchromedriverを使用すると、サーバーがアメリカにあり、毎度情報が消えるため、このURLへ誘導されるようです。herokuは無料の環境で実行していますが、端末情報がLinuxあるいは不明なデバイスと表示される場合もあります。

解決方法

ページ遷移時にスクリーンショットを撮るとともに、ソースコードを取得しました。
私の場合の認証方法ですが、表示されている番号と同じ番号を登録している携帯電話で選ぶタイプでした。認証されれば、driver.quit()されるまではgoogleログインが保持されます。

同じようなことを実現したい人の注意点

・Herokuはカレントディレクトリに、ファイル出力によるデータ保存ができない
・ログアウト時やスリープされる時に最後のコミット状態に戻ります
・アクセスしているサーバが異なる場合がある
・googleの認証(azのページ)は、失敗できる回数に制限がある
・もし、回数制限を超過すると、数時間認証できなくなります
・"time.sleep()"を上手く活用してください
・"heroku run bash"でログインし、スクリーンショットの保存、ソースコードの保存はログアウト時まで保持されるので、試してみてください

投稿2019/06/24 07:15

7vvXi

総合スコア24

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問