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

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

ただいまの
回答率

90.50%

  • Ruby

    9608questions

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

  • Chrome

    798questions

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

  • selenium

    729questions

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

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

受付中

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 376

Toku1011

score 15

こんにちは。

現在、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に設定しています

require 'selenium-webdriver'

USER_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"

setting = Selenium::WebDriver::Chrome::Options.new(args: [ "--lang=ja", "--user-data-dir=./profile", "--user-agent=#{USER_AGENT}"])

driver = Selenium::WebDriver.for :chrome, options: setting

driver.get('https://www.instagram.com/account_name/')

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

driver.switch_to.alert.dismiss


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

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+1

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

不正な方法を用いて、アカウントの作成、情報へのアクセス、または情報の取得を試みることは禁止されています。
これには、弊社から明示的な許可を得ることなく、自動化された手段を用いてアカウントを作成したり、情報を取得したりする行為が含まれます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/01/21 17:37

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

    キャンセル

  • 2019/01/21 18:04

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

    キャンセル

  • 2019/01/21 18:42

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

    キャンセル

0

require 'selenium-webdriver'

def alert_exist(driver)
  begin
    driver.switch_to.alert
  rescue
    return false
  end
  true
end

USER_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"
setting = Selenium::WebDriver::Chrome::Options.new(args: [ "--lang=ja", "--user-data-dir=./profile", "--user-agent=#{USER_AGENT}"])
driver = Selenium::WebDriver.for :chrome, options: setting
driver.get('alert.html')

while alert_exist(driver) do
  driver.switch_to.alert.dismiss
  sleep 1
end

sleep
require 'watir'

USER_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"
setting = ["--lang=ja", "--user-data-dir=./profile", "--user-agent=#{USER_AGENT}"]
browser = Watir::Browser.new :chrome, :switches => setting

browser.goto('alert.html')

while browser.alert.exists? do
  browser.alert.close
  sleep 1
end

sleep


alert.html

<!DOCTYPE html>
<html lang="ja">
    <head>
        <meta charset="UTF-8">
        <title>Alert</title>
    </head>
    <body>
        <script>
            if(window.confirm("OK or Cancel")){
                    alert("OK!!!");
            }else{
                    alert("Cancell!!!");
            }        
        </script>
    </body>
</html>


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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/01/23 15:12

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

    キャンセル

  • 2019/01/23 19:17 編集

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

    キャンセル

  • 2019/01/24 13:20

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

    キャンセル

  • 2019/01/24 19:39

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

    キャンセル

  • 2019/01/25 10: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

    というふうに書き換えてみたのですがこちらもうまくいきませんでした。
    ドライバー自体は正常に動作しブラウザは起動するのでエラーコードなどは出ていませんが、「インストールしますか」の通知をブロックすることはできませんでした。

    キャンセル

同じタグがついた質問を見る

  • Ruby

    9608questions

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

  • Chrome

    798questions

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

  • selenium

    729questions

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