Selenium webdriverです。navigator.webdriverのフラグを変更して、seleniumの検出を防止する
質問
私はseleniumとchromeを使用してウェブサイト内の非常に基本的なタスクを自動化しようとしていますが、どういうわけかウェブサイトはchromeがseleniumによって駆動されているときに検出し、すべての要求をブロックします。私は、ウェブサイトが次のような公開されたDOM変数に依存していることを疑います。 https://stackoverflow.com/a/41904453/648236 のような公開されたDOM変数に依存していると思われます。
私の質問は、私がnavigator.webdriverフラグをfalseにすることができる方法があるのでしょうか?私は修正を加えた後、seleniumソースを再コンパイルしようとすることまで喜んでいますが、NavigatorAutomationInformationソースがリポジトリのどこにも見つからないようです。 https://github.com/SeleniumHQ/selenium
どんな助けでも大いに感謝します
追伸:以下からも試してみました。 https://w3c.github.io/webdriver/#interface
Object.defineProperty(navigator, 'webdriver', {
get: () => false,
});
しかし、それは最初のページロードの後にのみプロパティを更新します。私のスクリプトが実行される前に、サイトが変数を検出したのだと思います。
どのように解決するのですか?
最初の更新 1
execute_cdp_cmd()
: を利用できるようになったことで
execute_cdp_cmd(cmd, cmd_args)
コマンドを使えば、簡単に
google-chrome-devtools(グーグルクロームデバイスツール
コマンド
を使って
セレン
. この機能を使用すると
navigator.webdriver
を簡単に変更して、Selenium が検出されないようにすることができます。
検出されないようにする 2
Selenium が駆動しないようにするために WebDriver が検出されるのを防ぐには、ニッチなアプローチとして、以下のステップのいずれか/すべてが含まれます。
-
引数を追加する -disable-blink-features=AutomationControlled(自動制御)
from selenium import webdriver options = webdriver.ChromeOptions() options.add_argument('--disable-blink-features=AutomationControlled') driver = webdriver.Chrome(options=options, executable_path=r'C:\WebDrivers\chromedriver.exe') driver.get("https://www.website.com")
関連する詳細な議論は、以下のサイトで見ることができます。 Seleniumは2番目のページを開くことができない
-
を回転させる ユーザエージェント を通して
execute_cdp_cmd()
コマンドを使う。#Setting up Chrome/83.0.4103.53 as useragent driver.execute_cdp_cmd('Network.setUserAgentOverride', {"userAgent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.53 Safari/537.36'})
-
を変更します。 プロパティ の値を変更します。
navigator
に対して ウェブドライバ から 未定義driver.execute_script("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})")
-
のコレクションを除外する。
enable-automation
スイッチoptions.add_experimental_option("excludeSwitches", ["enable-automation"])
-
ターンオフ
useAutomationExtension
options.add_experimental_option('useAutomationExtension', False)
サンプルコード 3
上記のすべてのステップをクラブアップし、効果的なコードブロックは次のようになります。
from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_argument("start-maximized")
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option('useAutomationExtension', False)
driver = webdriver.Chrome(options=options, executable_path=r'C:\WebDrivers\chromedriver.exe')
driver.execute_script("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})")
driver.execute_cdp_cmd('Network.setUserAgentOverride', {"userAgent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.53 Safari/537.36'})
print(driver.execute_script("return navigator.userAgent;"))
driver.get('https://www.httpbin.org/headers')
歴史
による W3C 編集者草案 によると、現在の実装は厳密に言及しています。
は
webdriver-active
フラグ が設定されています。true
が設定されている場合 ユーザエージェント の下にある場合 リモートコントロール に設定されており、初期状態ではfalse
.
さらに
Navigator includes NavigatorAutomationInformation;
ということになる。
は
NavigatorAutomationInformation
インタフェース で公開されるべきではありません。 WorkerNavigator .
は
NavigatorAutomationInformation
インタフェース
は次のように定義されます。
interface mixin NavigatorAutomationInformation {
readonly attribute boolean webdriver;
};
を返します。
true
もし
webdriver-active
フラグ
がセットされている場合、それ以外は false となります。
最後に
navigator.webdriver
は,協調する利用者エージェントが,文書に,その文書が
WebDriver
によって制御されていることをドキュメントに通知し、自動化の間に代替のコード パスをトリガーできるようにする標準的な方法を定義しています。
注意 : 上記のパラメータを変更・調整すると ナビゲーション をブロックし WebDriver のインスタンスが検出されます。
更新情報(2019年11月6日)
現在の実装では、検出されずにウェブページにアクセスする理想的な方法として
ChromeOptions()
クラスにいくつかの引数を追加することです。
-
のコレクションを除外する。
enable-automation
スイッチ -
ターンオフ
useAutomationExtension
のインスタンスを通して
ChromeOptions
のようにします。
-
Java の例です。
System.setProperty("webdriver.chrome.driver", "C:\\Utility\\BrowserDrivers\\chromedriver.exe"); ChromeOptions options = new ChromeOptions(); options.setExperimentalOption("excludeSwitches", Collections.singletonList("enable-automation")); options.setExperimentalOption("useAutomationExtension", false); WebDriver driver = new ChromeDriver(options); driver.get("https://www.google.com/");
-
Pythonの例
from selenium import webdriver options = webdriver.ChromeOptions() options.add_experimental_option("excludeSwitches", ["enable-automation"]) options.add_experimental_option('useAutomationExtension', False) driver = webdriver.Chrome(options=options, executable_path=r'C:\path\to\chromedriver.exe') driver.get("https://www.google.com/")
-
Rubyの例
options = Selenium::WebDriver::Chrome::Options.new options.add_argument("--disable-blink-features=AutomationControlled") driver = Selenium::WebDriver.for :chrome, options: options
レジェンド
1 : Selenium の Python クライアントにのみ適用されます。
2 : Selenium の Python クライアントにのみ適用されます。
3 : Selenium の Python クライアントにのみ適用されます。
関連
-
Solve モジュールのビルドに失敗しました。Error: ENOENT: no such file or directory エラー
-
Javaがテキストファイルを読み込む
-
Javaがエラーで実行される、選択が起動できない、最近起動したものがない
-
Web Project JavaでPropertiesファイルを読み込むと、「指定されたファイルがシステムで見つかりません」というソリューションが表示されます。
-
[解決済み] Selenium WebDriverでスクリーンショットを撮るにはどうしたらいいですか?
-
[解決済み】Selenium WebDriverでPythonを使用してWebElementのHTMLソースを取得する。
-
[解決済み】Selenium C# WebDriver: 要素が存在するまで待つ
-
[解決済み】Selenium WebDriverでJavaScriptを使用してXPathで要素を取得する方法はありますか?
-
[解決済み】Selenium WebDriverは、バックグラウンドで静かにブラウザウィンドウを開くことができますか?
-
[解決済み] Selenium WebDriverのテストケースをChromeで実行する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Eclipseは、ポップアップA Java Exception has occurred.を実行し、エラーException in threadの解決策を報告します。
-
実行中にEclipseがポップアップする A Java Exception has occurred
-
SLF4J: クラス・パスに複数のSLF4Jバインディングが含まれています。
-
java マイクロソフト払い戻し予期せぬサーバーからのファイルの終了
-
ジャバアレイ
-
XXX型を囲むインスタンスがJavaでアクセスできない
-
eclipse 実行 Java、エラー: 選択を起動できず、レシーバーもありません。
-
org.xml.sax.SAXParseExceptionのエラー解決方法
-
java 365*1000*60*60*24 計算問題
-
WeChat小プログラム Bluetooth通信 Bluetoothモジュールデモ