Akamai Bot Manager ist eine der häufigsten Anti-Bot-Lösungen auf dem Markt. Es wird von vielen hochkarätigen Websites verwendet, von E-Commerce-Sites bis hin zu Reise-Sites, und kann je nach Konfiguration schwierig sein, um zu umgehen. Basierend auf meiner Erfahrung ist das typische Muster, mit dem ich konfrontiert bin, wenn eine Website den Akamai Bot Manager-Schutz aktiviert, dass der Scraper (in der Regel ein Scrapy in meinem Stack) hängt und ab der ersten Anfrage ausfällt. Aber was ist Akamai Bot Manager, und wie kann ich sehen, ob eine Website es verwendet? Akamai Bot Manager Übersicht Die Bot-Erkennung von Akamai funktioniert wie jede andere moderne Anti-Bot-Schutz-Software auf mehreren Schichten. ist eines der ersten: Akamai analysiert die TLS-Handshake- und Verbindungsdetails (JA3 TLS-Fingerabdruck, Verschlüsselungs-Suiten, TLS-Version usw.), um zu sehen, ob sie einem echten Browser oder einem bekannten Automatisierungswerkzeug entsprechen. Network fingerprinting Sie überprüft auch – Echte Browser verwenden heutzutage fast immer HTTP/2+, und sie senden HTTP-Header in einer bestimmten Reihenfolge und Format. Wenn ein Client immer noch HTTP/1.1 verwendet oder Header in einer nicht-Browser-Reihenfolge hat, ist es eine rote Flagge. Der Spiegel eines echten Browsers ist entscheidend. HTTP/2 usage and header order and their order Ein weiterer Layer ist Akamai überprüft, ob die Client-IP aus einem Wohnnetzwerk, einem Mobilfunknetzwerk oder einem Rechenzentrum stammt. Wohn- und Mobil-IPs (die Art der tatsächlichen Benutzer haben) erzielen einen hohen Vertrauenswert, während bekannte Reihen von Rechenzentrums-IPs automatisch verdächtig sind. – immer aus verschiedenen Echtbenutzer-Standorten kommen zu erscheinen, nicht aus einer Cloud-Server-Farm. IP reputation and analysis residential proxies und schließlich, Ein JavaScript-Sensor auf der Webseite sammelt eine Vielzahl von Datenpunkten über die Umgebung und Interaktionen des Clients (wie Timing, Mausbewegungen oder deren Abwesenheit, ungewöhnliche Eigenschaften im Browserobjekt usw.).Die AI-Modelle von Akamai schneiden diese Daten zusammen, um jeder Sitzung einen Bot-Wahrscheinlichkeitspunkt zu geben. Akamai beschäftigt Verhaltensanalyse mit Client-Side-Skripts und AI-Modellen Akamai beschäftigt Verhaltensanalyse Verhaltensanalyse mit Client-Side-Skripts und AI-Modellen Aber wie können wir erkennen, dass eine Website Akamai Bot Manager verwendet? Abgesehen von Wenn Sie bemerken, die und Cookies, die auf einer Website verwendet werden, ist das klarste Zeichen dafür, dass sie Akamai zum Schutz benutzt. Die übliche Wappalyzer Browser-Erweiterung abck Ak_bmsc Die übliche Wappalyzer Browser-Erweiterung abck abck Ak_bmsc Ak_bmsc Angesichts dieser Abwehrmaßnahmen haben sich viele Scrapy-Benutzer Download Manager um Akamai zu umgehen. Dieses Plugin integriert die Bibliothek, um echte Browser-Netzwerk-Signaturen vorzustellen. scrapy-impersonate curl_cffi In der Praxis macht Scrapy Impersonate Ihre Scrapy-Spider-Anfragen "aussehen" wie ein Chrome oder Firefox: Es bietet TLS-Fingerabdrücke (JA3) an, die mit diesen Browsern übereinstimmen, verwendet HTTP/2, und passt sogar niedrige HTTP/2-Frame-Header an, um die Muster des Browsers nachzuahmen. Beschränkungen von Scrapy Impersonate Während Scrapy Impersonate ein leistungsstarkes Tool ist, hat es bestimmte Einschränkungen: Scrapy Impersonate is designed as a Scrapy download handler, which means it only works within Scrapy’s asynchronous framework. If your project doesn’t use Scrapy or you want to switch to a different framework (like a simple script with / or an asyncio pipeline), you can’t directly carry over its capabilities. Migrating away from Scrapy often means a of your HTTP logic, and you’d lose the built-in TLS spoofing unless you implement a new solution from scratch. Locked into Scrapy: requests httpx complete rewrite Using Scrapy Impersonate alongside proxy rotation can be tricky. Under the hood, it replaces Scrapy’s default downloader with one based on , which doesn’t seamlessly integrate with Scrapy’s proxy middleware. Early adopters discovered that HTTPS proxy support was broken because the proxy handling code was bypassed. Although fixes and workarounds (like disabling Scrapy’s built-in proxy handling and configuring directly) exist, it’s harder to rotate proxies or handle proxy authentication with this setup. Robust error handling for proxy failures (e.g., detecting a dead proxy and retrying) is not as straightforward as with Scrapy’s standard downloader, because errors bubble up from the layer and may not trigger Scrapy’s usual retry logic. Proxy Rotation Challenges: curl_cffi curl_cffi curl Scrapy Impersonate currently supports a finite list of browser fingerprints (Chrome, Edge, Safari, etc., up to certain versions). This list can lag behind the latest browser releases. You might be stuck impersonating an older browser version, which could be a problem if a target site specifically requires the nuances of a newer TLS handshake (some advanced WAFs actually check minor details that change between Chrome versions). Maintenance and Flexibility: Perhaps most importantly, even with proper TLS and HTTP/2 impersonation, . For websites that have implemented a higher level of protection, checking also the browser fingerprint, any browserless configuration, including Scrapy Impersonate, isn’t sufficient for Akamai or similar top-tier bot defenses. You might get past the TLS handshake, but fail on other signals (like the absence of the expected sensor data or subtle discrepancies in headers/cookies). In other words, it’s a piece of the puzzle, not a complete solution. Not a Silver Bullet: Akamai Bot Manager can still detect and block you Die Lösung, die wir heute sehen werden, hilft bei der Lösung der ersten beiden Punkte: Wir werden zusammenketten , für einen optimalen TLS-Fingerabdruck und einen rotierenden Residential Proxy, um unsere IPs zu rotieren und höhere Reputationswerte zu erzielen. JA3Proxy JA3Proxy TLS Fingerabdrücke und JA3 Bevor Sie in die Lösung eintauchen, ist es wichtig zu verstehen, was genau wir täuschen.Jeder HTTPS-Client präsentiert einen einzigartigen Dieser Fingerabdruck ist eine Kombination aus der Version des TLS-Protokolls und einer Reihe von Optionen, die der Client behauptet, dass er unterstützt – denken Sie daran, dass es der „Dialekt“ des Clients ist, um TLS zu sprechen. TLS fingerprint e.g. TLS 1.2 vs TLS 1.3. Modern browsers will offer 1.3 (while still allowing 1.2 for compatibility). Older clients or some libraries might only do 1.2. Supported TLS Version: the list of cryptographic algorithms the client can use, in preferred order. Browsers tend to have long lists including ciphers like AES-GCM, ChaCha20, etc., plus some GREASE (randomized) values to prevent fingerprinting. Cipher Suites: extra features in TLS, like Server Name Indication (SNI), supported groups (elliptic curves), ALPN (which is used for HTTP/2 negotiation), etc. Both the presence of certain extensions and their order matter. Extensions: Das Konzept des ist eine standardisierte Möglichkeit, diese TLS Client Hello-Details aufzuzeichnen. JA3, benannt nach den Initialen seiner Schöpfer, komponiert eine Fingerabdruckzeile, indem sie die obigen Felder in einer bestimmten Reihenfolge verflochten: JA3 fingerprinting JA3_string = TLSVersion,CipherSuiteIDs,ExtensionIDs,EllipticCurveIDs,EllipticCurveFormatIDs Jede Liste (Zahlen, Erweiterungen usw.) wird durch und die Abschnitte von Beispielsweise kann ein Chrome-Browser eine JA3-Strength wie folgt erzeugen: - , 771,4866-4867-4865-....-47-255,0-11-10-16-23-...-21,29-23-30-25-24,0-1-2 Dies repräsentiert TLS 1.2 (771 ist 0x0303), ein spezifischer Satz von Verschlüsselungssuiten, Erweiterungen, unterstützten Kurven und Kurvenformaten (die Zahlen sind standardisierte IDs). Sicherheits-Tools protokollieren oder vergleichen oft den MD5-Hash (da er leichter zu handhaben ist als eine lange Reihenfolge von Zahlen). MD5 hashed Warum ist das für die Bot-Erkennung wichtig? Chrome Version X auf Windows wird präsentieren Sie den gleichen JA3-Fingerabdruck auf die Liste. Firefox wird seine eigene separate JA3 haben. browser TLS stacks are fairly uniform immer Die Python-Anfragenbibliothek (die OpenSSL unter der Kappe verwendet) hat eine JA3, die sich von jedem Mainstream-Browser völlig unterscheidet, so dass sie leicht erkennbar ist. Anti-Bot-Dienste wie Akamai pflegen Datenbanken von JA3-Hashes: Wenn Ihr JA3 nicht auf der "bekannten guten" Liste steht (gemeinsame Browser) oder wenn es auf einer bekannten Automatisierungsliste steht, werden Sie gekennzeichnet. Zusammenfassend, um die TLS-Fingerabdruckschecks von Akamai zu bestehen, . we need our client’s JA3 to match a popular browser Dies bedeutet in der Regel das Nachahmen des neuesten Chrome- oder Firefox-Fingerabdrucks (da dies die häufigsten legitimen Benutzer im Web sind). Die einfache Änderung der User-Agent-String reicht nicht aus – wir müssen den TLS-Handshake auf niedriger Ebene ändern. (das selbst nutzt einen speziellen Aufbau von Curl- und TLS-Bibliotheken, um Browser zu imitieren). curl_cffi TLS Impersonation Proxy + Residential Proxy Chain Unsere Lösung ist es, um unseren Scraper praktisch von einem echten Browser-Benutzer nicht zu unterscheiden: chain two proxies JA3Proxy is an open-source tool that acts as an HTTP(S) proxy that replays traffic with a chosen TLS fingerprint. In other words, you run JA3Proxy locally, configure it to imitate a specific browser’s TLS handshake, and then direct your scraper traffic through it. JA3Proxy will terminate your TLS connection and initiate a new TLS handshake to the target site using the impersonated fingerprint. From the target site’s perspective, it looks like, say, a Chrome browser connecting. The beauty of this approach is that – you can use Python , , cURL, or anything, by simply pointing it at JA3Proxy. You are no longer locked into Scrapy or any particular library to get browser-like TLS; the proxy takes care of it. JA3Proxy for TLS Impersonation: it’s client-agnostic requests httpx Under the hood, JA3Proxy uses (an advanced TLS library in Go) to customize the Client Hello. It supports a variety of client profiles (Chrome, Firefox, Safari, etc., across different versions). You can, for example, configure it to mimic the latest browsers available in the library. For our needs, we’d choose the latest available Chrome fingerprint, Chrome 133. As for Scrapy-Impersonate, the integration of the latest browsers in the library can take some time, but until this gets regularly updated, it’s not an issue. uTLS One thing to note: JA3Proxy focuses on TLS fingerprints (the JA3 part). It doesn’t inherently modify HTTP headers (other than those that relate to TLS, like ALPN for HTTP/2) or handle higher-level browser behaviors. It gets us past the network fingerprinting, which is the hardest to change, but we must still ensure our HTTP headers and usage patterns are correct. Luckily, we can manually set headers in our HTTP client to mimic a browser (User-Agent, etc.), and HTTP/2 can be achieved as long as the TLS negotiation allows it (Chrome’s Client Hello will advertise ALPN support for h2, so if the site supports it, JA3Proxy will negotiate HTTP/2). The second part of the chain is an upstream . This will take care of the IP reputation and distribution. Residential Proxy for IP Rotation: residential proxy The combined effect is powerful: to Akamai, your scraper now looks like Chrome 133 running on a residential IP. The TLS handshake matches Chrome’s JA3, the HTTP/2 and headers can be adjusted to match Chrome, and the source IP is a regular household. This addresses the major fingerprinting vectors at the network level. It doesn’t solve Akamai’s JavaScript-based challenges by itself, but this should be enough to bypass most of the websites you’ll encounter. Setup-Anleitung für JA3Proxy Lassen Sie uns JA3Proxy einrichten und es mit einem Residential Proxy vernetzen. Installieren von JA3Proxy JA3Proxy ist in Go geschrieben. Sie haben zwei einfache Optionen: kompilieren aus der Quelle oder verwenden Sie einen Docker-Container. Um aus der Quelle zu erstellen, müssen Sie Go installiert haben. git clone https://github.com/LyleMi/ja3proxy.git cd ja3proxy make Dies sollte eine ausführbar im Ordner. (Alternativ können Sie manuell, da das Projekt Go-basiert ist.) ja3proxy go build Wenn Sie Docker bevorzugen, gibt es ein vorgefertigtes Bild auf GitHub Container Registry. docker pull ghcr.io/lylemi/ja3proxy:latest wird das neueste Bild abgerufen. Sie können es dann mit (Wir werden den Run-Befehl in einem Moment zeigen.) Docker ist bequem, weil es alles verpackt, ohne eine lokale Go-Umgebung zu benötigen. docker run In meiner persönlichen Erfahrung war die Installation ein bisschen wie ein Albtraum. Ich konnte das Docker-Image nicht funktionieren, da ich ständig Fehler bekam, wenn ich versuchte, mich mit ihm zu verbinden, da kein Browser erkannt wurde. Dann beschloss ich, manuell auf meinem Mac zu bauen, und ich traf die gleichen Fehler. Jedoch fand ich nach Stunden des Debugs, dass ich einige Abhängigkeiten, insbesondere uTLS, aktualisieren musste; es gab Konflikte in den Versionen der Bibliotheken, und all dies verursachte Probleme. Erwerben oder Erstellen von TLS-Zertifikaten JA3Proxy kann als HTTPS-Proxy fungieren, was bedeutet, dass es TLS abfängt und Ihrem Client sein eigenes Zertifikat präsentiert. Standardmäßig sucht er nach und Wenn Sie ein Zertifikat nicht bereitstellen, können Sie es im einfachen Textmodus ausführen (als normaler HTTP-Proxy) und die Zertifikatsprüfung in Ihrem Client einfach ignorieren (nicht für die Produktion empfohlen, aber für Tests akzeptabel). cert.pem key.pem Die beste Praxis besteht darin, ein selbst unterzeichnetes Root-Zertifikat und einen Schlüssel zu generieren und Ihren Scraper so zu konfigurieren, dass er diesem Zertifikat vertraut, sodass Sie den Datenverkehr ohne Sicherheitswarnungen abfangen können. openssl req -x509 -newkey rsa:2048 -sha256 -days 365 -nodes -keyout key.pem -out cert.pem -subj "/CN=JA3Proxy" Dies schafft a / Paar gültig für ein Jahr. (Für den Produktionsgebrauch können Sie sogar eine legitime interne CA verwenden, wenn Sie diese Einrichtung haben, aber für die meisten Scraping-Zwecke ist eine selbstunterschriebene in Ordnung, solange Ihr Kunde weiß, es zu vertrauen.) cert.pem key.pem JA3Proxy mit einem Chrome Fingerabdruck starten Wenn Sie das Binär verwenden, führen Sie einen Befehl aus wie: ./ja3proxy -port 8080 -client Chrome -version 131 -cert cert.pem -key key.pem -upstream YOURPROXYIP:PORT Lassen Sie uns diesen Befehl abbrechen: -Port 8080 sagt ihm, auf Port 8080 zuzuhören (Sie können bei Bedarf einen anderen Port auswählen). -client Chrome -version 131 wählt das Fingerabdruckprofil. In diesem Beispiel verwendet es das eingebaute Profil für Chrome 131. Sie würden diese durch das Profil ersetzen, das dem gewünschten Browser/Version entspricht – z.B. wenn Chrome 130 in der neuesten Version unterstützt wird, können Sie -client Chrome -version 130 verwenden. (Sie können die Liste der verfügbaren Fingerabdrücke finden, indem Sie die Dokumentation von JA3Proxy oder die uTLS-Bibliothek überprüfen, die sie verwendet. -cert und -key geben die TLS-Zertifikatdateien an, die wir in Schritt 2 generiert haben. -upstream 123.45.67.89:1080 ist die Adresse des Upstream-Proxys. Dies sollte durch Ihren Wohn-Proxy-Endpunkt ersetzt werden. Wichtig: JA3Proxy erwartet, dass dies eine SOCKS5-Proxy-Adresse__github.com__ sein wird. Wenn Ihr Anbieter Ihnen etwas wie proxy.provider.com:8000 mit einem Benutzernamen/Passwort gab, können Sie das Format Username:password@proxy.provider.com:8000 ausprobieren. (JA3Proxy wird die String-Authentifizierung durchführen und sollte die Authentifizierung für SOCKS5 verwalten, wenn es im User:pass@host:port-Formular angegeben wird. Wenn das nicht funktioniert, können Sie Ihren Wohn-Proxy konfigurieren, um IP-Zulassung zu erhalten oder Wenn Sie Docker verwenden, wäre das Äquivalent: docker run -p 8080:8080 \ -v $(pwd)/cert.pem:/app/cert.pem -v $(pwd)/key.pem:/app/key.pem \ ghcr.io/lylemi/ja3proxy:latest \ -client Chrome -version 133 -cert /app/cert.pem -key /app/key.pem \ -upstream YOURPROXYIP:PORT Wir montieren den Cert und den Schlüssel in den Container und exponieren den Port 8080. Anpassen Sie den Befehl, um Ihre tatsächlichen Proxy-Auskünfte/Hosts aufzunehmen. (oder welchen Host/Port Sie angegeben haben). localhost:8080 Ein real-world-nutzungsfall - MrPorter.com MrPorter.com ist eine Mode-E-Commerce-Website, die sich zusammen mit vielen anderen in der Branche mit Akamai Bot Manager schützt. Mit einer einfachen Python-Anfrage, wie in der Datei angegeben Im Repository habe ich einen Timeout-Fehler aufgetreten, wie erwartet. simple_request.py import requests URL = "https://www.mrporter.com/en-gb/mens/product/loewe/clothing/casual-shorts/plus-paula-s-ibiza-wide-leg-printed-cotton-blend-terry-jacquard-shorts/46376663162864673" headers = { "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8", "accept-language": "en-US,en;q=0.5", "priority": "u=0, i", "sec-ch-ua": "\"Brave\";v=\"135\", \"Not-A.Brand\";v=\"8\", \"Chromium\";v=\"135\"", "sec-ch-ua-mobile": "?0", "sec-ch-ua-platform": "\"macOS\"", "sec-fetch-dest": "document", "sec-fetch-mode": "navigate", "sec-fetch-site": "none", "sec-fetch-user": "?1", "sec-gpc": "1", "service-worker-navigation-preload": "true", "upgrade-insecure-requests": "1", "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36" } def main(): try: response = requests.get(URL, headers=headers, timeout=10) response.raise_for_status() print(response.text) except requests.RequestException as e: print(f"Error fetching the page: {e}") if __name__ == "__main__": main() Das Ergebnis: Error fetching the page: HTTPSConnectionPool(host='www.mrporter.com', port=443): Read timed out. (read timeout=10) Durch die Verwendung , der Ich konnte jedoch keine Datenbank finden, die darauf hinweist, dass Python-Anfragen üblicherweise diesen Fingerabdruck verwenden. the Scrapfly TLS Fingerprint tool Wir können die Ergebnisse sehen Das Scrapfly TLS Fingerprint Tool Wir können die Ergebnisse sehen Die Reihenfolge der Cipher Suites ist anders, und daher wird auch der Fingerabdruck anders sein. Lassen Sie uns jetzt den JA3Proxy-Docker starten, ohne einen Wohnproxy anzuschließen, und sehen Sie, was passiert. docker run -p 8080:8080 \ -v $(pwd)/cert.pem:/app/cert.pem -v $(pwd)/key.pem:/app/key.pem \ ghcr.io/lylemi/ja3proxy:latest \ -client Chrome -version 131 -cert /app/cert.pem -key /app/key.pem Wir haben die Botschaft HTTP Proxy Server listen at :8080, with tls fingerprint 131 Chrome So können wir localhost:8080 als Proxy in unserem Python-Anforderungsscript verwenden. Eine weitere Ursache für Fehler in meiner Installation war, dass ich versuchte, Python-Anfragen zu verwenden, um mich mit JA3Proxy zu verbinden.Nachdem ich eine Weile ausgegraben hatte, stellte ich fest, dass das Problem darin bestand, dass die Anfrage-Bibliothek HTTP/2 nicht unterstützt, während JA3Proxy dies bei der Verwendung einer modernen Version von Chrome tut. Für meine Tests muss ich HTTPX verwenden, wie in der Datei gezeigt . request_with_proxies.py In diesem Fall, wenn ich die Scrapfly TLS API erneut anrufe, wird der erste Teil der JA3-String (die Cipher-Ordnung) . ist identisch mit dem von meinem Browser ist identisch mit dem von meinem Browser Als letzter Test, wenn wir dieses Skript verwenden, um die MrPorter-Seite anzufordern, können wir es ohne Probleme herunterladen. Einrichten eines Residential Proxy Nachdem wir die Fälschung des TLS-Fingerabdrucks gelöst haben, müssen wir nur die IP rotieren, die die Zielwebsite sehen wird. JA3Proxy hat eine Option, die uns dabei hilft, genannt Upstream. Wenn Sie den JA3Proxy-Befehl wie folgt ausführen, ./ja3proxy -addr 127.0.0.1 -client Chrome -version 131 -cert cert.pem -key key.pem -upstream socks5h://USER:PASS@PROVIDER:PORT -debug Wir können unsere Anfragen mithilfe unseres bevorzugten Proxy-Anbieters tunelieren. Bitte beachten Sie, dass Sie über SOCKS5 verbinden müssen, so stellen Sie sicher, dass Ihr Anbieter diese Funktion unterstützt. Durch die Überprüfung der IP nach diesem, kann ich sehen, dass meine Wohnanlage rotierende IPs vorhanden sind, und ich kann weiterhin herunterladen MRPorter Seiten ohne Probleme. pierluigivinciguerra@Mac 85.AKAMAI-JA3PROXY % python3.10 request_with_proxies.py 200 {"ip":"5.49.222.37"} pierluigivinciguerra@Mac 85.AKAMAI-JA3PROXY % python3.10 request_with_proxies.py 200 {"ip":"197.244.237.29"} pierluigivinciguerra@Mac 85.AKAMAI-JA3PROXY % python3.10 request_with_proxies.py 200 {"ip":"41.193.144.67"} pierluigivinciguerra@Mac 85.AKAMAI-JA3PROXY % python3.10 request_with_proxies.py 200 {"ip":"102.217.240.216"} pierluigivinciguerra@Mac 85.AKAMAI-JA3PROXY % python3.10 request_with_proxies.py Schlussfolgerungen In diesem Beitrag haben wir gesehen, wie man den Akamai Bot Manager auf der MrPorter-Website umgeht.Das Schutzniveau der Website ist mittelmäßig, so dass es keine komplexe Browser-Fingerabdruck-Herausforderung gibt, die zu umgehen ist, aber nach meiner Erfahrung ist es der häufigste Einsatzfall, wenn man Akamai auf unserer Straße trifft. Ich wähle den JA3Proxy-Ansatz, um ihn zu umgehen, so dass diese Lösung in verschiedenen Frameworks verwendet werden kann. Wenn Sie Scrapy verwenden, können Sie sich trotz seiner Einschränkungen immer auf Scrapy Impersonate verlassen oder Sie können versuchen, die Verschlüsselungen in der richtigen Reihenfolge manuell einzustellen. Der Artikel ist Teil der "The Lab" -Serie von Pierluigi Vinciguerra. Überprüfen Sie seine Substack-Seite für mehr Wissen über Web Scraping. Der Artikel ist Teil der "The Lab" -Serie von Pierluigi Vinciguerra. Überprüfen Sie seine Substack-Seite für mehr Wissen über Web Scraping. „Das Labor“