Существует ли версия селена, которая не обнаруживается? может ли селен быть действительно необнаружимым?
Я использую драйвер Chrome поверх селена на сервере Ubuntu. за жилой прокси-сетью. все же мой селен обнаруживается. Есть ли способ сделать Chrome Driver и селен на 100% необнаружимыми?
Я так долго пытался забыть о многих вещах, которые я сделал, в том числе 1) пробовать разные версии chrome 2) добавлять несколько флагов и удалять некоторые слова из файла драйвера chrome. 3) испортить его за прокси. жилые тоже. используя режим инкогнито. 4) загрузка профилей. 5) случайные движения мыши. 6) все рандомизировано
Я ищу настоящую версию селена, которая на 100% не обнаруживается. если это когда-либо существовало. Или другой способ автоматизации, который не обнаруживается бот-трекерами.
это часть запуска браузера
sx = random.randint(1000,1500)
sn = random.randint(3000,4500)
display = Display(visible=0, size=(sx,sn))
display.start()
randagent = random.randint(0,len(useragents_desktop)-1)
uag = useragents_desktop[randagent]
#this is to prevent ip leaking
preferences =
"webrtc.ip_handling_policy" : "disable_non_proxied_udp",
"webrtc.multiple_routes_enabled": False,
"webrtc.nonproxied_udp_enabled" : False
chrome_options.add_experimental_option("prefs", preferences)
chrome_options.add_argument("--disable-dev-shm-usage")
chrome_options.add_argument("--no-sandbox")
chrome_options.add_argument("--disable-impl-side-painting")
chrome_options.add_argument("--disable-setuid-sandbox")
chrome_options.add_argument("--disable-seccomp-filter-sandbox")
chrome_options.add_argument("--disable-breakpad")
chrome_options.add_argument("--disable-client-side-phishing-detection")
chrome_options.add_argument("--disable-cast")
chrome_options.add_argument("--disable-cast-streaming-hw-encoding")
chrome_options.add_argument("--disable-cloud-import")
chrome_options.add_argument("--disable-popup-blocking")
chrome_options.add_argument("--ignore-certificate-errors")
chrome_options.add_argument("--disable-session-crashed-bubble")
chrome_options.add_argument("--disable-ipv6")
chrome_options.add_argument("--allow-http-screen-capture")
chrome_options.add_argument("--start-maximized")
wsize = "--window-size=" + str(sx-10) + ',' + str(sn-10)
chrome_options.add_argument(str(wsize) )
prefs = {"profile.managed_default_content_settings.images": 2}
chrome_options.add_experimental_option("prefs", prefs)
chrome_options.add_argument("blink-settings=imagesEnabled=true")
chrome_options.add_argument("start-maximized")
chrome_options.add_argument("user-agent="+uag)
chrome_options.add_extension(pluginfile)#this is for the residential proxy
driver = webdriver.Chrome(executable_path="/usr/bin/chromedriver", chrome_options=chrome_options)
3 ответа
Тот факт, что селен обнаруживается, не зависит от конкретной версии Selenium, Chrome или ChromeDriver. Сами веб-сайты могут обнаруживать сетевой трафик и могут идентифицировать браузерный клиент, т.е. веб-браузер, как контролируемый WebDriver.
Однако некоторые общие подходы, позволяющие избежать обнаружения при просмотре веб-страниц, заключаются в следующем:
- Первый и главный атрибут сайта, который может определить ваш скрипт / программа, - это размер вашего монитора. Поэтому рекомендуется не использовать обычный видовой экран.
- Если вам нужно отправить несколько запросов на веб-сайт, вам нужно постоянно менять агента пользователя при каждом запросе. Здесь вы можете найти подробное обсуждение о том, как изменить пользовательский агент Google Chrome в Selenium?
- Для имитации поведения, подобного человеческому, вам может потребоваться замедлить выполнение скрипта даже за пределами создания WebDriverWait и Ожидаемые условия.
time.sleep(secs)
, Здесь вы можете найти подробную дискуссию о том, как перевести webdriver в python на миллисекунды.
@Antoine Vastel в своем блоге сайта Detecting Chrome Headless упомянул несколько подходов, которые отличают браузер Chrome от браузера без головы Chrome.
Пользовательский агент: атрибут пользовательского агента обычно используется для определения ОС, а также браузера пользователя. В Chrome версии 59 он имеет следующее значение:
Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/59.0.3071.115 Safari/537.36
Проверить наличие Chrome без головы можно через:
if (/HeadlessChrome/.test(window.navigator.userAgent)) { console.log("Chrome headless detected"); }
Плагины:
navigator.plugins
возвращает массив плагинов, присутствующих в браузере. Как правило, в Chrome мы находим плагины по умолчанию, такие какChrome PDF viewer
или жеGoogle Native Client
, Напротив, в режиме без заголовка возвращаемый массив не содержит плагинов.Проверить наличие плагинов можно с помощью:
if(navigator.plugins.length == 0) { console.log("It may be Chrome headless"); }
Языки: в Chrome два атрибута Javascript позволяют получать языки, используемые
user: navigator.language
а такжеnavigator.languages
, Первый - это язык пользовательского интерфейса браузера, а второй - массив строк, представляющих предпочтительные языки пользователя. Тем не менее, в режиме без головы,navigator.languages
возвращает пустую строку.Проверить наличие языков можно через:
if(navigator.languages == "") { console.log("Chrome headless detected"); }
WebGL: WebGL - это API для выполнения 3D-рендеринга на холсте HTML. С помощью этого API можно запросить информацию о поставщике графического драйвера, а также о представителе графического драйвера. С ванильным Chrome и Linux мы можем получить следующие значения для рендерера и вендора:
Google SwiftShader
а такжеGoogle Inc.
, В режиме без головы мы можем получитьMesa OffScreen
, которая является технологией, используемой для рендеринга без использования какой-либо оконной системы иBrian Paul
, которая является программой, которая запустила графическую библиотеку Mesa с открытым исходным кодом.Проверить наличие WebGL можно через:
var canvas = document.createElement('canvas'); var gl = canvas.getContext('webgl'); var debugInfo = gl.getExtension('WEBGL_debug_renderer_info'); var vendor = gl.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL); var renderer = gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL); if(vendor == "Brian Paul" && renderer == "Mesa OffScreen") { console.log("Chrome headless detected"); }
Не все Chrome без заголовка будут иметь одинаковые значения для вендора и рендерера. Другие сохраняют значения, которые также могут быть найдены в безголовой версии. Тем не мение,
Mesa Offscreen
а такжеBrian Paul
указывает на наличие безголовой версии.
Функции браузера: библиотека Modernizr позволяет проверить, присутствует ли в браузере широкий спектр функций HTML и CSS. Единственное различие, которое мы обнаружили между Chrome и Chrome без головы, заключалось в том, что у последнего не было функции линии роста волос, которая обнаруживает поддержку
hidpi/retina hairlines
,Проверить наличие функции волосяного покрова можно с помощью:
if(!Modernizr["hairline"]) { console.log("It may be Chrome headless"); }
Отсутствующее изображение: последнее в нашем списке также представляется наиболее надежным, исходя из размера изображения, используемого Chrome в случае, если изображение не может быть загружено. В случае ванильного Chrome изображение имеет ширину и высоту, которые зависят от масштаба браузера, но отличаются от нуля. В Chrome без головы изображение имеет ширину и высоту, равные нулю.
Проверить наличие отсутствующего изображения можно с помощью:
var body = document.getElementsByTagName("body")[0]; var image = document.createElement("img"); image.src = "http://iloveponeydotcom32188.jg"; image.setAttribute("id", "fakeimage"); body.appendChild(image); image.onerror = function(){ if(image.width == 0 && image.height == 0) { console.log("Chrome headless detected"); } }
Рекомендации
Вы можете найти некоторые похожие обсуждения в:
почему бы не попробовать необнаруженный хромированный драйвер?
Оптимизированный патч Selenium Chromedriver, который не запускает службы защиты от ботов, такие как Distill Network / Imperva / DataDome / Botprotect.io, автоматически загружает двоичный файл драйвера и исправляет его.
Протестировано до текущих бета-версий Chrome. Работает также в браузере Brave и во многих других браузерах на основе Chromium. Python 3.6 ++.
вы можете установить его с помощью:
pip install undetected-chromedriver
Есть важные вещи, о которых вам следует помнить: Из-за внутренней работы модуля его необходимо просматривать программно (например, используя .get(url)). Никогда не используйте графический интерфейс для навигации. Использование клавиатуры и мыши для навигации может привести к обнаружению! Новые вкладки: та же история. Если вам действительно нужны несколько вкладок, откройте вкладку с пустой страницей (подсказка: url - это данные:, включая запятую, и да, драйвер принимает это) и делайте свои дела как обычно. Если вы будете следовать этим «правилам» (на самом деле его поведение по умолчанию), тогда вы отлично проведете время.
In [1]: import undetected_chromedriver as uc
In [2]: driver = uc.Chrome()
In [3]: driver.execute_script('return navigator.webdriver')
Out[3]: True # Detectable
In [4]: driver.get('https://distilnetworks.com') # starts magic
In [4]: driver.execute_script('return navigator.webdriver')
In [5]: None # Undetectable!
Как насчет:
import random
from selenium import webdriver
import time
driver = webdriver.Chrome("C:\\Users\\DusEck\\Desktop\\chromedriver.exe")
username = "username" # data_user
password = "password" # data_pass
driver.get("https://www.depop.com/login/") # get URL
driver.find_element_by_xpath('/html/body/div[1]/div/div[3]/div[2]/button[2]').click() # Accept cookies
split_char_pw = [] # Empty lists
split_char = []
n = 1 # Splitter
for index in range(0, len(username), n):
split_char.append(username[index: index + n])
for user_letter in split_char:
time.sleep(random.uniform(0.1, 0.8))
driver.find_element_by_id("username").send_keys(user_letter)
for index in range(0, len(password), n):
split_char.append(password[index: index + n])
for pw_letter in split_char_pw:
time.sleep(random.uniform(0.1, 0.8))
driver.find_element_by_id("password").send_keys(pw_letter)