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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Chrome

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

selenium

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

Q&A

2回答

4059閲覧

Selenium(UserAgentをiOSに設定)でInstagramを開くと処理ができない通知が発生する問題について

yoshi_10_11

総合スコア241

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Chrome

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

selenium

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

0グッド

0クリップ

投稿2019/01/21 08:27

こんにちは。

現在、Selenium × RubyでInstagramのスクレイピングツールを作成しているのですが、下記のような**「アプリをインストールしますか?」の通知が発生するとウインドウ上のどのボタンもSelenium上で操作することができなくなる**ので困っています。

イメージ説明

AWSで契約したWindowsサーバー上にSeleniumを使ってChromeを操作しInstagramをスクレイピングするプログラムをRubyで記述しています。

バージョンは以下のとおりです

  • ruby 2.3.3
  • selenium-webdriver 3.14.0
  • chromedriver 2.43

Instagramにアクセスするまでのコードは以下のとおりです。WindowsからクローリングしていることがInstagram社に知られるとブロックされる可能性もありますのでUSERAGENTをiOSに設定しています

ruby

1require 'selenium-webdriver' 2 3USER_AGENT = "Mozilla/5.0 (iPhone; U; CPU iPhone OS 12_1_2 like Mac OS X; ja-jp) AppleWebKit/605.1.15 (KHTML,like Gecko) Version/12.0 Mobile/15E148Safari/604.1" 4 5setting = Selenium::WebDriver::Chrome::Options.new(args: [ "--lang=ja", "--user-data-dir=./profile", "--user-agent=#{USER_AGENT}"]) 6 7driver = Selenium::WebDriver.for :chrome, options: setting 8 9driver.get('https://www.instagram.com/account_name/')

このプログラムでアクセスするとまれに上記の画像にあるような通知が発生します。この通知が非常に強力で、これを手動で何らかのボタンを押さないとSeleniumが動作しません。
ネットでググって

ruby

1driver.switch_to.alert.dismiss

などで対応ができると書いてあったので実行してみたのですがオブジェクトを取得できず失敗しました。

USERAGENTをWindowsのままであればこの通知は発生しないと思いますが、都合上、iOSのままにしておきたいです。この通知を操作する方法をご存知の方がいらっしゃいましたら教えてください。

※ちなみに、この通知ですが、作成したばかりのInstagramアカウントで、ログイン処理をすることで再現をしやすくなります
一度、手動でクリックしてしまうとしばらく発生しなかったりするので2回目以降の再現性が少し低めです。
Windows以外でもMacOSでもこの現象が発生したことを確認しております。

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

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

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

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

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

guest

回答2

0

まずもって、Instagramのスクレイピングを勝手に行うこと自体が**利用規約違反**です。

不正な方法を用いて、アカウントの作成、情報へのアクセス、または情報の取得を試みることは禁止されています。

これには、弊社から明示的な許可を得ることなく、自動化された手段を用いてアカウントを作成したり、情報を取得したりする行為が含まれます。

投稿2019/01/21 08:30

maisumakun

総合スコア145183

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

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

yoshi_10_11

2019/01/21 08:37

ご回答下さりありがとうございます。 たしかに、ご指摘の通りスクレイピングはInstagram社の利用規約違反になります。 他責的な理由にはなるのですが、クライアントからの要望がありご対応させていただいた結果、この問題に直面したという経緯があります。
maisumakun

2019/01/21 09:04

最悪の場合「お客様がFacebookから訴えられる危険すらある」わけなのですが、相手先はそれを承知の上でなのでしょうか。
yoshi_10_11

2019/01/21 09:42

それについてご説明をし、認識していただいた上でそれでもInstagramの運用をしていきたいとのことでしたので対応をさせていただいております。
guest

0

Ruby

