Az Akamai Bot Manager az egyik leggyakoribb anti-bot megoldás a piacon. Sok magas profilú webhely használja, az e-kereskedelmi webhelyektől az utazási webhelyekig, és konfigurációjától függően nehéz megkerülni. Tapasztalataim alapján a tipikus minta, amellyel találkozom, amikor egy weboldal aktiválja az Akamai Bot Manager védelmet, az, hogy a kaparó (általában egy Scrapy az én halomban) lóg és időzít az első kérésből. De mi az Akamai Bot Manager, és hogyan láthatom, hogy egy weboldal használja-e? Akamai Bot Manager áttekintés Az Akamai bot-érzékelése, mint minden más modern anti-bot védelmi szoftver, több rétegben működik. az egyik az első: Az Akamai elemzi a TLS kézfogás és a kapcsolat részleteit (JA3 TLS ujjlenyomat, titkosító csomagok, TLS verzió stb.), hogy lássa, hogy megfelelnek-e egy valódi böngészőnek vagy egy ismert automatizálási eszköznek. minden böngészőnek (Chrome, Firefox, Safari stb.) van egy jellegzetes TLS ujjlenyomata, és ha az ügyfél TLS Client Hello nem felel meg egy közös böngészőnek, az Akamai tudja, hogy valami rossz. Network fingerprinting Ezenkívül ellenőrzi – A valódi böngészők szinte mindig használják a HTTP/2+-ot manapság, és egy adott sorrendben és formátumban küldik el a HTTP-fejléceket. Ha egy kliens még mindig HTTP/1.1-et használ, vagy nem böngésző sorrendben van fejléc, ez egy piros zászló. Ezenkívül az Akamai böngésző-specifikus fejléceket vagy értékeket keres, amelyeket a kaparók kihagyhatnak; biztosítva a fejléceket (User-Agent, Accept-Language, stb.) A tükör egy igazi böngésző kulcsfontosságú. HTTP/2 usage and header order and their order A másik réteg az Az Akamai ellenőrzi, hogy az ügyfél IP-je lakóhálózatból, mobilhálózatból vagy adatközpontból származik-e. A lakó- és mobil IP-címek (a valódi felhasználók típusai) magas pontszámot érnek el a bizalom tekintetében, míg az ismert adatközpont IP-tartományok automatikusan gyanúsak. - mindig úgy tűnik, hogy különböző valós felhasználói helyekről származik, nem egy felhő szerver farmból. IP reputation and analysis residential proxies Végül pedig Egy JavaScript érzékelő a weboldalon összegyűjti a kliens környezetével és kölcsönhatásaival kapcsolatos adatpontok sokaságát (például időzítés, egérmozgások vagy azok hiánya, szokatlan tulajdonságok a böngészőobjektumban stb.).Az Akamai AI-modellek összefogják ezt az adatot, hogy bot valószínűségi pontszámot rendeljenek minden egyes munkamenethez. Ez a szempont a legnehezebb megkerülni, és gyakran megköveteli a fej nélküli böngésző futtatását vagy az érzékelő logikájának replikálását. Akamai foglalkoztatás Viselkedési elemzés Ügyféloldali szkriptek és AI modellek használata Akamai foglalkoztatás Viselkedési elemzés Viselkedési elemzés Ügyféloldali szkriptek és AI modellek használata De hogyan lehet felismerni, hogy egy weboldal használja az Akamai Bot Manager-t? Eltekintve a Ha észreveszed a és A weboldalon használt cookie-k, ez a legnyilvánvalóbb jele annak, hogy az Akamai segítségével védi magát. A szokásos Wappalyzer böngésző kiterjesztése Abszolút ak_bmsc A szokásos Wappalyzer böngésző kiterjesztése Abszolút Abszolút bmsc - bmsc bmsc - bmsc Ezeket a védekezéseket figyelembe véve sok Scrapy felhasználó fordult a letöltés menedzser megkerülni Akamai. Ez a plugin integrálja a A könyvtár valódi böngészők hálózati aláírásainak ábrázolására szolgál. scrapy-impersonate curl_cffi A gyakorlatban a Scrapy Impersonate a Scrapy spider kéréseit úgy "láthatja", mint egy Chrome vagy Firefox: olyan TLS ujjlenyomatokat (JA3) kínál, amelyek megfelelnek ezeknek a böngészőknek, HTTP/2-t használ, és még az alacsony szintű HTTP/2 keretfejléceket is beállítja, hogy utánozza a böngésző mintáit. A Scrapy Impersonate korlátozása Míg a Scrapy Impersonate egy erőteljes eszköz, bizonyos korlátozásokkal jár: 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 A ma látott megoldás segít megoldani az első két pontot: együtt fogunk láncolni , az optimális TLS ujjlenyomat és a forgó lakossági proxy érdekében, hogy IP-jeinket forgassa és magasabb hírnévvel rendelkezzen. 3 Proxy szolgáltatás 3 Proxy szolgáltatás TLS ujjlenyomatok és JA3 Mielőtt belemerülnénk a megoldásba, fontos megérteni, hogy pontosan mit csalunk. Ez az ujjlenyomat a TLS protokoll verziójának és a kliens által támogatott opciók egy csoportjának kombinációja – gondolj rá, mint a kliens TLS beszédének „nyelvére”. 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: A koncepció a Ez egy szabványosított módja annak, hogy rögzítse ezeket a TLS Client Hello részleteket. a JA3, az alkotók kezdeteinek nevét kapta, egy ujjlenyomat-láncot alkot a fenti mezők összekapcsolásával egy adott sorrendben: JA3 fingerprinting JA3_string = TLSVersion,CipherSuiteIDs,ExtensionIDs,EllipticCurveIDs,EllipticCurveFormatIDs Minden lista (számok, kiterjesztések stb.) csatlakozik a A szakaszok a Például egy Chrome böngésző létrehozhat egy JA3-láncot, mint például: - , 771,4866-4867-4865-....-47-255,0-11-10-16-23-...-21,29-23-30-25-24,0-1-2 Ez a TLS 1.2 (771 az 0x0303) kódolási csomagok, kiterjesztések, támogatott görbék és görbék formátumok egy bizonyos sorát képviseli (a számok szabványosított azonosítók). A biztonsági eszközök gyakran naplózzák vagy összehasonlítják az MD5 hashet (mivel könnyebb kezelni, mint egy hosszú sor számot). MD5 hashed Miért fontos ez a bot detektáláshoz? mert Chrome X verzió a Windows rendszerben ugyanazt a JA3 ujjlenyomatot jelenítse meg a lista rendezési sorrendjére. browser TLS stacks are fairly uniform Mindig A Python kérelmek könyvtára (amely OpenSSL-t használ a fedél alatt) egy JA3-at tartalmaz, amely teljesen különbözik a mainstream böngészőktől, így könnyen észlelhető. Az olyan anti-bot szolgáltatások, mint az Akamai, a JA3 hashek adatbázisát tartják fenn: ha a JA3 nem szerepel a „híres jó” listán (általános böngészők), vagy ha egy ismert automatizálási listán van, akkor zászlót kap. Összefoglalva, hogy átadja az Akamai TLS ujjlenyomat-ellenőrzését, . we need our client’s JA3 to match a popular browser Ez általában azt jelenti, hogy utánozza a legújabb Chrome vagy Firefox ujjlenyomatot (mivel ezek a leggyakoribb legit felhasználók az interneten). A felhasználó-ügynök szál egyszerű megváltoztatása nem elegendő – módosítanunk kell az alacsony szintű TLS kézfogást. (amely maga a curl és TLS könyvtárak speciális felépítését használja a böngészők utánzására). de a Scrapy-en kívül más módra van szükségünk, hogy ugyanazt a hatást érjük el. curl_cffi TLS Impersonation Proxy + lakossági proxy lánc Megoldásunk az, hogy hogy a kaparót gyakorlatilag megkülönböztethetetlenné tegyük egy valódi böngésző felhasználótól: 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. A JA3Proxy beállítási útmutatója Állítsuk be a JA3Proxy-t, és láncoljuk be egy lakossági proxy-vel. A JA3Proxy telepítése A JA3Proxy Go-ban van megírva. Két egyszerű lehetőséged van: szerkeszteni a forrásból, vagy használni egy Docker-tartályt. git clone https://github.com/LyleMi/ja3proxy.git cd ja3proxy make Ennek eredményeképpen a a mappában végrehajtható. (Alternatív módon futtathatja a manuálisan, mivel a projekt Go-alapú.) ja3proxy go build Ha előnyben részesíti a Docker alkalmazást, a GitHub Container Registry-ben előkészített kép található. docker pull ghcr.io/lylemi/ja3proxy:latest a legfrissebb képet fogja letölteni. ezt követően futtathatja a (Megmutatjuk a futtatási parancsot egy pillanat alatt.) A Docker kényelmes, mert mindent csomagol, anélkül, hogy helyi Go környezetre lenne szüksége. docker run Személyes tapasztalatom szerint a telepítés egy kicsit rémálom volt. Nem tudtam a Docker képet működtetni, mivel folyamatosan hibákat kaptam, amikor megpróbáltam csatlakozni hozzá, mivel nem ismertek böngészőt. Aztán úgy döntöttem, hogy manuálisan építem a Mac-en, és ugyanazokkal a hibákkal találkoztam. Azonban órák után a hibakeresés után rájöttem, hogy frissíteni kell néhány függőséget, különösen az uTLS-t; konfliktusok voltak a könyvtárak verzióiban, és mindez problémákat okozott. TLS tanúsítványok beszerzése vagy létrehozása A JA3Proxy HTTPS proxy-ként is működhet, ami azt jelenti, hogy TLS-t fog el, és saját tanúsítványát mutatja be az ügyfélnek. Alapértelmezés szerint keres és Ha nem ad meg egy tanúsítványt, egyszerű szövegmódban futtathatja (normál HTTP proxy-ként), és egyszerűen figyelmen kívül hagyja a tanúsítvány-hitelesítést az ügyfélben (nem ajánlott a gyártáshoz, de teszteléshez elfogadható). cert.pem key.pem A legjobb gyakorlat az, hogy generáljon egy önállóan aláírt root tanúsítványt és kulcsot, és konfigurálja a kaparót, hogy bízhasson abban a tanúsítványban, így biztonsági figyelmeztetések nélkül lehallgathatja a forgalmat. openssl req -x509 -newkey rsa:2048 -sha256 -days 365 -nodes -keyout key.pem -out cert.pem -subj "/CN=JA3Proxy" Ez létrehozza a / pár érvényes egy évig. (A termelési használathoz akár jogos belső CA-t is használhat, ha van ilyen beállítása, de a legtöbb kaparás céljára az önaláírt jó, amíg az ügyfél tudja, hogy bízzon benne.) cert.pem key.pem JA3Proxy indítása Chrome ujjlenyomattal Most futtatjuk a proxy-t. Ha a bináris parancsot használja, hajtsa végre egy parancsot, mint: ./ja3proxy -port 8080 -client Chrome -version 131 -cert cert.pem -key key.pem -upstream YOURPROXYIP:PORT Távolítsuk el ezt a parancsot: - port 8080 azt mondja, hogy hallgassa meg a port 8080-at (szükség esetén kiválaszthat egy másik portot). -client Chrome -version 131 kiválasztja az ujjlenyomat-profilot. Ebben a példában a Chrome 131 beépített profilját használja. Ezeket a kívánt böngésző/verzió megfelelő profiljával helyettesítené – például ha a Chrome 130 támogatott a legújabb verzióban, akkor a Chrome -client -version 130-at használhatja. (A rendelkezésre álló ujjlenyomatok listáját a JA3Proxy dokumentációjában vagy az általuk használt uTLS könyvtárban találhatja meg. -cert és -key adja meg a 2. lépésben generált TLS tanúsítványfájlokat. -upstream 123.45.67.89:1080 az upstream proxy címét jelenti. Ezt helyettesíteni kell a lakossági proxy végponttal. Fontos: JA3Proxy elvárja, hogy ez legyen a SOCKS5 proxy cím__github.com__. Ha a szolgáltató olyan dolgot adott neked, mint a proxy.provider.com:8000 felhasználónévvel/jelszóval, akkor megpróbálhatja a felhasználónév formátumot:password@proxy.provider.com:8000. (JA3Proxy elemzi a szalagot, és kezelni kell a SOCKS5 hitelesítését, ha a felhasználó:pass@host:port űrlapban van megadva. Ha ez nem működik, akkor konfigurálhatja lakossági proxy-ját, hogy IP-engedélyt kapjon, Ha Docker-t használnánk, az egyenértékű lenne: 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 A tartályba helyezzük a bizonyítékot és a kulcsot, és feltárjuk a 8080-as portot. Állítsa be a parancsot, hogy tartalmazza a tényleges proxy hitelesítő adatait/hostját. (vagy bármilyen host / port, amit megadott). localhost:8080 Valós felhasználási eset - MrPorter.com MrPorter.com egy divat e-kereskedelmi weboldal, amely, mint sok más az iparágban, védi magát az Akamai Bot Manager segítségével. Egy egyszerű Python-kérelmet használva, a fájlban megadott módon A tárolóban időzítési hibával találkoztam, ahogy vártam. 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() Az eredmény: Error fetching the page: HTTPSConnectionPool(host='www.mrporter.com', port=443): Read timed out. (read timeout=10) Használatával az , Azonban nem tudtam megtalálni egy adatbázist, amely azt jelzi, hogy a Python kérések gyakran használják ezt az ujjlenyomatot. Scrapfly TLS ujjlenyomat Megtekinthetjük az eredményeket Scrapfly TLS ujjlenyomat Megtekinthetjük az eredményeket A Cipher Suites sorrendje más, ezért az ujjlenyomat is más lesz. Most indítsuk el a JA3Proxy dokkolót, anélkül, hogy otthoni proxy-t csatlakoztatnánk, és nézzük meg, mi történik. 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 Megkaptuk az üzenetet HTTP Proxy Server listen at :8080, with tls fingerprint 131 Chrome Így használhatjuk a localhost:8080-at proxy-ként a Python-kérelmekben. A telepítési hibák másik oka az volt, hogy megpróbáltam Python kéréseket használni a JA3Proxy-hoz való csatlakozáshoz. Egy ideig ásás után rájöttem, hogy a probléma az volt, hogy a kérelmek könyvtára nem támogatja a HTTP/2, míg a JA3Proxy a Chrome modern verzióját használja. A tesztekhez HTTPX-t kell használnom, amint azt a fájl mutatja . request_with_proxies.py Ebben az esetben, ha ismét felhívom a Scrapfly TLS API-t, a JA3 sor első része (a Cipter sorrend) . Ugyanaz, mint a böngészőben Ugyanaz, mint a böngészőben Végső tesztként, ha ezt a forgatókönyvet használjuk a MrPorter oldal megkeresésére, problémamentesen letölthetjük. A lakossági proxy láncolata Most, hogy megoldottuk a TLS ujjlenyomat hamisítását, csak meg kell forgatnunk az IP-címet, amelyet a célweboldal látni fog. JA3Proxy van egy lehetőség, amely segít ebben, az úgynevezett felfelé. A következő JA3Proxy parancs elindításával: ./ja3proxy -addr 127.0.0.1 -client Chrome -version 131 -cert cert.pem -key key.pem -upstream socks5h://USER:PASS@PROVIDER:PORT -debug Kéréseinket a preferált proxy-szolgáltatónk segítségével tudjuk alagúzni. Kérjük, vegye figyelembe, hogy a SOCKS5 segítségével kell csatlakoznia, ezért győződjön meg róla, hogy a szolgáltatója támogatja ezt a funkciót. Az IP-cím ellenőrzésével ezt követően láthatom, hogy az otthoni forgó IP-címek helyben vannak, és problémamentesen továbbra is letölthetem az MRPorter oldalakat. 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 következtetések Ebben a bejegyzésben láttuk, hogyan lehet megkerülni az Akamai Bot Manager-t a MrPorter webhelyen.A webhely védelmi szintje közepes, így nincs bonyolult böngésző ujjlenyomat kihívás, de tapasztalatom szerint ez a leggyakoribb használati eset, amikor az Akamai-val találkozunk az úton. Úgy döntöttem, hogy a JA3Proxy megközelítést követem, hogy megkerüljem, így ez a megoldás különböző keretekben használható. Ha Scrapy-t használ, mindig támaszkodhat a Scrapy Impersonate-re, annak korlátozása ellenére, vagy megpróbálhatja manuálisan beállítani a kódokat a megfelelő sorrendben. A cikk a Pierluigi Vinciguerra "The Lab" sorozatának része. Ellenőrizze a webes kaparás további ismereteit. A cikk része a Sorozatok Ellenőrizze az ő További információ a Web Scraping weboldalról. “The Lab” Pierluigi Vinciháború alárendeltség „A laboratórium”