{"id":478267,"date":"2026-05-01T21:24:24","date_gmt":"2026-05-01T21:24:24","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=478267"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=478267","title":{"rendered":"\u041a\u0430\u043a \u043c\u044b \u0444\u043e\u0440\u043a\u043d\u0443\u043b\u0438 undetected-chromedriver \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 SOCKS5, \u043c\u0443\u043b\u044c\u0442\u0438\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0438\u043d\u0433 \u0438 \u043c\u043e\u0434\u0443\u043b\u044c \u043a\u0430\u043f\u0447\u0438"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<h2>\u041f\u0430\u0440\u0441\u0438\u043d\u0433 \u0441\u0430\u0439\u0442\u043e\u0432 \u043a\u0430\u043a \u043c\u044b \u0437\u0434\u0435\u043b\u0430\u043b\u0438 rtfox-browser \u2014 \u0444\u043e\u0440\u043a undetected-chromedriver \u0441 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 SOCKS5 <\/h2>\n<blockquote>\n<p>\u26a0\ufe0f \u0421\u0442\u0430\u0442\u044c\u044f \u043d\u043e\u0441\u0438\u0442 \u043f\u043e\u0437\u043d\u0430\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0438 \u0440\u0430\u0437\u0432\u043b\u0435\u043a\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440. \u0410\u0432\u0442\u043e\u0440 \u043d\u0435 \u043f\u0440\u0438\u0437\u044b\u0432\u0430\u0435\u0442 \u043a \u043d\u0430\u0440\u0443\u0448\u0435\u043d\u0438\u044e \u043f\u0440\u0430\u0432\u0438\u043b \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432.<\/p>\n<\/blockquote>\n<p>\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u041d\u0435\u0434\u0430\u0432\u043d\u043e \u043c\u044b \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0438\u0441\u044c \u0441 \u0442\u0435\u043c\u043e\u0439 \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430. \u041d\u0430\u0447\u0430\u043b\u0438 \u0438\u0441\u043a\u0430\u0442\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u2014 BeautifulSoup, Selenium, Playwright, Puppeteer. \u0421\u0440\u0430\u0437\u0443 \u0441\u043a\u0430\u0436\u0443: \u043c\u044b \u043d\u0435 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u044b \u044d\u0442\u0438\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u043c, \u0434\u0430\u043b\u0435\u0435 \u043e\u0431\u044a\u044f\u0441\u043d\u0438\u043c \u043f\u043e\u0447\u0435\u043c\u0443.<\/p>\n<p>\u041d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043e\u0431\u043e\u0439\u0442\u0438 CloudFlare, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e, \u0438 \u0447\u0442\u043e\u0431\u044b \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0431\u044b\u043b \u0441\u0432\u043e\u0439 SOCKS5 \u043f\u0440\u043e\u043a\u0441\u0438 \u0441 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0435\u0439.<\/p>\n<hr\/>\n<h3>\u041a\u0430\u043a \u043c\u044b \u043d\u0430\u0448\u043b\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043d\u0443\u044e \u0442\u043e\u0447\u043a\u0443<\/h3>\n<p>\u041d\u0430\u043c \u043f\u043e\u043f\u0430\u043b\u0430\u0441\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 <a href=\"https:\/\/github.com\/ultrafunkamsterdam\/undetected-chromedriver\" rel=\"noopener noreferrer nofollow\">undetected-chromedriver<\/a>. \u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043b\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u043c, \u043d\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u043b\u0441\u044f. \u041f\u0440\u0438 \u043f\u0435\u0440\u0432\u043e\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u0441\u0440\u0430\u0437\u0443 \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0438\u0441\u044c \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439 \u2014 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0431\u044b\u043b\u0430 \u0432 \u043f\u0430\u0442\u0447\u0438\u043d\u0433\u0435 ChromeDriver \u0438 \u0435\u0433\u043e \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u0438. \u041f\u043e\u0441\u043b\u0435 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0443\u0441\u043a \u0443\u0434\u0430\u043b\u0441\u044f \u0438 \u043a\u0430\u043f\u0447\u0430 \u0431\u044b\u043b\u0430 \u043f\u0440\u043e\u0439\u0434\u0435\u043d\u0430. \u0412 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441 SOCKS5 \u0438 \u043c\u043d\u043e\u0433\u043e\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043d\u043e\u0441\u0442\u044c\u044e.<\/p>\n<p>\u0422\u043e\u0433\u0434\u0430 \u043f\u0440\u0438\u0448\u043b\u0430 \u043c\u044b\u0441\u043b\u044c: \u043f\u043e\u0447\u0435\u043c\u0443 \u0431\u044b \u043d\u0435 \u0432\u0437\u044f\u0442\u044c \u044d\u0442\u0443 \u0436\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443, \u043f\u0440\u0438\u043a\u0440\u0443\u0442\u0438\u0442\u044c \u043f\u0440\u043e\u043a\u0441\u0438 \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043c\u043d\u043e\u0433\u043e\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043d\u043e\u0441\u0442\u044c? \u041d\u043e \u0447\u0442\u043e\u0431\u044b \u044d\u0442\u043e \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0438\u0442\u044c, \u043d\u0443\u0436\u043d\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u043e\u043d\u044f\u0442\u044c \u043a\u0430\u043a \u0432\u043e\u043e\u0431\u0449\u0435 \u0432\u0441\u0451 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442.<\/p>\n<hr\/>\n<h3>\u041a\u0430\u043a \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u0430 \u0446\u0435\u043f\u043e\u0447\u043a\u0430 Chrome \u2192 ChromeDriver \u2192 Selenium<\/h3>\n<p>\u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0447\u0442\u043e \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u2014 \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u043c \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443 \u0438\u0437\u043d\u0443\u0442\u0440\u0438.<\/p>\n<h4>\u0417\u0432\u0435\u043d\u043e 1 \u2014 Chrome.exe<\/h4>\n<p>\u041e\u0431\u044b\u0447\u043d\u044b\u0439 \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 WebSocket-\u0441\u0435\u0440\u0432\u0435\u0440 \u043d\u0430 \u043a\u0430\u043a\u043e\u043c-\u0442\u043e \u043f\u043e\u0440\u0442\u0443 \u0438 \u0441\u043b\u0443\u0448\u0430\u0435\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u044b DevTools Protocol (CDP). \u0427\u0435\u0440\u0435\u0437 WebSocket \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<pre><code class=\"json\">{  \"id\": 1,  \"method\": \"Page.navigate\",  \"params\": {\"url\": \"https:\/\/google.com\"}}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:87px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h4>\u0417\u0432\u0435\u043d\u043e 2 \u2014 ChromeDriver<\/h4>\n<p>ChromeDriver \u2014 \u044d\u0442\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u0430\u043a \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0447\u0438\u043a \u043c\u0435\u0436\u0434\u0443 \u0432\u0430\u0448\u0438\u043c \u043a\u043e\u0434\u043e\u043c (Selenium) \u0438 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u043c Chrome. \u0412\u044b \u043f\u0438\u0448\u0435\u0442\u0435 \u043d\u0430 Python <code>driver.get(\"<\/code><a href=\"https:\/\/google.com\" rel=\"noopener noreferrer nofollow\"><code>https:\/\/google.com<\/code><\/a><code>\")<\/code>, Selenium \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u044d\u0442\u043e \u0432 HTTP-\u0437\u0430\u043f\u0440\u043e\u0441 \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 ChromeDriver. \u0410 ChromeDriver \u0443\u0436\u0435 \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u0435\u0442 Chrome \u043d\u0430 \u0435\u0433\u043e \u0440\u043e\u0434\u043d\u043e\u043c \u044f\u0437\u044b\u043a\u0435 (DevTools Protocol) \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443.<\/p>\n<p>ChromeDriver \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f:<\/p>\n<ul>\n<li>\n<p>HTTP-\u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c (\u0441\u043b\u0443\u0448\u0430\u0435\u0442 \u043f\u043e\u0440\u0442, \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043e\u0442 Selenium)<\/p>\n<\/li>\n<li>\n<p>WebSocket-\u043a\u043b\u0438\u0435\u043d\u0442\u043e\u043c (\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043a Chrome, \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 CDP-\u043a\u043e\u043c\u0430\u043d\u0434\u044b)<\/p>\n<\/li>\n<\/ul>\n<h4>\u0417\u0432\u0435\u043d\u043e 3 \u2014 Selenium<\/h4>\n<p>Selenium \u2014 \u044d\u0442\u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0434\u043b\u044f Python \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u043c. Selenium \u043d\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u043c \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u2014 \u043e\u043d \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u044b ChromeDriver, \u0430 \u0442\u043e\u0442 \u0443\u0436\u0435 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0441 Chrome.<\/p>\n<h4>\u041f\u043e\u043b\u043d\u0430\u044f \u0446\u0435\u043f\u043e\u0447\u043a\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430<\/h4>\n<pre><code>\u0412\u0430\u0448 \u043a\u043e\u0434: driver = webdriver.Chrome()          \u2193Selenium \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 ChromeDriver.exe \u043a\u0430\u043a \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441          \u2193ChromeDriver.exe \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 Chrome.exe \u0441 \u0444\u043b\u0430\u0433\u0430\u043c\u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 Chrome, ChromeDriver \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0444\u043b\u0430\u0433\u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u0442 \u0447\u0442\u043e \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u043c \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u041f\u041e. \u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 undetected-chromedriver \u043a\u0430\u043a \u0440\u0430\u0437 \u0441 \u044d\u0442\u0438\u043c \u0438 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u2014 \u043e\u043d\u0430 \u043f\u0430\u0442\u0447\u0438\u0442 ChromeDriver.exe, \u0443\u0431\u0438\u0440\u0430\u0435\u0442 \u044d\u0442\u0438 \u0444\u043b\u0430\u0433\u0438 \u0438 \u043f\u0430\u0442\u0447\u0438\u0442 \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0443.<\/p>\n<h4>\u041f\u043e\u043b\u043d\u0430\u044f \u0446\u0435\u043f\u043e\u0447\u043a\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u0430<\/h4>\n<pre><code>\u0412\u0430\u0448 \u043a\u043e\u0434: driver.get(\"https:\/\/google.com\")          \u2193Selenium \u2192 ChromeDriver: HTTP POST \/session\/abc\/url          \u2193ChromeDriver \u2192 Chrome: WebSocket \u043a\u043e\u043c\u0430\u043d\u0434\u0430 Page.navigate          \u2193Chrome \u2192 Google: HTTP GET \/          \u2193Google \u2192 Chrome: HTML \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430          \u2193Chrome \u2192 ChromeDriver: WebSocket \u043e\u0442\u0432\u0435\u0442 (\u0433\u043e\u0442\u043e\u0432\u043e)          \u2193ChromeDriver \u2192 Selenium: HTTP 200 OK          \u2193Selenium: \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0430\u0448\u0435\u043c\u0443 \u043a\u043e\u0434\u0443<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<hr\/>\n<h3>\u0427\u0442\u043e \u043c\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b\u0438<\/h3>\n<h4>1. \u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u0438 \u0432\u0435\u0440\u0441\u0438\u0438 Chrome<\/h4>\n<p>\u041f\u0435\u0440\u0432\u044b\u043c \u0434\u0435\u043b\u043e\u043c \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443 (Windows, Linux, macOS) \u0447\u0442\u043e\u0431\u044b \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0432\u0435\u0440\u0441\u0438\u044e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e Chrome.<\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0434\u043b\u044f Linux:<\/p>\n<pre><code class=\"bash\">google-chrome --version# Google Chrome 124.0.6367.91<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0418\u0437 \u044d\u0442\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u0442\u0441\u044f major-\u0432\u0435\u0440\u0441\u0438\u044f (124).<\/p>\n<p><strong>\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 ChromeDriver:<\/strong><\/p>\n<ul>\n<li>\n<p>\u0414\u043b\u044f Chrome \u2264 114: \u043e\u0431\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u043a \u0441\u0442\u0430\u0440\u043e\u043c\u0443 CDN <a href=\"http:\/\/chromedriver.storage.googleapis.com\" rel=\"noopener noreferrer nofollow\"><code>chromedriver.storage.googleapis.com<\/code><\/a><\/p>\n<\/li>\n<li>\n<p>\u0414\u043b\u044f Chrome \u2265 115: \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043d\u043e\u0432\u044b\u0439 \u0441\u0435\u0440\u0432\u0438\u0441 chrome-for-testing, \u043f\u0430\u0440\u0441\u0438\u0442 JSON \u0441 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0432\u0435\u0440\u0441\u0438\u044f\u043c\u0438<\/p>\n<\/li>\n<\/ul>\n<p><strong>\u0421\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u0435 \u0438 \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u043a\u0430:<\/strong><\/p>\n<ol>\n<li>\n<p>\u0424\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 URL \u0434\u043b\u044f \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u044f ZIP-\u0430\u0440\u0445\u0438\u0432\u0430<\/p>\n<\/li>\n<li>\n<p>\u0421\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u0442 \u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u043f\u0430\u043f\u043a\u0443<\/p>\n<\/li>\n<li>\n<p>\u0420\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u044b\u0432\u0430\u0435\u0442 \u0430\u0440\u0445\u0438\u0432<\/p>\n<\/li>\n<li>\n<p>\u0418\u0449\u0435\u0442 \u0444\u0430\u0439\u043b <code>chromedriver<\/code> (\u0438\u043b\u0438 <code>.exe<\/code>)<\/p>\n<\/li>\n<li>\n<p>\u041f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u0442 \u0435\u0433\u043e \u0432 \u043f\u0430\u043f\u043a\u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 <code>\/drivers<\/code><\/p>\n<\/li>\n<\/ol>\n<p><strong>\u041f\u0430\u0442\u0447 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u0430 \u2014 \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 cdc-\u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0430?<\/strong><\/p>\n<p>\u0412 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u043c ChromeDriver \u0435\u0441\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0430 <code>{window.cdc_adoqpoas...}<\/code> \u2014 \u0435\u0451 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0441\u0430\u0439\u0442\u044b \u0434\u043b\u044f \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0431\u043e\u0442\u043e\u0432. \u041f\u0430\u0442\u0447 \u0434\u0435\u043b\u0430\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435:<\/p>\n<ol>\n<li>\n<p>\u0418\u0449\u0435\u0442 \u0432 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u0435 \u043f\u0430\u0442\u0442\u0435\u0440\u043d <code>{window.cdc.*?;}<\/code><\/p>\n<\/li>\n<li>\n<p>\u0417\u0430\u043c\u0435\u043d\u044f\u0435\u0442 \u0435\u0433\u043e \u043d\u0430 \u0437\u0430\u0433\u043b\u0443\u0448\u043a\u0443 <code>{console.log(\"ok\")}<\/code><\/p>\n<\/li>\n<\/ol>\n<p>\u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u044d\u0442\u043e\u043c\u0443 \u0441\u0430\u0439\u0442\u044b \u043d\u0435 \u043c\u043e\u0433\u0443\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0447\u0442\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0438\u0434\u0451\u0442 \u0447\u0435\u0440\u0435\u0437 Selenium.<\/p>\n<hr\/>\n<h4>2. \u041c\u043d\u043e\u0433\u043e\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043d\u043e\u0441\u0442\u044c<\/h4>\n<p>\u0421 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439 \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 10 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432 \u043a\u0430\u0436\u0434\u044b\u0439 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u043b \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 chromedriver. \u041a\u0430\u043a \u043c\u044b \u0443\u0436\u0435 \u0437\u043d\u0430\u0435\u043c, Selenium \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 chromedriver \u043d\u0430 \u0441\u0432\u043e\u0451\u043c \u043f\u043e\u0440\u0442\u0443. \u041a\u0430\u0436\u0434\u044b\u0439 \u043d\u043e\u0432\u044b\u0439 \u0432\u043e\u0440\u043a\u0435\u0440 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u043b chromedriver, \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b \u043d\u043e\u0432\u044b\u0439 \u043f\u043e\u0440\u0442 \u2014 \u0438 \u043f\u0440\u043e\u0448\u043b\u044b\u0439 \u0432\u043e\u0440\u043a\u0435\u0440 \u043f\u0430\u0434\u0430\u043b.<\/p>\n<p><strong>\u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0435:<\/strong> \u043c\u044b \u043d\u0435 \u0434\u0430\u0451\u043c \u0432\u043e\u0440\u043a\u0435\u0440\u0430\u043c \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0441 \u043e\u0434\u043d\u0438\u043c chromedriver. \u0423 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u044d\u0442\u0430\u043b\u043e\u043d\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f (\u043f\u0440\u043e\u043f\u0430\u0442\u0447\u0435\u043d\u043d\u0430\u044f). \u041a\u0430\u0436\u0434\u044b\u0439 \u0432\u043e\u0440\u043a\u0435\u0440 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0432\u043e\u044e \u043a\u043e\u043f\u0438\u044e \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 \u043d\u0435\u0439. \u041f\u0440\u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0438 \u043a\u043e\u043f\u0438\u044f \u0443\u0434\u0430\u043b\u044f\u0435\u0442\u0441\u044f.<\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u0430 \u043c\u0435\u0436\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043d\u0430\u044f \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430:<\/p>\n<ul>\n<li>\n<p>\u0415\u0441\u043b\u0438 100 \u0432\u043e\u0440\u043a\u0435\u0440\u043e\u0432 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0432\u044b\u0437\u043e\u0432\u0443\u0442 <code>ensure_driver()<\/code>, \u043e\u043d\u0438 \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u0442\u044c \u0434\u0440\u0430\u0439\u0432\u0435\u0440 100 \u0440\u0430\u0437<\/p>\n<\/li>\n<li>\n<p>\u041f\u0435\u0440\u0432\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0437\u0430\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0444\u0430\u0439\u043b\u043e\u0432\u0443\u044e \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0443 (\u0447\u0435\u0440\u0435\u0437 <code>fcntl<\/code> \u043d\u0430 Linux\/Mac \u0438\u043b\u0438 <code>msvcrt<\/code> \u043d\u0430 Windows)<\/p>\n<\/li>\n<li>\n<p>\u041e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0436\u0434\u0443\u0442 \u043f\u043e\u043a\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u043d\u0435 \u0441\u043a\u0430\u0447\u0430\u0435\u0442 \u0438 \u043d\u0435 \u043f\u0440\u043e\u043f\u0430\u0442\u0447\u0438\u0442 \u0434\u0440\u0430\u0439\u0432\u0435\u0440<\/p>\n<\/li>\n<li>\n<p>\u0417\u0430\u0442\u0435\u043c \u0432\u0441\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0443\u0436\u0435 \u0433\u043e\u0442\u043e\u0432\u044b\u0439 \u0444\u0430\u0439\u043b<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"python\">driver = uc.Chrome(worker_id=\"worker_1\",)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<hr\/>\n<h4>3. SOCKS5 \u043f\u0440\u043e\u043a\u0441\u0438 \u0441 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0435\u0439<\/h4>\n<pre><code class=\"python\">driver = uc.Chrome(proxy={\"host\": \"1.2.3.4\",                          \"port\": 1080,                          \"user\": \"my_login\",                          \"pass\": \"my_password\"})<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>Chrome \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438 \u043d\u0435 \u0443\u043c\u0435\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 SOCKS5 \u0438 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u2014 \u0442\u043e\u043b\u044c\u043a\u043e HTTP\/HTTPS, \u0438 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432\u043e \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0435\u043c \u043e\u043a\u043d\u0435. \u0412\u043e\u0442 \u043a\u0430\u043a \u043c\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u044d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443.<\/p>\n<p>\u041c\u044b \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 SOCKS5-\u0441\u0435\u0440\u0432\u0435\u0440 \u0441 \u0434\u0432\u0443\u043c\u044f \u043f\u043e\u0442\u043e\u043a\u0430\u043c\u0438:<\/p>\n<ul>\n<li>\n<p><strong>\u041f\u043e\u0442\u043e\u043a-\u0441\u043b\u0443\u0448\u0430\u0442\u0435\u043b\u044c<\/strong> \u2014 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0442\u0440\u0430\u0444\u0438\u043a \u043e\u0442 Chrome \u043d\u0430 <a href=\"http:\/\/localhost\" rel=\"noopener noreferrer nofollow\">localhost<\/a><\/p>\n<\/li>\n<li>\n<p><strong>\u041f\u043e\u0442\u043e\u043a-\u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044c<\/strong> \u2014 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043a \u0432\u043d\u0435\u0448\u043d\u0435\u043c\u0443 \u043f\u0440\u043e\u043a\u0441\u0438 \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u043b\u043e\u0433\u0438\u043d\/\u043f\u0430\u0440\u043e\u043b\u044c<\/p>\n<\/li>\n<\/ul>\n<p>Chrome \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0444\u043b\u0430\u0433 <code>--proxy-server=127.0.0.1:56789<\/code> \u0438 \u0448\u043b\u0451\u0442 \u0442\u0443\u0434\u0430 \u0432\u0435\u0441\u044c \u0442\u0440\u0430\u0444\u0438\u043a, \u0434\u0443\u043c\u0430\u044f \u0447\u0442\u043e \u044d\u0442\u043e \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u043f\u0440\u043e\u043a\u0441\u0438 \u0431\u0435\u0437 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438. \u0410 \u043d\u0430\u0448 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u043a\u0441\u0438 \u0441\u0430\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043b\u043e\u0433\u0438\u043d \u0438 \u043f\u0430\u0440\u043e\u043b\u044c \u0438 \u0444\u043e\u0440\u0432\u0430\u0440\u0434\u0438\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043d\u0430 \u0432\u043d\u0435\u0448\u043d\u0438\u0439 SOCKS5-\u0441\u0435\u0440\u0432\u0435\u0440.<\/p>\n<p><strong>\u041f\u043e\u043b\u043d\u0430\u044f \u043a\u0430\u0440\u0442\u0438\u043d\u0430:<\/strong><\/p>\n<pre><code>Chrome \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0444\u043b\u0430\u0433 --proxy-server=127.0.0.1:56789          \u2193Chrome \u0434\u0443\u043c\u0430\u0435\u0442: \"\u042d\u0442\u043e \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u043f\u0440\u043e\u043a\u0441\u0438 \u0431\u0435\u0437 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438\"          \u2193Chrome \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 HTTP-\u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u0440\u0442 56789          \u2193\u041f\u043e\u0442\u043e\u043a-\u0441\u043b\u0443\u0448\u0430\u0442\u0435\u043b\u044c \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441          \u2193\u041f\u043e\u0442\u043e\u043a-\u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044c:  - \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043a \u0432\u043d\u0435\u0448\u043d\u0435\u043c\u0443 SOCKS5 (1.2.3.4:1080)  - \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u043b\u043e\u0433\u0438\u043d \u0438 \u043f\u0430\u0440\u043e\u043b\u044c  - \u043f\u0435\u0440\u0435\u0441\u044b\u043b\u0430\u0435\u0442 HTTP-\u0437\u0430\u043f\u0440\u043e\u0441          \u2193\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043e\u0442\u0432\u0435\u0442 \u043e\u0442 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u043f\u0440\u043e\u043a\u0441\u0438          \u2193\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043e\u0442\u0432\u0435\u0442 Chrome \u0447\u0435\u0440\u0435\u0437 \u043f\u043e\u0442\u043e\u043a-\u0441\u043b\u0443\u0448\u0430\u0442\u0435\u043b\u044c<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<hr\/>\n<h4>4. \u0418\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 loguru<\/h4>\n<p>Loguru \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0439 \u043b\u043e\u0433\u0435\u0440. \u041d\u0430\u043c \u044d\u0442\u043e \u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u043b\u043e \u2014 \u0434\u043b\u044f \u043f\u0440\u043e\u043a\u0441\u0438 \u043d\u0443\u0436\u0435\u043d \u0441\u0432\u043e\u0439 \u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043b\u043e\u0433\u0435\u0440 \u0441 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \u0432\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u0444\u043b\u0430\u0433, \u0434\u043b\u044f ChromeDriver \u0441\u0432\u043e\u0439, \u0434\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0441\u0432\u043e\u0439.<\/p>\n<p>\u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u2014 \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u043d\u043e\u0432\u044b\u0439 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043b\u043e\u0433\u0435\u0440\u0430 \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0444\u0438\u043b\u044c\u0442\u0440\u044b:<\/p>\n<pre><code class=\"python\">_lib_logger = Logger(    core=Core(),    exception=None,    depth=0,    record=False,    lazy=False,    colors=False,    raw=False,    capture=True,    patchers=[],    extra={},)_lib_logger.add(sys.stderr, level=\"ERROR\")def get_logger(debug: bool = False, debug_proxy: bool = False):    _lib_logger.remove()    _lib_logger.add(        sys.stderr,        level=\"DEBUG\" if debug else \"ERROR\",        format=\"&lt;green&gt;{time:HH:mm:ss}&lt;\/green&gt; | &lt;level&gt;{level: &lt;8}&lt;\/level&gt; | \"               \"&lt;cyan&gt;Chrome&lt;\/cyan&gt; - &lt;level&gt;{message}&lt;\/level&gt;\",        filter=lambda r: r[\"extra\"].get(\"source\") != \"proxy\"    )    _lib_logger.add(        sys.stderr,        level=\"DEBUG\" if debug_proxy else \"ERROR\",        format=\"&lt;blue&gt;{time:HH:mm:ss}&lt;\/blue&gt; | &lt;level&gt;{level: &lt;8}&lt;\/level&gt; | \"               \"&lt;magenta&gt;PROXY&lt;\/magenta&gt; - &lt;level&gt;{message}&lt;\/level&gt;\",        filter=lambda r: r[\"extra\"].get(\"source\") == \"proxy\"    )    return _lib_logger<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0412 Chrome \u0438 \u043f\u0440\u043e\u043a\u0441\u0438 \u043f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u043c \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a:<\/p>\n<pre><code class=\"python\">self.logger = self.logger_str.bind(source=\"chrome\")<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<hr\/>\n<h4>5. \u041c\u043e\u0434\u0443\u043b\u044c \u043a\u0430\u043f\u0447\u0438 \u0441 \u0430\u0432\u0442\u043e\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u043e\u0439 \u0441\u043e\u043b\u0432\u0435\u0440\u043e\u0432<\/h4>\n<p>\u041c\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b\u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u0441\u043e\u043b\u0432\u0435\u0440\u043e\u0432 \u0438\u0437 \u043f\u0430\u043f\u043a\u0438 <code>solvers\/<\/code>. \u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442: \u0435\u0441\u0442\u044c \u043a\u043b\u0430\u0441\u0441 \u0441 \u043b\u043e\u0433\u0438\u043a\u043e\u0439 \u043f\u0440\u043e\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u043a\u0430\u043f\u0447\u0438 \u2014 \u043f\u0440\u043e\u0441\u0442\u043e \u043a\u043b\u0430\u0434\u0451\u0448\u044c <code>.py<\/code> \u0444\u0430\u0439\u043b \u0432 \u043f\u0430\u043f\u043a\u0443 \u0438 \u043c\u0435\u0442\u043e\u0434 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f.<\/p>\n<p><strong>BaseCaptchaSolver \u2014 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441:<\/strong><\/p>\n<pre><code class=\"python\">from abc import ABC, abstractmethodclass BaseCaptchaSolver(ABC):    name: str = None    _service = None    @property    def driver(self):        return self._service.driver    @property    def api_key(self):        return self._service.api_key    @abstractmethod    def solve(self, **kwargs) -&gt; bool:        ...<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0427\u0442\u043e\u0431\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u0441\u043e\u043b\u0432\u0435\u0440 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e:<\/p>\n<ol>\n<li>\n<p>\u0423\u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043e\u0442 <code>BaseCaptchaSolver<\/code><\/p>\n<\/li>\n<li>\n<p>\u0417\u0430\u0434\u0430\u0442\u044c <code>name<\/code><\/p>\n<\/li>\n<li>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434 <code>solve()<\/code><\/p>\n<\/li>\n<\/ol>\n<p><strong>Loader \u2014 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u043e\u0438\u0441\u043a \u0441\u043e\u043b\u0432\u0435\u0440\u043e\u0432:<\/strong><\/p>\n<pre><code class=\"python\">import importlib.utilimport inspectfrom pathlib import Pathfrom loguru import loggerdef load_solvers_from_dir(directory: Path, registry: dict):    if not directory.exists():        logger.debug(f\"Solvers directory not found: {directory}\")        return    for py_file in directory.glob(\"*.py\"):        if py_file.name.startswith(\"_\"):            continue        try:            spec = importlib.util.spec_from_file_location(py_file.stem, py_file)            module = importlib.util.module_from_spec(spec)            spec.loader.exec_module(module)            for _, obj in inspect.getmembers(module, inspect.isclass):                if (hasattr(obj, 'name')                        and obj.name                        and obj.__name__ != 'BaseCaptchaSolver'):                    registry[obj.name] = obj                    logger.debug(f\"Captcha solver loaded: '{obj.name}' \u2190 {py_file.name}\")        except Exception as e:            logger.warning(f\"Failed to load solver {py_file.name}: {e}\")<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>Loader \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u043f\u043e \u0432\u0441\u0435\u043c <code>.py<\/code> \u0444\u0430\u0439\u043b\u0430\u043c \u0432 \u043f\u0430\u043f\u043a\u0435 <code>solvers\/<\/code>, \u043d\u0430\u0445\u043e\u0434\u0438\u0442 \u043a\u043b\u0430\u0441\u0441\u044b-\u0441\u043e\u043b\u0432\u0435\u0440\u044b \u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u0438\u0445 \u043f\u043e \u0438\u043c\u0435\u043d\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440: \u0432 \u043f\u0430\u043f\u043a\u0435 \u043b\u0435\u0436\u0438\u0442 <code>my_<\/code><a href=\"http:\/\/solver.py\" rel=\"noopener noreferrer nofollow\"><code>solver.py<\/code><\/a> \u0441 \u043a\u043b\u0430\u0441\u0441\u043e\u043c <code>MySolver(name=\"my_captcha\")<\/code> \u2014 Loader \u043d\u0430\u0439\u0434\u0451\u0442 \u0435\u0433\u043e \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442 \u0432 \u0440\u0435\u0435\u0441\u0442\u0440 \u043f\u043e\u0434 \u043a\u043b\u044e\u0447\u043e\u043c <code>\"my_captcha\"<\/code>.<\/p>\n<p><strong>CaptchaService \u2014 \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441:<\/strong><\/p>\n<pre><code class=\"python\">from pathlib import Pathfrom loguru import loggerfrom .loader import load_solvers_from_dirfrom .base import BaseCaptchaSolverclass CaptchaService:    \"\"\"    \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435:        captcha = CaptchaService(api_key=\"KEY\", driver=driver)        captcha.ebay_hcaptcha()    \"\"\"    def __init__(self, api_key: str, driver, solvers_dir=None):        self.api_key = api_key        self.driver = driver        self._solvers: dict[str, type[BaseCaptchaSolver]] = {}        # \u0418\u0449\u0435\u043c solvers\/ \u0440\u044f\u0434\u043e\u043c \u0441 main.py (cwd)        directory = Path(solvers_dir) if solvers_dir else Path.cwd() \/ \"solvers\"        load_solvers_from_dir(directory, self._solvers)        self._bind_methods()    def _instantiate(self, solver_cls):        instance = solver_cls()        instance._service = self        return instance    def _bind_methods(self):        for name, solver_cls in self._solvers.items():            self._create_method(name, solver_cls)    def _create_method(self, name: str, solver_cls):        def method(**kwargs) -&gt; bool:            solver = self._instantiate(solver_cls)            return solver.solve(**kwargs)        method.__name__ = name        method.__doc__ = solver_cls.__doc__ or f\"Solve '{name}' captcha.\"        setattr(self, name, method)    def register(self, solver_cls):        \"\"\"\u0420\u0443\u0447\u043d\u0430\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u0441\u043e\u043b\u0432\u0435\u0440\u0430.\"\"\"        self._solvers[solver_cls.name] = solver_cls        self._create_method(solver_cls.name, solver_cls)        return self    def available(self) -&gt; list[str]:        return list(self._solvers.keys())<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><strong>\u041a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c:<\/strong><\/p>\n<pre><code class=\"python\">from rtfox_browser.captcha import CaptchaServicecaptcha = CaptchaService(    api_key=\"YOUR_2CAPTCHA_KEY\",    driver=driver)# \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0441\u043e\u043b\u0432\u0435\u0440\u044bprint(captcha.available())# ['ebay_hcaptcha', 'aws_image']# \u0420\u0435\u0448\u0438\u0442\u044c \u043a\u0430\u043f\u0447\u0443captcha.ebay_hcaptcha()<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><strong>\u0421\u0432\u043e\u0439 \u0441\u043e\u043b\u0432\u0435\u0440 \u2014 \u043f\u0440\u043e\u0441\u0442\u043e \u0431\u0440\u043e\u0441\u0438\u0442\u044c \u0444\u0430\u0439\u043b \u0432 \u043f\u0430\u043f\u043a\u0443:<\/strong><\/p>\n<pre><code class=\"python\">from rtfox_browser.captcha import BaseCaptchaSolverclass MySolver(BaseCaptchaSolver):      name = \"my_captcha\"      def solve(self, **kwargs) -&gt; bool:            # self.driver \u2014 \u0431\u0440\u0430\u0443\u0437\u0435\u0440            # self.api_key \u2014 \u043a\u043b\u044e\u0447 API            return True<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<hr\/>\n<h3>\u0418\u0442\u043e\u0433<\/h3>\n<p>\u0422\u0440\u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0440\u0435\u0448\u0435\u043d\u044b:<\/p>\n<ul>\n<li>\n<p>\u2705 \u041e\u0431\u0445\u043e\u0434 CloudFlare \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438<\/p>\n<\/li>\n<li>\n<p>\u2705 SOCKS5 \u043f\u0440\u043e\u043a\u0441\u0438 \u0441 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0435\u0439<\/p>\n<\/li>\n<li>\n<p>\u2705 \u041c\u043d\u043e\u0433\u043e\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043d\u043e\u0441\u0442\u044c \u0441 \u0438\u0437\u043e\u043b\u044f\u0446\u0438\u0435\u0439 \u0432\u043e\u0440\u043a\u0435\u0440\u043e\u0432<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u043b\u044e\u0441 \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u043c\u043e\u0434\u0443\u043b\u044c \u043a\u0430\u043f\u0447\u0438 \u0441 \u043f\u043b\u0430\u0433\u0438\u043d-\u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043e\u0439.<\/p>\n<p>\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u043d\u0430 GitHub \u0438 PyPI:<\/p>\n<pre><code class=\"bash\">pip install rtfox-browser<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<ul>\n<li>\n<p>\ud83d\udd17 GitHub: <a href=\"https:\/\/github.com\/rtf-labs-studio\/rfox-browser\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/rtf-labs-studio\/rfox-browser<\/a><\/p>\n<\/li>\n<li>\n<p>\ud83d\udce6 PyPI: <a href=\"https:\/\/pypi.org\/project\/rtfox-browser\/\" rel=\"noopener noreferrer nofollow\">https:\/\/pypi.org\/project\/rtfox-browser\/<\/a><\/p>\n<\/li>\n<li>\n<p>\ud83d\udcac Telegram: <a href=\"https:\/\/t.me\/rtf_labs_studio\" rel=\"noopener noreferrer nofollow\">https:\/\/t.me\/rtf_labs_studio<\/a><\/p>\n<\/li>\n<li>\n<p>\ud83c\udfa5 YouTube: <a href=\"https:\/\/www.youtube.com\/@RTF_Labs_Studio\" rel=\"noopener noreferrer nofollow\">https:\/\/www.youtube.com\/@RTF_Labs_Studio<\/a><\/p>\n<\/li>\n<\/ul>\n<hr\/>\n<h3>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435<\/h3>\n<h4>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430<\/h4>\n<pre><code class=\"bash\">pip install rtfox-browser<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0422\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f: Python &gt;= 3.9<\/p>\n<h4>\u0411\u0430\u0437\u043e\u0432\u044b\u0439 \u0437\u0430\u043f\u0443\u0441\u043a<\/h4>\n<pre><code class=\"python\">import rtfox_browser as ucdriver = uc.Chrome()driver.get(\"https:\/\/example.com\")driver.quit()<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h4>\u0417\u0430\u043f\u0443\u0441\u043a \u0441 \u043f\u0440\u043e\u043a\u0441\u0438<\/h4>\n<pre><code class=\"python\">import rtfox_browser as ucdriver = uc.Chrome(proxy={\"host\": \"1.2.3.4\",                          \"port\": 1080,                          \"user\": \"my_login\",                          \"pass\": \"my_password\"})driver.get(\"https:\/\/example.com\")driver.quit()<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h4>\u0417\u0430\u043f\u0443\u0441\u043a \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432<\/h4>\n<pre><code class=\"python\">from multiprocessing import Poolimport rtfox_browser as ucdef run_worker(worker_id):  driver = uc.Chrome(worker_id=worker_id,proxy={\"host\": \"1.2.3.4\",                                                \"port\": 1080,                                                \"user\": \"my_login\",                                                \"pass\": \"my_password\"})      driver.get(\"https:\/\/example.com\")      driver.quit()  if __name__ == \"__main__\":      with Pool(4) as pool:          pool.map(run_worker, [\"w1\", \"w2\", \"w3\", \"w4\"])<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h4>\u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u043a\u0430\u043f\u0447\u0438<\/h4>\n<pre><code class=\"python\">import rtfox_browser as ucfrom rtfox_browser.captcha import CaptchaServicedriver = uc.Chrome()driver.get(\"https:\/\/example.com\")captcha = CaptchaService(api_key=\"YOUR_2CAPTCHA_KEY\",                         driver=driver)# \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0441\u043e\u043b\u0432\u0435\u0440\u044bprint(captcha.available())# ['ebay_hcaptcha', 'aws_image']# \u0420\u0435\u0448\u0438\u0442\u044c \u043a\u0430\u043f\u0447\u0443captcha.ebay_hcaptcha()<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h4>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043e\u0448\u0438\u0431\u043e\u043a \u043f\u0440\u043e\u043a\u0441\u0438<\/h4>\n<pre><code class=\"python\">from rtfox_browser.exceptions import ProxyError, ProxyAuthError, ProxyInvalidAddressErrortry:    driver = uc.Chrome(proxy={...})except ProxyInvalidAddressError:    print(\"Invalid proxy address\")except ProxyAuthError:    print(\"Wrong credentials\")except ProxyError:    print(\"Proxy connection failed\")<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h4>\u0412\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043e\u0442\u043b\u0430\u0434\u043e\u0447\u043d\u044b\u0445 \u043b\u043e\u0433\u043e\u0432<\/h4>\n<pre><code class=\"python\">import rtfox_browser as uc# \u041b\u043e\u0433\u0438 ChromeDriverdriver = uc.Chrome(log_debug=True)# \u041b\u043e\u0433\u0438 \u043f\u0440\u043e\u043a\u0441\u0438driver = uc.Chrome(log_debug_proxy=True)# \u0412\u0441\u0435 \u043b\u043e\u0433\u0438driver = uc.Chrome(log_debug=True, log_debug_proxy=True)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<\/div>\n<p>\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/1030550\/\">https:\/\/habr.com\/ru\/articles\/1030550\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u041f\u0430\u0440\u0441\u0438\u043d\u0433 \u0441\u0430\u0439\u0442\u043e\u0432 \u043a\u0430\u043a \u043c\u044b \u0437\u0434\u0435\u043b\u0430\u043b\u0438 rtfox-browser \u2014 \u0444\u043e\u0440\u043a undetected-chromedriver \u0441 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 SOCKS5 \u26a0\ufe0f \u0421\u0442\u0430\u0442\u044c\u044f \u043d\u043e\u0441\u0438\u0442 \u043f\u043e\u0437\u043d\u0430\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0438 \u0440\u0430\u0437\u0432\u043b\u0435\u043a\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440. \u0410\u0432\u0442\u043e\u0440 \u043d\u0435 \u043f\u0440\u0438\u0437\u044b\u0432\u0430\u0435\u0442 \u043a \u043d\u0430\u0440\u0443\u0448\u0435\u043d\u0438\u044e \u043f\u0440\u0430\u0432\u0438\u043b \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432.\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u041d\u0435\u0434\u0430\u0432\u043d\u043e \u043c\u044b \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0438\u0441\u044c \u0441 \u0442\u0435\u043c\u043e\u0439 \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430. \u041d\u0430\u0447\u0430\u043b\u0438 \u0438\u0441\u043a\u0430\u0442\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u2014 BeautifulSoup, Selenium, Playwright, Puppeteer. \u0421\u0440\u0430\u0437\u0443 \u0441\u043a\u0430\u0436\u0443: \u043c\u044b \u043d\u0435 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u044b \u044d\u0442\u0438\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u043c, \u0434\u0430\u043b\u0435\u0435 \u043e\u0431\u044a\u044f\u0441\u043d\u0438\u043c \u043f\u043e\u0447\u0435\u043c\u0443.\u041d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043e\u0431\u043e\u0439\u0442\u0438 CloudFlare, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e, \u0438 \u0447\u0442\u043e\u0431\u044b \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0431\u044b\u043b \u0441\u0432\u043e\u0439 SOCKS5 \u043f\u0440\u043e\u043a\u0441\u0438 \u0441 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0435\u0439.\u041a\u0430\u043a \u043c\u044b \u043d\u0430\u0448\u043b\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043d\u0443\u044e \u0442\u043e\u0447\u043a\u0443\u041d\u0430\u043c \u043f\u043e\u043f\u0430\u043b\u0430\u0441\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 undetected-chromedriver. \u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043b\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u043c, \u043d\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u043b\u0441\u044f. \u041f\u0440\u0438 \u043f\u0435\u0440\u0432\u043e\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u0441\u0440\u0430\u0437\u0443 \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0438\u0441\u044c \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439 \u2014 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0431\u044b\u043b\u0430 \u0432 \u043f\u0430\u0442\u0447\u0438\u043d\u0433\u0435 ChromeDriver \u0438 \u0435\u0433\u043e \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u0438. \u041f\u043e\u0441\u043b\u0435 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0443\u0441\u043a \u0443\u0434\u0430\u043b\u0441\u044f \u0438 \u043a\u0430\u043f\u0447\u0430 \u0431\u044b\u043b\u0430 \u043f\u0440\u043e\u0439\u0434\u0435\u043d\u0430. \u0412 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441 SOCKS5 \u0438 \u043c\u043d\u043e\u0433\u043e\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043d\u043e\u0441\u0442\u044c\u044e.\u0422\u043e\u0433\u0434\u0430 \u043f\u0440\u0438\u0448\u043b\u0430 \u043c\u044b\u0441\u043b\u044c: \u043f\u043e\u0447\u0435\u043c\u0443 \u0431\u044b \u043d\u0435 \u0432\u0437\u044f\u0442\u044c \u044d\u0442\u0443 \u0436\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443, \u043f\u0440\u0438\u043a\u0440\u0443\u0442\u0438\u0442\u044c \u043f\u0440\u043e\u043a\u0441\u0438 \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043c\u043d\u043e\u0433\u043e\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043d\u043e\u0441\u0442\u044c? \u041d\u043e \u0447\u0442\u043e\u0431\u044b \u044d\u0442\u043e \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0438\u0442\u044c, \u043d\u0443\u0436\u043d\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u043e\u043d\u044f\u0442\u044c \u043a\u0430\u043a \u0432\u043e\u043e\u0431\u0449\u0435 \u0432\u0441\u0451 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442.\u041a\u0430\u043a \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u0430 \u0446\u0435\u043f\u043e\u0447\u043a\u0430 Chrome \u2192 ChromeDriver \u2192 Selenium\u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0447\u0442\u043e \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u2014 \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u043c \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443 \u0438\u0437\u043d\u0443\u0442\u0440\u0438.\u0417\u0432\u0435\u043d\u043e 1 \u2014 Chrome.exe\u041e\u0431\u044b\u0447\u043d\u044b\u0439 \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 WebSocket-\u0441\u0435\u0440\u0432\u0435\u0440 \u043d\u0430 \u043a\u0430\u043a\u043e\u043c-\u0442\u043e \u043f\u043e\u0440\u0442\u0443 \u0438 \u0441\u043b\u0443\u0448\u0430\u0435\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u044b DevTools Protocol (CDP). \u0427\u0435\u0440\u0435\u0437 WebSocket \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:{  &#171;id&#187;: 1,  &#171;method&#187;: &#171;Page.navigate&#187;,  &#171;params&#187;: {&#171;url&#187;: &#171;https:\/\/google.com&#187;}}\u0417\u0432\u0435\u043d\u043e 2 \u2014 ChromeDriverChromeDriver \u2014 \u044d\u0442\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u0430\u043a \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0447\u0438\u043a \u043c\u0435\u0436\u0434\u0443 \u0432\u0430\u0448\u0438\u043c \u043a\u043e\u0434\u043e\u043c (Selenium) \u0438 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u043c Chrome. \u0412\u044b \u043f\u0438\u0448\u0435\u0442\u0435 \u043d\u0430 Python driver.get(&#171;https:\/\/google.com&#187;), Selenium \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u044d\u0442\u043e \u0432 HTTP-\u0437\u0430\u043f\u0440\u043e\u0441 \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 ChromeDriver. \u0410 ChromeDriver \u0443\u0436\u0435 \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u0435\u0442 Chrome \u043d\u0430 \u0435\u0433\u043e \u0440\u043e\u0434\u043d\u043e\u043c \u044f\u0437\u044b\u043a\u0435 (DevTools Protocol) \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443.ChromeDriver \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f:HTTP-\u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c (\u0441\u043b\u0443\u0448\u0430\u0435\u0442 \u043f\u043e\u0440\u0442, \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043e\u0442 Selenium)WebSocket-\u043a\u043b\u0438\u0435\u043d\u0442\u043e\u043c (\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043a Chrome, \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 CDP-\u043a\u043e\u043c\u0430\u043d\u0434\u044b)\u0417\u0432\u0435\u043d\u043e 3 \u2014 SeleniumSelenium \u2014 \u044d\u0442\u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0434\u043b\u044f Python \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u043c. Selenium \u043d\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u043c \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u2014 \u043e\u043d \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u044b ChromeDriver, \u0430 \u0442\u043e\u0442 \u0443\u0436\u0435 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0441 Chrome.\u041f\u043e\u043b\u043d\u0430\u044f \u0446\u0435\u043f\u043e\u0447\u043a\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0412\u0430\u0448 \u043a\u043e\u0434: driver = webdriver.Chrome()          \u2193Selenium \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 ChromeDriver.exe \u043a\u0430\u043a \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441          \u2193ChromeDriver.exe \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 Chrome.exe \u0441 \u0444\u043b\u0430\u0433\u0430\u043c\u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438\u041f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 Chrome, ChromeDriver \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0444\u043b\u0430\u0433\u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u0442 \u0447\u0442\u043e \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u043c \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u041f\u041e. \u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 undetected-chromedriver \u043a\u0430\u043a \u0440\u0430\u0437 \u0441 \u044d\u0442\u0438\u043c \u0438 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u2014 \u043e\u043d\u0430 \u043f\u0430\u0442\u0447\u0438\u0442 ChromeDriver.exe, \u0443\u0431\u0438\u0440\u0430\u0435\u0442 \u044d\u0442\u0438 \u0444\u043b\u0430\u0433\u0438 \u0438 \u043f\u0430\u0442\u0447\u0438\u0442 \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0443.\u041f\u043e\u043b\u043d\u0430\u044f \u0446\u0435\u043f\u043e\u0447\u043a\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u0412\u0430\u0448 \u043a\u043e\u0434: driver.get(&#171;https:\/\/google.com&#187;)          \u2193Selenium \u2192 ChromeDriver: HTTP POST \/session\/abc\/url          \u2193ChromeDriver \u2192 Chrome: WebSocket \u043a\u043e\u043c\u0430\u043d\u0434\u0430 Page.navigate          \u2193Chrome \u2192 Google: HTTP GET \/          \u2193Google \u2192 Chrome: HTML \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430          \u2193Chrome \u2192 ChromeDriver: WebSocket \u043e\u0442\u0432\u0435\u0442 (\u0433\u043e\u0442\u043e\u0432\u043e)          \u2193ChromeDriver \u2192 Selenium: HTTP 200 OK          \u2193Selenium: \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0430\u0448\u0435\u043c\u0443 \u043a\u043e\u0434\u0443\u0427\u0442\u043e \u043c\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b\u04381. \u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u0438 \u0432\u0435\u0440\u0441\u0438\u0438 Chrome\u041f\u0435\u0440\u0432\u044b\u043c \u0434\u0435\u043b\u043e\u043c \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443 (Windows, Linux, macOS) \u0447\u0442\u043e\u0431\u044b \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0432\u0435\u0440\u0441\u0438\u044e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e Chrome.\u041f\u0440\u0438\u043c\u0435\u0440 \u0434\u043b\u044f Linux:google-chrome &#8212;version# Google Chrome 124.0.6367.91\u0418\u0437 \u044d\u0442\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u0442\u0441\u044f major-\u0432\u0435\u0440\u0441\u0438\u044f (124).\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 ChromeDriver:\u0414\u043b\u044f Chrome \u2264 114: \u043e\u0431\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u043a \u0441\u0442\u0430\u0440\u043e\u043c\u0443 CDN chromedriver.storage.googleapis.com\u0414\u043b\u044f Chrome \u2265 115: \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043d\u043e\u0432\u044b\u0439 \u0441\u0435\u0440\u0432\u0438\u0441 chrome-for-testing, \u043f\u0430\u0440\u0441\u0438\u0442 JSON \u0441 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0432\u0435\u0440\u0441\u0438\u044f\u043c\u0438\u0421\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u0435 \u0438 \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u043a\u0430:\u0424\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 URL \u0434\u043b\u044f \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u044f ZIP-\u0430\u0440\u0445\u0438\u0432\u0430\u0421\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u0442 \u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u043f\u0430\u043f\u043a\u0443\u0420\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u044b\u0432\u0430\u0435\u0442 \u0430\u0440\u0445\u0438\u0432\u0418\u0449\u0435\u0442 \u0444\u0430\u0439\u043b chromedriver (\u0438\u043b\u0438 .exe)\u041f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u0442 \u0435\u0433\u043e \u0432 \u043f\u0430\u043f\u043a\u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \/drivers\u041f\u0430\u0442\u0447 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u0430 \u2014 \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 cdc-\u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0430?\u0412 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u043c ChromeDriver \u0435\u0441\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0430 {window.cdc_adoqpoas&#8230;} \u2014 \u0435\u0451 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0441\u0430\u0439\u0442\u044b \u0434\u043b\u044f \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0431\u043e\u0442\u043e\u0432. \u041f\u0430\u0442\u0447 \u0434\u0435\u043b\u0430\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435:\u0418\u0449\u0435\u0442 \u0432 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u0435 \u043f\u0430\u0442\u0442\u0435\u0440\u043d {window.cdc.*?;}\u0417\u0430\u043c\u0435\u043d\u044f\u0435\u0442 \u0435\u0433\u043e \u043d\u0430 \u0437\u0430\u0433\u043b\u0443\u0448\u043a\u0443 {console.log(&#171;ok&#187;)}\u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u044d\u0442\u043e\u043c\u0443 \u0441\u0430\u0439\u0442\u044b \u043d\u0435 \u043c\u043e\u0433\u0443\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0447\u0442\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0438\u0434\u0451\u0442 \u0447\u0435\u0440\u0435\u0437 Selenium.2. \u041c\u043d\u043e\u0433\u043e\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043d\u043e\u0441\u0442\u044c\u0421 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439 \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 10 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432 \u043a\u0430\u0436\u0434\u044b\u0439 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u043b \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 chromedriver. \u041a\u0430\u043a \u043c\u044b \u0443\u0436\u0435 \u0437\u043d\u0430\u0435\u043c, Selenium \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 chromedriver \u043d\u0430 \u0441\u0432\u043e\u0451\u043c \u043f\u043e\u0440\u0442\u0443. \u041a\u0430\u0436\u0434\u044b\u0439 \u043d\u043e\u0432\u044b\u0439 \u0432\u043e\u0440\u043a\u0435\u0440 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u043b chromedriver, \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b \u043d\u043e\u0432\u044b\u0439 \u043f\u043e\u0440\u0442 \u2014 \u0438 \u043f\u0440\u043e\u0448\u043b\u044b\u0439 \u0432\u043e\u0440\u043a\u0435\u0440 \u043f\u0430\u0434\u0430\u043b.\u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0435: \u043c\u044b \u043d\u0435 \u0434\u0430\u0451\u043c \u0432\u043e\u0440\u043a\u0435\u0440\u0430\u043c \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0441 \u043e\u0434\u043d\u0438\u043c chromedriver. \u0423 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u044d\u0442\u0430\u043b\u043e\u043d\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f (\u043f\u0440\u043e\u043f\u0430\u0442\u0447\u0435\u043d\u043d\u0430\u044f). \u041a\u0430\u0436\u0434\u044b\u0439 \u0432\u043e\u0440\u043a\u0435\u0440 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0432\u043e\u044e \u043a\u043e\u043f\u0438\u044e \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 \u043d\u0435\u0439. \u041f\u0440\u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0438 \u043a\u043e\u043f\u0438\u044f \u0443\u0434\u0430\u043b\u044f\u0435\u0442\u0441\u044f.\u0422\u0430\u043a\u0436\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u0430 \u043c\u0435\u0436\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043d\u0430\u044f \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430:\u0415\u0441\u043b\u0438 100 \u0432\u043e\u0440\u043a\u0435\u0440\u043e\u0432 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0432\u044b\u0437\u043e\u0432\u0443\u0442 ensure_driver(), \u043e\u043d\u0438 \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u0442\u044c \u0434\u0440\u0430\u0439\u0432\u0435\u0440 100 \u0440\u0430\u0437\u041f\u0435\u0440\u0432\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0437\u0430\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0444\u0430\u0439\u043b\u043e\u0432\u0443\u044e \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0443 (\u0447\u0435\u0440\u0435\u0437 fcntl \u043d\u0430 Linux\/Mac \u0438\u043b\u0438 msvcrt \u043d\u0430 Windows)\u041e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0436\u0434\u0443\u0442 \u043f\u043e\u043a\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u043d\u0435 \u0441\u043a\u0430\u0447\u0430\u0435\u0442 \u0438 \u043d\u0435 \u043f\u0440\u043e\u043f\u0430\u0442\u0447\u0438\u0442 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0417\u0430\u0442\u0435\u043c \u0432\u0441\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0443\u0436\u0435 \u0433\u043e\u0442\u043e\u0432\u044b\u0439 \u0444\u0430\u0439\u043bdriver = uc.Chrome(worker_id=&#187;worker_1&#8243;,)3. SOCKS5 \u043f\u0440\u043e\u043a\u0441\u0438 \u0441 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0435\u0439driver = uc.Chrome(proxy={&#171;host&#187;: &#171;1.2.3.4&#187;,                          &#171;port&#187;: 1080,                          &#171;user&#187;: &#171;my_login&#187;,                          &#171;pass&#187;: &#171;my_password&#187;})Chrome \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438 \u043d\u0435 \u0443\u043c\u0435\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 SOCKS5 \u0438 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u2014 \u0442\u043e\u043b\u044c\u043a\u043e HTTP\/HTTPS, \u0438 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432\u043e \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0435\u043c \u043e\u043a\u043d\u0435. \u0412\u043e\u0442 \u043a\u0430\u043a \u043c\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u044d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443.\u041c\u044b \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 SOCKS5-\u0441\u0435\u0440\u0432\u0435\u0440 \u0441 \u0434\u0432\u0443\u043c\u044f \u043f\u043e\u0442\u043e\u043a\u0430\u043c\u0438:\u041f\u043e\u0442\u043e\u043a-\u0441\u043b\u0443\u0448\u0430\u0442\u0435\u043b\u044c \u2014 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0442\u0440\u0430\u0444\u0438\u043a \u043e\u0442 Chrome \u043d\u0430 localhost\u041f\u043e\u0442\u043e\u043a-\u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044c \u2014 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043a \u0432\u043d\u0435\u0448\u043d\u0435\u043c\u0443 \u043f\u0440\u043e\u043a\u0441\u0438 \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u043b\u043e\u0433\u0438\u043d\/\u043f\u0430\u0440\u043e\u043b\u044cChrome \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0444\u043b\u0430\u0433 &#8212;proxy-server=127.0.0.1:56789 \u0438 \u0448\u043b\u0451\u0442 \u0442\u0443\u0434\u0430 \u0432\u0435\u0441\u044c \u0442\u0440\u0430\u0444\u0438\u043a, \u0434\u0443\u043c\u0430\u044f \u0447\u0442\u043e \u044d\u0442\u043e \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u043f\u0440\u043e\u043a\u0441\u0438 \u0431\u0435\u0437 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438. \u0410 \u043d\u0430\u0448 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u043a\u0441\u0438 \u0441\u0430\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043b\u043e\u0433\u0438\u043d \u0438 \u043f\u0430\u0440\u043e\u043b\u044c \u0438 \u0444\u043e\u0440\u0432\u0430\u0440\u0434\u0438\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043d\u0430 \u0432\u043d\u0435\u0448\u043d\u0438\u0439 SOCKS5-\u0441\u0435\u0440\u0432\u0435\u0440.\u041f\u043e\u043b\u043d\u0430\u044f \u043a\u0430\u0440\u0442\u0438\u043d\u0430:Chrome \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0444\u043b\u0430\u0433 &#8212;proxy-server=127.0.0.1:56789          \u2193Chrome \u0434\u0443\u043c\u0430\u0435\u0442: &#171;\u042d\u0442\u043e \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u043f\u0440\u043e\u043a\u0441\u0438 \u0431\u0435\u0437 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438&#187;          \u2193Chrome \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 HTTP-\u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u0440\u0442 56789          \u2193\u041f\u043e\u0442\u043e\u043a-\u0441\u043b\u0443\u0448\u0430\u0442\u0435\u043b\u044c \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441          \u2193\u041f\u043e\u0442\u043e\u043a-\u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044c:  &#8212; \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043a \u0432\u043d\u0435\u0448\u043d\u0435\u043c\u0443 SOCKS5 (1.2.3.4:1080)  &#8212; \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u043b\u043e\u0433\u0438\u043d \u0438 \u043f\u0430\u0440\u043e\u043b\u044c  &#8212; \u043f\u0435\u0440\u0435\u0441\u044b\u043b\u0430\u0435\u0442 HTTP-\u0437\u0430\u043f\u0440\u043e\u0441          \u2193\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043e\u0442\u0432\u0435\u0442 \u043e\u0442 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u043f\u0440\u043e\u043a\u0441\u0438          \u2193\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043e\u0442\u0432\u0435\u0442 Chrome \u0447\u0435\u0440\u0435\u0437 \u043f\u043e\u0442\u043e\u043a-\u0441\u043b\u0443\u0448\u0430\u0442\u0435\u043b\u044c4. \u0418\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 loguruLoguru \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0439 \u043b\u043e\u0433\u0435\u0440. \u041d\u0430\u043c \u044d\u0442\u043e \u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u043b\u043e \u2014 \u0434\u043b\u044f \u043f\u0440\u043e\u043a\u0441\u0438 \u043d\u0443\u0436\u0435\u043d \u0441\u0432\u043e\u0439 \u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043b\u043e\u0433\u0435\u0440 \u0441 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \u0432\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u0444\u043b\u0430\u0433, \u0434\u043b\u044f ChromeDriver \u0441\u0432\u043e\u0439, \u0434\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0441\u0432\u043e\u0439.\u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u2014 \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u043d\u043e\u0432\u044b\u0439 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043b\u043e\u0433\u0435\u0440\u0430 \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0444\u0438\u043b\u044c\u0442\u0440\u044b:_lib_logger = Logger(    core=Core(),    exception=None,    depth=0,    record=False,    lazy=False,    colors=False,    raw=False,    capture=True,    patchers=[],    extra={},)_lib_logger.add(sys.stderr, level=&#187;ERROR&#187;)def get_logger(debug: bool = False, debug_proxy: bool = False):    _lib_logger.remove()    _lib_logger.add(        sys.stderr,        level=&#187;DEBUG&#187; if debug else &#171;ERROR&#187;,        format=&#187;&lt;green&gt;{time:HH:mm:ss}&lt;\/green&gt; | &lt;level&gt;{level: &lt;8}&lt;\/level&gt; | &#187;               &#171;&lt;cyan&gt;Chrome&lt;\/cyan&gt; &#8212; &lt;level&gt;{message}&lt;\/level&gt;&#187;,        filter=lambda r: r[&#171;extra&#187;].get(&#171;source&#187;) != &#171;proxy&#187;    )    _lib_logger.add(        sys.stderr,        level=&#187;DEBUG&#187; if debug_proxy else &#171;ERROR&#187;,        format=&#187;&lt;blue&gt;{time:HH:mm:ss}&lt;\/blue&gt; | &lt;level&gt;{level: &lt;8}&lt;\/level&gt; | &#187;               &#171;&lt;magenta&gt;PROXY&lt;\/magenta&gt; &#8212; &lt;level&gt;{message}&lt;\/level&gt;&#187;,        filter=lambda r: r[&#171;extra&#187;].get(&#171;source&#187;) == &#171;proxy&#187;    )    return _lib_logger\u0412 Chrome \u0438 \u043f\u0440\u043e\u043a\u0441\u0438 \u043f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u043c \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a:self.logger = self.logger_str.bind(source=&#187;chrome&#187;)5. \u041c\u043e\u0434\u0443\u043b\u044c \u043a\u0430\u043f\u0447\u0438 \u0441 \u0430\u0432\u0442\u043e\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u043e\u0439 \u0441\u043e\u043b\u0432\u0435\u0440\u043e\u0432\u041c\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b\u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u0441\u043e\u043b\u0432\u0435\u0440\u043e\u0432 \u0438\u0437 \u043f\u0430\u043f\u043a\u0438 solvers\/. \u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442: \u0435\u0441\u0442\u044c \u043a\u043b\u0430\u0441\u0441 \u0441 \u043b\u043e\u0433\u0438\u043a\u043e\u0439 \u043f\u0440\u043e\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u043a\u0430\u043f\u0447\u0438 \u2014 \u043f\u0440\u043e\u0441\u0442\u043e \u043a\u043b\u0430\u0434\u0451\u0448\u044c .py \u0444\u0430\u0439\u043b \u0432 \u043f\u0430\u043f\u043a\u0443 \u0438 \u043c\u0435\u0442\u043e\u0434 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f.BaseCaptchaSolver \u2014 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441:from abc import ABC, abstractmethodclass BaseCaptchaSolver(ABC):    name: str = None    _service = None    @property    def driver(self):        return self._service.driver    @property    def api_key(self):        return self._service.api_key    @abstractmethod    def solve(self, **kwargs) -&gt; bool:        &#8230;\u0427\u0442\u043e\u0431\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u0441\u043e\u043b\u0432\u0435\u0440 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e:\u0423\u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043e\u0442 BaseCaptchaSolver\u0417\u0430\u0434\u0430\u0442\u044c name\u0420\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434 solve()Loader \u2014 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u043e\u0438\u0441\u043a \u0441\u043e\u043b\u0432\u0435\u0440\u043e\u0432:import importlib.utilimport inspectfrom pathlib import Pathfrom loguru import loggerdef load_solvers_from_dir(directory: Path, registry: dict):    if not directory.exists():        logger.debug(f&#187;Solvers directory not found: {directory}&#187;)        return    for py_file in directory.glob(&#171;*.py&#187;):        if py_file.name.startswith(&#171;_&#187;):            continue        try:            spec = importlib.util.spec_from_file_location(py_file.stem, py_file)            module = importlib.util.module_from_spec(spec)            spec.loader.exec_module(module)            for _, obj in inspect.getmembers(module, inspect.isclass):                if (hasattr(obj, &#8216;name&#8217;)                        and obj.name                        and obj.__name__ != &#8216;BaseCaptchaSolver&#8217;):                    registry[obj.name] = obj                    logger.debug(f&#187;Captcha solver loaded: &#8216;{obj.name}&#8217; \u2190 {py_file.name}&#187;)        except Exception as e:            logger.warning(f&#187;Failed to load solver {py_file.name}: {e}&#187;)Loader \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u043f\u043e \u0432\u0441\u0435\u043c .py \u0444\u0430\u0439\u043b\u0430\u043c \u0432 \u043f\u0430\u043f\u043a\u0435 solvers\/, \u043d\u0430\u0445\u043e\u0434\u0438\u0442 \u043a\u043b\u0430\u0441\u0441\u044b-\u0441\u043e\u043b\u0432\u0435\u0440\u044b \u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u0438\u0445 \u043f\u043e \u0438\u043c\u0435\u043d\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440: \u0432 \u043f\u0430\u043f\u043a\u0435 \u043b\u0435\u0436\u0438\u0442 my_solver.py \u0441 \u043a\u043b\u0430\u0441\u0441\u043e\u043c MySolver(name=&#187;my_captcha&#187;) \u2014 Loader \u043d\u0430\u0439\u0434\u0451\u0442 \u0435\u0433\u043e \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442 \u0432 \u0440\u0435\u0435\u0441\u0442\u0440 \u043f\u043e\u0434 \u043a\u043b\u044e\u0447\u043e\u043c &#171;my_captcha&#187;.CaptchaService \u2014 \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441:from pathlib import Pathfrom loguru import loggerfrom .loader import load_solvers_from_dirfrom .base import BaseCaptchaSolverclass CaptchaService:    &#171;&#187;&#187;    \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435:        captcha = CaptchaService(api_key=&#187;KEY&#187;, driver=driver)        captcha.ebay_hcaptcha()    &#171;&#187;&#187;    def __init__(self, api_key: str, driver,&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-478267","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/478267","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=478267"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/478267\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=478267"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=478267"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=478267"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}