1require 'selenium-webdriver' 2 3def alert_exist(driver) 4 begin 5 driver.switch_to.alert 6 rescue 7 return false 8 end 9 true 10end 11 12USER_AGENT = "Mozilla/5.0 (iPhone; U; CPU iPhone OS 12_1_2 like Mac OS X; ja-jp) AppleWebKit/605.1.15 (KHTML,like Gecko) Version/12.0 Mobile/15E148Safari/604.1" 13setting = Selenium::WebDriver::Chrome::Options.new(args: [ "--lang=ja", "--user-data-dir=./profile", "--user-agent=#{USER_AGENT}"]) 14driver = Selenium::WebDriver.for :chrome, options: setting 15driver.get('alert.html') 16 17while alert_exist(driver) do 18 driver.switch_to.alert.dismiss 19 sleep 1 20end 21 22sleep 23

Ruby

1require 'watir' 2 3USER_AGENT = "Mozilla/5.0 (iPhone; U; CPU iPhone OS 12_1_2 like Mac OS X; ja-jp) AppleWebKit/605.1.15 (KHTML,like Gecko) Version/12.0 Mobile/15E148Safari/604.1" 4setting = ["--lang=ja", "--user-data-dir=./profile", "--user-agent=#{USER_AGENT}"] 5browser = Watir::Browser.new :chrome, :switches => setting 6 7browser.goto('alert.html') 8 9while browser.alert.exists? do 10 browser.alert.close 11 sleep 1 12end 13 14sleep 15

alert.html

html

1<!DOCTYPE html> 2<html lang="ja"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Alert</title> 6 </head> 7 <body> 8 <script> 9 if(window.confirm("OK or Cancel")){ 10 alert("OK!!!"); 11 }else{ 12 alert("Cancell!!!"); 13 } 14 </script> 15 </body> 16</html>

参考
【Ruby】accept,dismiss・・・ダイアログの[OK]ボタン/[Cancel]ボタンを押下する

投稿2019/01/22 14:26

編集2019/01/22 14:37
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

yoshi_10_11

2019/01/23 06:12

ありがとうございます。実はdriver.switch_to.alertはもう試しておりまして、alertのオブジェクトを取得することができずエラーになってしまいました。本当に謎です。
退会済みユーザー

退会済みユーザー

2019/01/23 10:23 編集

driver.switch_to.alert実行後に、alertが表示されているのではないでしょうか。 alertが表示されている状態で、操作を行うとエラーが発生したりしませんか? エラーが発生するなら、例外処理でalertを閉じます。
yoshi_10_11

2019/01/24 04:20

ありがとうございます。 ご提示いただいたプログラムでは問題なく動作はしますが今回問題になっているInstagramでのアラート表示には効きませんでした。 driver.switch_to.alertはalert表示後に実行しておりますがエラーになります。 エラーを起こした場合にもrubyでalertを掴むことができないためエラーになってしまいます。
退会済みユーザー

退会済みユーザー

2019/01/24 10:39

alert表示後にdriver.navigate.refreshを実行したらどうなりますでしょうか?
yoshi_10_11

2019/01/25 01:10

refreshでページは更新されますがインストールしますか?の表示は何も反応せずそのまま残り続けました。 あとあといろいろ調べてみて、どうやらこのポップはブラウザレベルのポップ(通知を許可しますか?Flashを許可しますか?的な)なのではないかという考えに至りました https://github.com/webdriverio/webdriverio/issues/2718 そこで、 option = Selenium::WebDriver::Remote::Capabilities.chrome( "chromeOptions" => { args: ["--disable-desktop-notifications","--user-data-dir=./profile", "--user-agent=#{USER_AGENT}"], prefs: { "profile.default_content_setting_values.notifications": 2, "profile.default_content_setting_values.popups": 2 } }) driver = Selenium::WebDriver.for :chrome, desired_capabilities: option というふうに書き換えてみたのですがこちらもうまくいきませんでした。 ドライバー自体は正常に動作しブラウザは起動するのでエラーコードなどは出ていませんが、「インストールしますか」の通知をブロックすることはできませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問