enable-automationとかuseAutomationExtensionは期待通りの動作しなかった
とある理由でスクレイピングしたいけど、navigator.webdriver=true
なブラウザだとNGなサイトだった。
対応したい。できるらしいので。
参考:navigator.webdriver=trueだとロボットだとバレる。その回避法はあるか?puppeteerなら出来そう
でもSelenium使っているしpuppeteer使ったことないし、どうにかできないものか。。
動かなかったときの設定
どうやらSeleniumでもできるらしい記事をいくつか見つけた。
やってみた。
capabilities = Selenium::WebDriver::Remote::Capabilities.chrome(
accept_insecure_certs: true,
chromeOptions: {
args: [
'-window-size=1920,1080',
'--user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'
],
excludeSwitches: ['enable-automation'], # 追加
useAutomationExtension: false # 追加
}
)
driver = Selenium::WebDriver.for(
:remote,
url: 'http://chrome:4444/wd/hub',
desired_capabilities: capabilities,
http_client: Selenium::WebDriver::Remote::Http::Default.new
)
実際に動かしてみてもtrueが帰ってくる。ダメだった。
driver.execute_script('return navigator.webdriver')
>>> true
動いた設定
enable-automation
とかuseAutomationExtension
は削除。
今まで通りにdriverを設定。
capabilities = Selenium::WebDriver::Remote::Capabilities.chrome(
accept_insecure_certs: true,
chromeOptions: {
args: [
'-window-size=1920,1080',
'--user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'
],
}
)
driver = Selenium::WebDriver.for(
:remote,
url: 'http://chrome:4444/wd/hub',
desired_capabilities: capabilities,
http_client: Selenium::WebDriver::Remote::Http::Default.new
)
# 以下を追加
driver.execute_script('const newProto = navigator.__proto__;delete newProto.webdriver;navigator.__proto__ = newProto;')
実際に動かすとundefinedが帰ってくる。
puppeteerと似たような動作する。
良かった。
driver.execute_script('return navigator.webdriver')
>>> undefined