Селен без головы: как обходить обнаружение CloudFlare с использованием селенаPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Селен без головы: как обходить обнаружение CloudFlare с использованием селена

Сообщение Anonymous »

надеясь, что эксперт может помочь мне с загадкой селена/Cloudflare. Я могу получить веб-сайт для загрузки в обычном (без головы) селена, но независимо от того, что я пытаюсь, я не могу заставить его загрузить в безгола. Из постов Stackoverflow, как есть ли версия Selenium Webdriver, которая не обнаруживается? Я также посмотрел все свойства Ownod и windo.navigator объектов и исправил все различия между без головы и без головы, но каким-то образом не обнаруживается без головы. На данный момент мне очень любопытно, как CloudFlare может выяснить разницу. Спасибо за время! Пользователь-агент
[*] Заменить CDC _ на другую строку в Chromedriver
[*]

Код: Выделить всё

options.add_experimental_option("excludeSwitches", ["enable-automation"])
[*]

Код: Выделить всё

options.add_experimental_option('useAutomationExtension', False)
[*]options.add_argument('--disable-blink-features=AutomationControlled') (это было необходимо для того, чтобы веб-сайт загрузился без головы) Установите navigator.plugins , navigator.languages ​​ и navigator.mimeTypes
[*] set window.screeny , window.screentop , window.outerWidth , window.outerheight , чтобы быть Nonreo
[*] set window.chrome и window.navigator.chrome
[*] Установите ширину и высоту изображений, чтобы быть ненулевыми
[*] Установить параметры WebGl
[*] Исправлено modernizr

репликация эксперимента
, чтобы заставить веб -сайт загрузиться в Нормальный (без головы) Selenium, вы должны следить за ссылкой _blank с другого веб-сайта (так что целевой веб-сайт открывается в другой вкладке). Чтобы повторить эксперимент, сначала создайте файл HTML с Content link , а затем вставьте путь к этому html Файл в следующем коде.
Версия ниже (без головы) работает нормально и загружает веб-сайт, но если вы установите Options.headless = true , он застрянет на Cloudflare. < /p>
from selenium import webdriver
import time

# Replace this with the path to your html file
FULL_PATH_TO_HTML_FILE = 'file:///Users/simplepineapple/html/url_page.html'

def visit_website(browser):
browser.get(FULL_PATH_TO_HTML_FILE)
time.sleep(3)

links = browser.find_elements_by_xpath("//a[@href]")
links[0].click()
time.sleep(10)

# Switch webdriver focus to new tab so that we can extract html
tab_names = browser.window_handles
if len(tab_names) > 1:
browser.switch_to.window(tab_names[1])

time.sleep(1)
html = browser.page_source
print(html)
print()
print()

if 'Charts' in html:
print('Success')
else:
print('Fail')

time.sleep(10)

options = webdriver.ChromeOptions()
# If options.headless = True, the website will not load
options.headless = False
options.add_argument("--window-size=1920,1080")
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option('useAutomationExtension', False)
options.add_argument('--disable-blink-features=AutomationControlled')
options.add_argument('user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36')

browser = webdriver.Chrome(options = options)

browser.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', {
"source": '''
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined
});
Object.defineProperty(navigator, 'plugins', {
get: function() { return {"0":{"0":{}},"1":{"0":{}},"2":{"0":{},"1":{}}}; }
});
Object.defineProperty(navigator, 'languages', {
get: () => ["en-US", "en"]
});
Object.defineProperty(navigator, 'mimeTypes', {
get: function() { return {"0":{},"1":{},"2":{},"3":{}}; }
});

window.screenY=23;
window.screenTop=23;
window.outerWidth=1337;
window.outerHeight=825;
window.chrome =
{
app: {
isInstalled: false,
},
webstore: {
onInstallStageChanged: {},
onDownloadProgress: {},
},
runtime: {
PlatformOs: {
MAC: 'mac',
WIN: 'win',
ANDROID: 'android',
CROS: 'cros',
LINUX: 'linux',
OPENBSD: 'openbsd',
},
PlatformArch: {
ARM: 'arm',
X86_32: 'x86-32',
X86_64: 'x86-64',
},
PlatformNaclArch: {
ARM: 'arm',
X86_32: 'x86-32',
X86_64: 'x86-64',
},
RequestUpdateCheckStatus: {
THROTTLED: 'throttled',
NO_UPDATE: 'no_update',
UPDATE_AVAILABLE: 'update_available',
},
OnInstalledReason: {
INSTALL: 'install',
UPDATE: 'update',
CHROME_UPDATE: 'chrome_update',
SHARED_MODULE_UPDATE: 'shared_module_update',
},
OnRestartRequiredReason: {
APP_UPDATE: 'app_update',
OS_UPDATE: 'os_update',
PERIODIC: 'periodic',
},
},
};
window.navigator.chrome =
{
app: {
isInstalled: false,
},
webstore: {
onInstallStageChanged: {},
onDownloadProgress: {},
},
runtime: {
PlatformOs: {
MAC: 'mac',
WIN: 'win',
ANDROID: 'android',
CROS: 'cros',
LINUX: 'linux',
OPENBSD: 'openbsd',
},
PlatformArch: {
ARM: 'arm',
X86_32: 'x86-32',
X86_64: 'x86-64',
},
PlatformNaclArch: {
ARM: 'arm',
X86_32: 'x86-32',
X86_64: 'x86-64',
},
RequestUpdateCheckStatus: {
THROTTLED: 'throttled',
NO_UPDATE: 'no_update',
UPDATE_AVAILABLE: 'update_available',
},
OnInstalledReason: {
INSTALL: 'install',
UPDATE: 'update',
CHROME_UPDATE: 'chrome_update',
SHARED_MODULE_UPDATE: 'shared_module_update',
},
OnRestartRequiredReason: {
APP_UPDATE: 'app_update',
OS_UPDATE: 'os_update',
PERIODIC: 'periodic',
},
},
};
['height', 'width'].forEach(property => {
const imageDescriptor = Object.getOwnPropertyDescriptor(HTMLImageElement.prototype, property);

// redefine the property with a patched descriptor
Object.defineProperty(HTMLImageElement.prototype, property, {
...imageDescriptor,
get: function() {
// return an arbitrary non-zero dimension if the image failed to load
if (this.complete && this.naturalHeight == 0) {
return 20;
}
return imageDescriptor.get.apply(this);
},
});
});

const getParameter = WebGLRenderingContext.getParameter;
WebGLRenderingContext.prototype.getParameter = function(parameter) {
if (parameter === 37445) {
return 'Intel Open Source Technology Center';
}
if (parameter === 37446) {
return 'Mesa DRI Intel(R) Ivybridge Mobile ';
}

return getParameter(parameter);
};

const elementDescriptor = Object.getOwnPropertyDescriptor(HTMLElement.prototype, 'offsetHeight');

Object.defineProperty(HTMLDivElement.prototype, 'offsetHeight', {
...elementDescriptor,
get: function() {
if (this.id === 'modernizr') {
return 1;
}
return elementDescriptor.get.apply(this);
},
});
'''
})

visit_website(browser)

browser.quit()


Подробнее здесь: https://stackoverflow.com/questions/682 ... g-selenium
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»