Zunächst möchte ich die Begriffe klären. Mit „Stealth Selenium“ meine ich eine Version von Selenium, die unentdeckt bleibt und Cloudflare umgehen kann. Ich beziehe mich dabei nicht auf eine bestimmte Tarntechnik. Es gibt verschiedene Möglichkeiten, Umgehungstechniken in Selenium zu implementieren. Es gibt Pakete, die dies übernehmen, oder Sie können den Befehl `execute_cdp_cmd` verwenden, um direkt mit der Chrome-API zu interagieren. Letzteres bietet Ihnen mehr Kontrolle, erfordert aber mehr Aufwand. Hier ist ein Beispiel, wie Sie damit den Wert des User-Agents ändern könnten:
driver.execute_cdp_cmd('Emulation.setUserAgentOverride', {
"userAgent": "Mozilla/5.0 (Windows NT 10.0; Win32; x86) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.129 Safari/537.36",
"platform": "Win32",
"acceptLanguage":"ro-RO"
})
Sie müssten jedoch CDP durchgehen und die APIs identifizieren, die es Ihnen ermöglichen, alle notwendigen Änderungen vorzunehmen. Testen wir also vorerst mit einigen Paketen.
1.1. Stealthy Selenium
Es gibt mindestens zwei Pakete, mit denen Sie Selenium „stealthy“ machen können. Bis jetzt ist jedoch bei keinem davon garantiert, dass es Cloudflare umgeht. Auch hier müssen wir testen, ob eines davon funktioniert. Schauen wir uns zunächst einmal `selenium-stealth` an. Dieses Paket ist ein Wrapper um `puppeteer-extra-plugin-stealth` und ermöglicht es, die Umgehungsmechanismen von Puppeteer mit Python-Selenium zu nutzen. Um es zu verwenden, müssen Sie es zunächst installieren. Öffnen Sie ein Terminalfenster und geben Sie diesen Befehl ein:
# Install selenium-stealth
~ » python3 -m pip install selenium-stealth
Jetzt sind Sie startklar. Wir können es nutzen, um unseren vorherigen Scraper unauffälliger zu machen:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium_stealth import stealth
import time
# Set Chrome to open in headless mode
options = Options()
options.headless = True
# Create a new Chrome instance
driver = webdriver.Chrome(options=options)
# Apply stealth to your webdriver
stealth(driver,
languages=["en-US", "en"],
vendor="Google Inc.",
platform="Win32",
webgl_vendor="Intel Inc.",
renderer="Intel Iris OpenGL Engine",
fix_hairline=True,
)
# Navigate to target
driver.get('https://www.snipesusa.com/')
# Give it some time to load
time.sleep(10)
# Take screenshot of page
driver.get_screenshot_as_file('stealth.png')
# Close browser
driver.quit()
Die Ausführung des Skripts lieferte mir diesmal ein anderes Ergebnis als die Standard-Selenium-Einstellungen:
Die zweite Option, die Sie verwenden können, ist `undetected_chromedriver`. Diese wird als „optimierter Selenium-Chromedriver“ beschrieben. Probieren wir es aus:
# Install undetected_chromedriver
~ » python3 -m pip install undetected_chromedriver
Der Code ist unserem Standard-Skript sehr ähnlich. Der Hauptunterschied liegt im Paketnamen. Hier ist ein einfacher Scraper mit `undetected_chromedriver` – mal sehen, ob er Cloudflare umgehen kann:
import undetected_chromedriver as uc
import time
# Set Chrome to open in headless mode
options = uc.ChromeOptions()
options.headless = True
# Create a new Chrome instance and maximize the window
driver = uc.Chrome(options=options, executable_path='/Applications/Google Chrome.app/Contents/MacOS/Google Chrome')
driver.maximize_window()
# Navigate to target
driver.get('https://www.snipesusa.com/')
# Give it some time to load
time.sleep(10)
# Take screenshot of page
driver.get_screenshot_as_file('stealth-uc.png')
# Close browser
driver.quit()
Wieder einmal läuft das Skript bei mir einwandfrei. Es scheint, dass zumindest diese beiden Pakete den Cloudflare-Schutz erfolgreich umgehen können. Zumindest kurzfristig. Um ehrlich zu sein, ist die Wahrscheinlichkeit groß, dass Cloudflare Ihre IP-Adresse aufspürt und sperrt, wenn Sie diese Skripte ausgiebig nutzen.
Lassen Sie mich Ihnen daher eine dritte Option vorstellen: die Web-Scraping-API.
1.2. Selenium mit Web Scraping API
Die Web Scraping API verfügt über diese erstaunliche Funktion namens Proxy-Modus. Mehr darüber können Sie hier lesen. Was ich hier jedoch hervorheben möchte, ist, dass sich unser Proxy-Modus erfolgreich in Selenium integrieren lässt. Auf diese Weise erhalten Sie Zugriff auf alle Umgehungsfunktionen, die wir implementiert haben. Und ich möchte Ihnen versichern, dass wir ein engagiertes Team haben, das an maßgeschneiderten Umgehungstechniken arbeitet. Technisch gesehen kümmern wir uns um IP-Rotationen, nutzen verschiedene Proxys, lösen Captchas und verwenden die Chrome-API, um unseren Fingerabdruck kontinuierlich zu ändern. In nicht-technischer Sprache bedeutet das: weniger Aufwand für Sie und eine höhere Erfolgsquote. Sie erhalten im Grunde die unauffälligste Version von Selenium, die es gibt. Und so funktioniert es:
# Install selenium-wire
~ » python3 -m pip install selenium-wire
Wir verwenden `selenium-wire`, um Selenium mit einem Proxy zu nutzen. Hier ist das Skript:
from seleniumwire import webdriver
import time
# Method to encode parameters
def get_params(object):
params = ''
for key,value in object.items():
if list(object).index(key) < len(object) - 1:
params += f"{key}={value}."
else:
params += f"{key}={value}"
return params
# Your WSA API key
API_KEY = '<YOUR_API_KEY>'
# Default proxy mode parameters
PARAMETERS = {
"proxy_type":"datacenter",
"device":"desktop",
"render_js":1
}
# Set Selenium to use a proxy
options = {
'proxy': {
"http": f"http://webscrapingapi.{ get_params(PARAMETERS) }:{ API_KEY }@proxy.webscrapingapi.com:80",
}
}
# Create a new Chrome instance
driver = webdriver.Chrome(seleniumwire_options=options)
# Navigate to target
driver.get('https://www.httpbin.org/get')
# Retrieve the HTML documeent from the page
html = driver.page_source
print(html)
# Close browser
driver.quit()
Wenn Sie dieses Skript ein paar Mal ausführen, werden Sie sehen, wie sich die IP-Adresse jedes Mal ändert. Das ist unser IP-Rotationssystem. Im Hintergrund kommen noch Umgehungstechniken hinzu. Darum müssen Sie sich nicht einmal kümmern. Wir kümmern uns um die Umgehung von Cloudflare, damit Sie sich mehr auf die Auswertung der Daten konzentrieren können.