Строка кода js для идентификации Selenium+Webdriver и его контрмер.

Python рептилия

Многие друзья любят использовать Selenium + Chromedriver в процессе разработки краулеров, думая, что это предотвратит их обнаружение механизмом защиты от краулеров веб-сайта.

Давайте не будем говорить о стратегии антисканирования, основанной на поведении пользователя, такой как Taobao, который представляет собой обычный небольшой веб-сайт.С помощью одной строки кода Javascript вы можете легко определить, использовали ли вы Selenium + Chromedriver для имитации браузера.

Давайте посмотрим на пример.

Используйте этот фрагмент кода, чтобы запустить окно Chrome:

from selenium.webdriver import Chrome

driver = Chrome()

Теперь откройте инструменты разработчика в этом окне и перейдите на вкладку «Консоль», как показано на изображении ниже.

Теперь введите следующий код js в это окно и нажмите Enter:

window.navigator.webdriver

Как видите, инструменты разработчика вернулисьtrue. Как показано ниже.

Однако, если вы откроете обычное окно Chrome и выполните ту же команду, вы увидите, что возвращаемое значение этой строки кода равноundefined,Как показано ниже.

Итак, если веб-сайт получает этот параметр через код js, возвращаемое значение равноundefinedПо описанию обычный браузер, возвратtrueВ описании используется Selenium для имитации браузера. Один улов. Вот пример кода js для обнаружения Selenium:

webdriver = window.navigator.webdriver;
if(webdriver){
	console.log('你这个傻逼你以为使用Selenium模拟浏览器就可以了?')
} else {
	console.log('正常浏览器')
}

Пока веб-сайт запускает этот код js при загрузке страницы, он может определить, использует ли посетитель Selenium для имитации браузера. Если это так, отключите доступ или активируйте другие механизмы защиты от сканирования.

Итак, как в этом случае сделать так, чтобы этот параметр не сообщал веб-сайту, что вы имитируете браузер во время разработки краулера?

Могут быть знакомые, знающие js, которые думают, что могут скрыть себя, переопределив этот параметр, но на самом деле это значение нельзя переопределить:

Друзья, которые более опытны в js, могут использовать следующий код для достижения:

Object.defineProperties(navigator, {webdriver:{get:()=>undefined}});

Эффект операции показан на следующем рисунке:

Модификация действительно удалась. Является ли это правописание надежным? Это не так. Если вы нажмете на ссылку, введете URL-адрес для входа на другую страницу или откроете новое окно в симулированном браузере, вы обнаружите, чтоwindow.navigator.webdriverснова сталtrue. Как показано ниже.

Итак, возможно ли снова выполнить приведенный выше код js через веб-драйвер после открытия каждой страницы, чтобы реализоватьwindow.navigator.webdriverУстановить какundefinedШерстяная ткань? Ни один.

Потому что когда вы выполняете:driver.get(网址), браузер откроет веб-сайт, загрузит страницу и запустит код js, поставляемый с веб-сайтом. так что после сбросаwindow.navigator.webdriverНа самом деле, раньше веб-сайт уже знал, что вы являетесь эмулируемым браузером.

Затем другой друг предположил, что эту проблему можно решить, написав плагин для Chrome, чтобы код js в плагине выполнялся раньше всего кода js, который идет с веб-сайтом.

Это конечно возможно, но есть способ проще, достаточно задать параметры запуска Chromedriver для решения проблемы.

Включите параметры экспериментальной функции для Chrome перед запуском Chromedriver.excludeSwitches, его значение['enable-automation'], полный код выглядит следующим образом:

from selenium.webdriver import Chrome
from selenium.webdriver import ChromeOptions

option = ChromeOptions()
option.add_experimental_option('excludeSwitches', ['enable-automation'])
driver = Chrome(options=option)

В запущенном в это время окне Хрома в правом верхнем углу выскочит подсказка, не трогайте, не нажимайте停用кнопка.

Повторите запрос на вкладке «Консоль» инструментов разработчика.window.navigator.webdriver, вы можете обнаружить, что это значение автоматически сталоundefined. И независимо от того, открываете ли вы новую веб-страницу, открываете новое окно или щелкаете ссылку, чтобы перейти на другую страницу, это не делает ееtrue. Эффект операции показан на рисунке ниже.

По состоянию на 20:46 12 февраля 2019 года метод, описанный в этой статье, можно использовать для входа в Zhihu. Если вы используете Selenium для входа непосредственно в Zhihu, появится всплывающий код подтверждения; сначала используйте метод, описанный в этой статье, а затем войдите в Zhihu, вы можете успешно замаскироваться под настоящий браузер, не выдавая код подтверждения.

На самом деле Selenium + Webdriver можно распознать более чем по одной функции. Чтобы узнать, как скрыть другие функции, обратите внимание на мою общедоступную учетную запись WeChat.