Selenium Headless: So umgehen Sie die Wolkenflare -Erkennung mit SelenPython

Python-Programme
Guest
 Selenium Headless: So umgehen Sie die Wolkenflare -Erkennung mit Selen

Post by Guest »

In der Hoffnung, dass ein Experte mir mit einem Selenium/Cloudflare -Rätsel helfen kann. Ich kann eine Website zum Laden in normales (nicht headloses) Selen laden, aber egal was ich versuche, ich kann es nicht zum Kopflosen laden. < /P>
Ich habe den Vorschlägen befolgt Aus den Stackoverflow -Posts wie gibt es eine Version von Selenium WebDriver, die nicht nachweisbar ist? Ich habe auch alle Eigenschaften von Fenster und window.navigator Objekte angesehen und alle Diffs zwischen kopflos und nicht headlos behoben, aber irgendwie wird immer noch kopflos erkannt. Zu diesem Zeitpunkt bin ich extrem neugierig, wie Cloudflare den Unterschied herausfinden könnte. Vielen Dank für die Zeit! Benutzer-Agent
[*] Ersetzen Sie CDC _ durch eine andere Zeichenfolge in Chromedriver
[*]

Code: Select all

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

Code: Select all

options.add_experimental_option('useAutomationExtension', False)
[*]

Code: Select all

options.add_argument('--disable-blink-features=AutomationControlled')
(Dies war erforderlich, damit die Website nicht headlos geladen werden kann)
[*] Setzen Sie Navigator.webdriver = undefined
[*] Setzen Sie Navigator.plugins , navigator.languages ​​ und navigator.mimetypes
[*] Setzen Sie Window.screeny , window.screentop , window.outerwidth , window.outerHeight ungleicher
[*] Fenster einstellen.
[*] Setzen Sie die Breite und die Höhe der Bilder, die ungleich Null sind. >

Replikation des Experiments
, damit die Website eingeladen wird Normales (nicht headloses) Selen, Sie müssen einem _blank Link von einer anderen Website folgen (damit die Zielwebsite auf einer anderen Registerkarte geöffnet wird). Um das Experiment zu replizieren, erstellen Sie zuerst eine HTML -Datei mit dem Inhalt Link und fügen Sie dann den Pfad zu diesem HTML ein Datei im folgenden Code. auf CloudFlare. < /p>

Code: Select all

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()

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post