Из-за распространения ботов использующих selenium, разработчики сайтов начали придумывать способы обнаружения ботов. Так как же обойти эти скрипты? Всё просто, но давай по порядку: Внимание, для примера я буду использовать ChromeDriver версии 93.0.4577.1500 ссылка на nuget: https://www.nuget.org/packages/Selenium.WebDriver.ChromeDriver/93.0.4577.1500/ Все действия ниже необходимо совершить ДО перехода на сайт / отправки запроса. Изменение user-agent: user-agent - идентификационная строка клиентского приложения или же просто имя браузера. Обычно никто его не проверяет, но для правдоподобности стоит его изменить. Для этого инициализируем экземпляр класса ChromeOptions. ChromeOptions options = new ChromeOptions(); Затем методом AddArgument() добавляем наш параметр. options.AddArgument("--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Firefox/78.0"); Под спойлером представлены различные значения --user-agent, которые можно вписать вместо Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Firefox/78.0 примеры user-agent MacOs: Mozilla/5.0 (Macintosh; Intel Mac OS X 11_5_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36 Mozilla/5.0 (Macintosh; Intel Mac OS X 11.5; rv:90.0) Gecko/20100101 Firefox/90.0 Mozilla/5.0 (Macintosh; Intel Mac OS X 11.5; rv:78.0) Gecko/20100101 Firefox/78.0 Mozilla/5.0 (Macintosh; Intel Mac OS X 11_5_1) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.2 Safari/605.1.15 Mozilla/5.0 (Macintosh; Intel Mac OS X 11_5_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36 Vivaldi/4.1 Windows: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36 Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36 Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:90.0) Gecko/20100101 Firefox/90.0 Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Firefox/78.0 Linux: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36 Mozilla/5.0 (X11; Linux i686; rv:90.0) Gecko/20100101 Firefox/90.0 Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:90.0) Gecko/20100101 Firefox/90.0 Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:90.0) Gecko/20100101 Firefox/90.0 Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:90.0) Gecko/20100101 Firefox/90.0 все user-agent представленные выше актуальны на момент написания статьи. Так же не забываем добавить переменную options при создании драйвера ChromeDriver driver = new ChromeDriver(options); Отключение расширений selenium: Некоторые сайты шагнули вперёд и определяют ботов по наличию некоторых расширений. Отключаются расширения при помощи пары методов ниже. options.AddArgument("--disable-blink-features=AutomationControlled"); options.AddExcludedArgument("enable-automation"); options.AddAdditionalCapability("useAutomationExtension", false); Так-же эти аргументы убирают надпись сообщающую о том, что "Браузером Chrome управляет автоматизированное тестовое ПО" Установка значения параметра webdriver: В большинстве случаев именно по этому параметру сайты и определяют бота. Создаем экземпляр класса IJavaScriptExecutor IJavaScriptExecutor js = (IJavaScriptExecutor)driver; Далее выполняем javascript скрипт, который в свою очередь изменит параметр webdriver на "undefined" js.ExecuteScript("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})"); На этом всё. если что-то из этого не сработало / выдало ошибку, то пишите под этим постом. Всем удачи!
Если использовать вместо хрома firefox, не придется ебаться с js. У fox намного больше настроек, которые ты можешь вписать в options.addargument. Что бы отрубить флажок webdriver на python: optiom.set_preference('dom.webdriver.enabled', False)
getrighton, js.ExecuteScript("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})"); необходимо что-бы в nabigator'е браузера не было поля 'webdriver'. На firefox нельзя отключить его через аргументы.
Работал с селеном очень давно, и у меня была задача обойти CloudFlare, так вот, я даю вам гарантию что половина сайтов смотрит в основном на заголовки (Accept,Accept-Encoding,Accept-Language и тд). Попробуйте запустить селен в режиме headless, а потом в not-headless и сравните заголовки. Так что не забывайте про смену заголовков браузера, а лучше используйте Puppeteer (там можно ловить запросы браузера в виде события, и редактировать запрос как тебе вздумается)
PutinSoft, большое спасибо за совет, puppeteer только начинаю изучать и уже вижу намного больший потенциал чем в селене)