{"id":469623,"date":"2025-08-05T15:00:04","date_gmt":"2025-08-05T15:00:04","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=469623"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=469623","title":{"rendered":"<span>\u0421\u043a\u0440\u0435\u0439\u043f\u0438\u043d\u0433 Temu \u0432 2025: \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u0435\u0439\u0441 \u0441 \u0430\u043d\u0442\u0438\u0431\u043e\u0442\u043e\u043c, \u0440\u043e\u0442\u0430\u0446\u0438\u0435\u0439 \u0438 \u043f\u0440\u043e\u043a\u0441\u0438<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p> \u0420\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u043c \u043f\u043e\u043b\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u043d\u0430\u0434\u0451\u0436\u043d\u043e\u0433\u043e \u0441\u043a\u0440\u0435\u0439\u043f\u0435\u0440\u0430 \u0434\u043b\u044f Temu: \u043e\u0442 \u0432\u044b\u0431\u043e\u0440\u0430 \u0441\u0442\u0435\u043a\u0430 \u0438 \u043f\u0440\u043e\u043a\u0441\u0438 \u0434\u043e \u043e\u0431\u0445\u043e\u0434\u0430 JavaScript\u2011\u0447\u0435\u043b\u043b\u0435\u043d\u0434\u0436\u0435\u0439 \u0438 \u0441\u0431\u043e\u0440\u0430 \u0442\u044b\u0441\u044f\u0447 \u043a\u0430\u0440\u0442\u043e\u0447\u0435\u043a \u0442\u043e\u0432\u0430\u0440\u043e\u0432 \u0431\u0435\u0437 \u0435\u0434\u0438\u043d\u043e\u0433\u043e 403. <\/p>\n<h3>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u0442\u0438\u043a\u0430 \u0438 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f<\/h3>\n<ol>\n<li>\n<p><strong>\u0410\u043d\u0442\u0438\u0431\u043e\u0442\u2011\u0437\u0430\u0449\u0438\u0442\u0430 Temu<\/strong><\/p>\n<ul>\n<li>\n<p>JS\u2011\u0447\u0435\u043b\u043b\u0435\u043d\u0434\u0436\u0438 \u0438 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043a\u0443\u043a\u0438;<\/p>\n<\/li>\n<li>\n<p>\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u043c\u0441\u044f \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430\u043c \u0438 \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u043e\u043c\u0443 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044e;<\/p>\n<\/li>\n<li>\n<p>\u0433\u0435\u043e\u2011\u0442\u0430\u0440\u0433\u0435\u0442\u0438\u043d\u0433: \u0447\u0430\u0441\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u043d\u0442\u0430 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u0432\u043d\u0435 \u0446\u0435\u043b\u0435\u0432\u044b\u0445 \u0440\u0435\u0433\u0438\u043e\u043d\u043e\u0432.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><strong>\u0426\u0435\u043b\u0438 \u0441\u043a\u0440\u0435\u0439\u043f\u0438\u043d\u0433\u0430<\/strong><\/p>\n<ul>\n<li>\n<p>\u0441\u0431\u043e\u0440 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0439, \u0446\u0435\u043d, \u0440\u0435\u0439\u0442\u0438\u043d\u0433\u043e\u0432 \u0438 \u0441\u0441\u044b\u043b\u043e\u043a \u043d\u0430 \u0442\u043e\u0432\u0430\u0440\u044b;<\/p>\n<\/li>\n<li>\n<p>\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u044c \u043a \u0431\u0430\u043d\u0443 \u043f\u0440\u0438 \u0441\u043e\u0442\u043d\u044f\u0445 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u0445 \u0441\u0435\u0441\u0441\u0438\u0439;<\/p>\n<\/li>\n<li>\n<p>\u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u043c\u043e\u0441\u0442\u044c: \u043b\u0435\u0433\u043a\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u0438\u043b\u0438 \u0440\u0435\u0433\u0438\u043e\u043d\u044b.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<h3>\u0422\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0441\u0442\u0435\u043a<\/h3>\n<ul>\n<li>\n<p><strong>\u042f\u0437\u044b\u043a<\/strong>: Python\u00a03.11+<\/p>\n<\/li>\n<li>\n<p><strong>\u0411\u0440\u0430\u0443\u0437\u0435\u0440<\/strong>: Playwright (Chromium) \u0432 headless\u2011\u0440\u0435\u0436\u0438\u043c\u0435<\/p>\n<\/li>\n<li>\n<p><strong>\u0410\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0441\u0442\u044c<\/strong>: asyncio + \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 Playwright<\/p>\n<\/li>\n<li>\n<p><strong>\u041f\u0440\u043e\u043a\u0441\u0438<\/strong>: ProxyEmpire (\u0440\u043e\u0442\u0430\u0446\u0438\u044f IP, \u043f\u043e\u0440\u0442\u00a05000, \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f user:pass)<\/p>\n<\/li>\n<li>\n<p><strong>\u041f\u0430\u0440\u0441\u0438\u043d\u0433<\/strong>: CSS\u2011\u0441\u0435\u043b\u0435\u043a\u0442\u043e\u0440\u044b; \u0434\u043b\u044f \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u043e\u0432 \u2014 lxml\/BeautifulSoup<\/p>\n<\/li>\n<\/ul>\n<h3>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u044f<\/h3>\n<pre><code class=\"python\">[\u0421\u043f\u0438\u0441\u043e\u043a URL \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439]          \u2193 (async dispatcher) [Pool Playwright contexts] \u2190 ProxyEmpire (\u0440\u043e\u0442\u0430\u0446\u0438\u044f IP)         \u2193 [\u0420\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433 \u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u2192 \u0441\u0435\u043b\u0435\u043a\u0442\u043e\u0440\u044b \u2192 \u043f\u0430\u0440\u0441\u0438\u043d\u0433]         \u2193 [\u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435: CSV \/ PostgreSQL \/ MongoDB]<\/code><\/pre>\n<ul>\n<li>\n<p><strong>Playwright contexts<\/strong> \u0438\u0437\u043e\u043b\u0438\u0440\u0443\u044e\u0442 \u043a\u0443\u043a\u0438 \u0438 localStorage \u043c\u0435\u0436\u0434\u0443 \u0437\u0430\u0434\u0430\u0447\u0430\u043c\u0438.<\/p>\n<\/li>\n<li>\n<p><strong>\u0420\u043e\u0442\u0430\u0446\u0438\u044f IP<\/strong> \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u043a\u0430\u0436\u0434\u043e\u0433\u043e context: \u043d\u043e\u0432\u044b\u0439 proxy-\u0441\u0435\u0440\u0432\u0435\u0440.<\/p>\n<\/li>\n<li>\n<p><strong>\u041b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/strong> \u0432\u0441\u0435\u0445 \u043e\u0448\u0438\u0431\u043e\u043a \u0438 \u0437\u0430\u0434\u0435\u0440\u0436\u0435\u043a \u0434\u043b\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430.<\/p>\n<\/li>\n<\/ul>\n<h3>\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f ProxyEmpire<\/h3>\n<pre><code class=\"python\"># credentials.py PROXY_USER = \"\u0432\u0430\u0448_\u043b\u043e\u0433\u0438\u043d\" PROXY_PASS = \"\u0432\u0430\u0448_\u043f\u0430\u0440\u043e\u043b\u044c\" PROXY_HOST = \"gateway.proxyempire.io\" PROXY_PORT = 5000<\/code><\/pre>\n<ul>\n<li>\n<p>\u041f\u0443\u043b \u0438\u0437 5000 IP (\u0421\u0428\u0410, \u0415\u0421, \u0410\u0417\u0418\u042f \u0438 \u0434\u0440.).<\/p>\n<\/li>\n<li>\n<p>\u0410\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u0447\u0435\u0440\u0435\u0437 HTTP Basic.<\/p>\n<\/li>\n<li>\n<p>Round\u2011robin \u0440\u043e\u0442\u0430\u0446\u0438\u044f \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 TCP\u2011\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439 Playwright.<\/p>\n<\/li>\n<\/ul>\n<h3>\u041a\u043e\u0434: \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u0441\u043a\u0440\u0435\u0439\u043f\u0435\u0440<\/h3>\n<pre><code class=\"python\"># scraper.py import asyncio import logging from playwright.async_api import async_playwright, TimeoutError as PlaywrightTimeout  from credentials import PROXY_USER, PROXY_PASS, PROXY_HOST, PROXY_PORT  logging.basicConfig(level=logging.INFO, format=\"%(asctime)s %(levelname)s %(message)s\")   CATEGORY_URLS = [     \"https:\/\/www.temu.com\/ru\/computers-and-office-c-123.html\",     # \u0434\u043e\u0431\u0430\u0432\u044c\u0442\u0435 \u0434\u0440\u0443\u0433\u0438\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u044b ]   async def fetch_category(page, url):     try:         await page.goto(url, timeout=60000)         await page.wait_for_selector(\"div[class*='product-card']\", timeout=10000)         cards = await page.query_selector_all(\"div[class*='product-card']\")         results = []          for card in cards:             title = await card.query_selector_eval(\"h3\", \"el =&gt; el.innerText.trim()\")             price = await card.query_selector_eval(\"div[class*='price']\", \"el =&gt; el.innerText.trim()\")             link = await card.query_selector_eval(\"a\", \"el =&gt; el.href\")             results.append({\"title\": title, \"price\": price, \"link\": link})          logging.info(f\"[{url}] \u0421\u043e\u0431\u0440\u0430\u043d\u043e {len(results)} \u043a\u0430\u0440\u0442\u043e\u0447\u0435\u043a\")         return results      except PlaywrightTimeout as te:         logging.warning(f\"[{url}] \u0422\u0430\u0439\u043c\u0430\u0443\u0442: {te}\")     except Exception as ex:         logging.error(f\"[{url}] \u041e\u0448\u0438\u0431\u043a\u0430: {ex}\")      return []   async def worker(name, url_queue, output):     proxy_url = f\"http:\/\/{PROXY_USER}:{PROXY_PASS}@{PROXY_HOST}:{PROXY_PORT}\"     async with async_playwright() as p:         browser = await p.chromium.launch(headless=True)         while not url_queue.empty():             url = await url_queue.get()             context = await browser.new_context(proxy={\"server\": proxy_url})             page = await context.new_page()             data = await fetch_category(page, url)             output.extend(data)             await context.close()             await asyncio.sleep(1)   # \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0430\u044f \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0430             url_queue.task_done()         await browser.close()   async def main():     url_queue = asyncio.Queue()     for url in CATEGORY_URLS:         await url_queue.put(url)      results = []     workers = [asyncio.create_task(worker(f\"worker-{i}\", url_queue, results))                for i in range(5)]  # 5 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u0445 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043e\u0432      await url_queue.join()     for w in workers:         w.cancel()      # \u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0432 CSV     import csv     with open(\"temu_products.csv\", \"w\", newline=\"\", encoding=\"utf-8\") as f:         writer = csv.DictWriter(f, fieldnames=[\"title\", \"price\", \"link\"])         writer.writeheader()         writer.writerows(results)      logging.info(f\"\u0418\u0442\u043e\u0433\u043e \u0441\u043e\u0431\u0440\u0430\u043d\u043e: {len(results)} \u0437\u0430\u043f\u0438\u0441\u0435\u0439\")   if __name__ == \"__main__\":     asyncio.run(main())<\/code><\/pre>\n<p><strong>\u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438:<\/strong><\/p>\n<ul>\n<li>\n<p><strong>Queue + worker\u2011pattern<\/strong> \u0434\u043b\u044f \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f URL;<\/p>\n<\/li>\n<li>\n<p><strong>\u0418\u0437\u043e\u043b\u044f\u0446\u0438\u044f \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043e\u0432<\/strong> Playwright \u0434\u043b\u044f \u0447\u0438\u0441\u0442\u044b\u0445 \u0441\u0435\u0441\u0441\u0438\u0439;<\/p>\n<\/li>\n<li>\n<p><strong>ProxyEmpire<\/strong> \u0437\u0430\u0434\u0430\u0451\u0442\u0441\u044f \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 context;<\/p>\n<\/li>\n<li>\n<p><strong>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043e\u0448\u0438\u0431\u043e\u043a<\/strong>: \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u044b \u0438 \u043d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043b\u043e\u0433\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0438 \u043d\u0435 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u044e\u0442 \u0440\u0430\u0431\u043e\u0442\u0443.<\/p>\n<\/li>\n<\/ul>\n<h3>\u0422\u043e\u043d\u043a\u043e\u0441\u0442\u0438 \u043e\u0431\u0445\u043e\u0434\u0430 \u0437\u0430\u0449\u0438\u0442\u044b<\/h3>\n<ol>\n<li>\n<p><strong>\u0414\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438<\/strong><\/p>\n<ul>\n<li>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0440\u043e\u0442\u0430\u0446\u0438\u044e User\u2011Agent: \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u0432;<\/p>\n<\/li>\n<li>\n<p>\u041c\u0430\u0441\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0433\u043e\u043b\u043e\u0432\u044b: <code>Accept-Language<\/code>, <code>Referer<\/code>.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><strong>Anti-Detect<\/strong><\/p>\n<ul>\n<li>\n<p>\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u044d\u043c\u0443\u043b\u044f\u0446\u0438\u044e \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043d\u044b\u0445 \u0441\u0432\u043e\u0439\u0441\u0442\u0432:<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<pre><code class=\"python\">context = await browser.new_context(     proxy={...},     user_agent=random.choice(USER_AGENTS),     viewport={\"width\": 1280, \"height\": 720},     java_script_enabled=True )\u041a\u0443\u043a\u0438 \u0438 localStorage  \u0414\u043b\u044f \u0447\u0430\u0441\u0442\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f: \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0438 \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c state;  Captcha\u2011\u0437\u0430\u0449\u0438\u0442\u0430  \u0415\u0441\u043b\u0438 \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f invisible reCAPTCHA, \u043c\u043e\u0436\u043d\u043e \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0430\u043d\u0442\u0438\u043a\u0430\u043f\u0447\u0430-\u0441\u0435\u0440\u0432\u0438\u0441.<\/code><\/pre>\n<p>3.<strong>\u041a\u0443\u043a\u0438 \u0438 localStorage<\/strong><\/p>\n<ul>\n<li>\n<p>\u0414\u043b\u044f \u0447\u0430\u0441\u0442\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f: \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0438 \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c state;<\/p>\n<\/li>\n<\/ul>\n<p>4.<strong>Captcha\u2011\u0437\u0430\u0449\u0438\u0442\u0430<\/strong><\/p>\n<ul>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f invisible reCAPTCHA, \u043c\u043e\u0436\u043d\u043e \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0430\u043d\u0442\u0438\u043a\u0430\u043f\u0447\u0430-\u0441\u0435\u0440\u0432\u0438\u0441.<\/p>\n<\/li>\n<\/ul>\n<h3>8. \u0412\u044b\u0432\u043e\u0434\u044b \u0438 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u0438<\/h3>\n<ol>\n<li>\n<p><strong>Headless\u2011\u0431\u0440\u0430\u0443\u0437\u0435\u0440 + \u043f\u0440\u043e\u043a\u0441\u0438<\/strong> \u2014 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0434\u0443\u044d\u0442 \u043f\u0440\u0438 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0430\u043d\u0442\u0438\u0431\u043e\u0442\u2011\u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0430\u0445.<\/p>\n<\/li>\n<li>\n<p><strong>\u0418\u0437\u043e\u043b\u044f\u0446\u0438\u044f \u0441\u0435\u0441\u0441\u0438\u0439<\/strong> Playwright \u0438\u0437\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043e\u0442 \u201c\u043f\u0440\u043e\u0442\u0435\u043a\u0430\u043d\u0438\u044f\u201d \u043a\u0443\u043a\u0438 \u043c\u0435\u0436\u0434\u0443 \u0437\u0430\u0434\u0430\u0447\u0430\u043c\u0438.<\/p>\n<\/li>\n<li>\n<p><strong>\u0422\u043e\u043d\u043a\u0430\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430<\/strong> User\u2011Agent, \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u0432 \u0438 \u0437\u0430\u0434\u0435\u0440\u0436\u0435\u043a \u0441\u043d\u0438\u0436\u0430\u0435\u0442 \u043f\u043e\u0434\u043e\u0437\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435.<\/p>\n<\/li>\n<li>\n<p><strong>ProxyEmpire<\/strong> \u0441 \u043f\u043e\u0440\u0442\u043e\u043c 5000 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u0440\u043e\u0442\u0430\u0446\u0438\u044e IP \u0438 \u0433\u0435\u043e\u2011\u0442\u0430\u0440\u0433\u0435\u0442\u0438\u043d\u0433.<\/p>\n<\/li>\n<\/ol>\n<h3>\u041f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0441\u0441\u044b\u043b\u043a\u0438<\/h3>\n<ul>\n<li>\n<p>Playwright Python: <a href=\"https:\/\/playwright.dev\/python\/\" rel=\"noopener noreferrer nofollow\">https:\/\/playwright.dev\/python\/<\/a><\/p>\n<\/li>\n<li>\n<p>ProxyEmpire: <a href=\"https:\/\/proxyempire.io\/\" rel=\"noopener noreferrer nofollow\">https:\/\/proxyempire.io\/<\/a><\/p>\n<\/li>\n<li>\n<p>\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f Temu (\u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432): <a href=\"https:\/\/www.temu.com\/\" rel=\"noopener noreferrer nofollow\">https:\/\/www.temu.com\/<\/a><\/p>\n<\/li>\n<\/ul>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \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\/934080\/\"> https:\/\/habr.com\/ru\/articles\/934080\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p> \u0420\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u043c \u043f\u043e\u043b\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u043d\u0430\u0434\u0451\u0436\u043d\u043e\u0433\u043e \u0441\u043a\u0440\u0435\u0439\u043f\u0435\u0440\u0430 \u0434\u043b\u044f Temu: \u043e\u0442 \u0432\u044b\u0431\u043e\u0440\u0430 \u0441\u0442\u0435\u043a\u0430 \u0438 \u043f\u0440\u043e\u043a\u0441\u0438 \u0434\u043e \u043e\u0431\u0445\u043e\u0434\u0430 JavaScript\u2011\u0447\u0435\u043b\u043b\u0435\u043d\u0434\u0436\u0435\u0439 \u0438 \u0441\u0431\u043e\u0440\u0430 \u0442\u044b\u0441\u044f\u0447 \u043a\u0430\u0440\u0442\u043e\u0447\u0435\u043a \u0442\u043e\u0432\u0430\u0440\u043e\u0432 \u0431\u0435\u0437 \u0435\u0434\u0438\u043d\u043e\u0433\u043e 403. <\/p>\n<h3>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u0442\u0438\u043a\u0430 \u0438 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f<\/h3>\n<ol>\n<li>\n<p><strong>\u0410\u043d\u0442\u0438\u0431\u043e\u0442\u2011\u0437\u0430\u0449\u0438\u0442\u0430 Temu<\/strong><\/p>\n<ul>\n<li>\n<p>JS\u2011\u0447\u0435\u043b\u043b\u0435\u043d\u0434\u0436\u0438 \u0438 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043a\u0443\u043a\u0438;<\/p>\n<\/li>\n<li>\n<p>\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u043c\u0441\u044f \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430\u043c \u0438 \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u043e\u043c\u0443 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044e;<\/p>\n<\/li>\n<li>\n<p>\u0433\u0435\u043e\u2011\u0442\u0430\u0440\u0433\u0435\u0442\u0438\u043d\u0433: \u0447\u0430\u0441\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u043d\u0442\u0430 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u0432\u043d\u0435 \u0446\u0435\u043b\u0435\u0432\u044b\u0445 \u0440\u0435\u0433\u0438\u043e\u043d\u043e\u0432.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><strong>\u0426\u0435\u043b\u0438 \u0441\u043a\u0440\u0435\u0439\u043f\u0438\u043d\u0433\u0430<\/strong><\/p>\n<ul>\n<li>\n<p>\u0441\u0431\u043e\u0440 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0439, \u0446\u0435\u043d, \u0440\u0435\u0439\u0442\u0438\u043d\u0433\u043e\u0432 \u0438 \u0441\u0441\u044b\u043b\u043e\u043a \u043d\u0430 \u0442\u043e\u0432\u0430\u0440\u044b;<\/p>\n<\/li>\n<li>\n<p>\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u044c \u043a \u0431\u0430\u043d\u0443 \u043f\u0440\u0438 \u0441\u043e\u0442\u043d\u044f\u0445 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u0445 \u0441\u0435\u0441\u0441\u0438\u0439;<\/p>\n<\/li>\n<li>\n<p>\u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u043c\u043e\u0441\u0442\u044c: \u043b\u0435\u0433\u043a\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u0438\u043b\u0438 \u0440\u0435\u0433\u0438\u043e\u043d\u044b.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<h3>\u0422\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0441\u0442\u0435\u043a<\/h3>\n<ul>\n<li>\n<p><strong>\u042f\u0437\u044b\u043a<\/strong>: Python\u00a03.11+<\/p>\n<\/li>\n<li>\n<p><strong>\u0411\u0440\u0430\u0443\u0437\u0435\u0440<\/strong>: Playwright (Chromium) \u0432 headless\u2011\u0440\u0435\u0436\u0438\u043c\u0435<\/p>\n<\/li>\n<li>\n<p><strong>\u0410\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0441\u0442\u044c<\/strong>: asyncio + \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 Playwright<\/p>\n<\/li>\n<li>\n<p><strong>\u041f\u0440\u043e\u043a\u0441\u0438<\/strong>: ProxyEmpire (\u0440\u043e\u0442\u0430\u0446\u0438\u044f IP, \u043f\u043e\u0440\u0442\u00a05000, \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f user:pass)<\/p>\n<\/li>\n<li>\n<p><strong>\u041f\u0430\u0440\u0441\u0438\u043d\u0433<\/strong>: CSS\u2011\u0441\u0435\u043b\u0435\u043a\u0442\u043e\u0440\u044b; \u0434\u043b\u044f \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u043e\u0432 \u2014 lxml\/BeautifulSoup<\/p>\n<\/li>\n<\/ul>\n<h3>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u044f<\/h3>\n<pre><code class=\"python\">[\u0421\u043f\u0438\u0441\u043e\u043a URL \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439]          \u2193 (async dispatcher) [Pool Playwright contexts] \u2190 ProxyEmpire (\u0440\u043e\u0442\u0430\u0446\u0438\u044f IP)         \u2193 [\u0420\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433 \u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u2192 \u0441\u0435\u043b\u0435\u043a\u0442\u043e\u0440\u044b \u2192 \u043f\u0430\u0440\u0441\u0438\u043d\u0433]         \u2193 [\u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435: CSV \/ PostgreSQL \/ MongoDB]<\/code><\/pre>\n<ul>\n<li>\n<p><strong>Playwright contexts<\/strong> \u0438\u0437\u043e\u043b\u0438\u0440\u0443\u044e\u0442 \u043a\u0443\u043a\u0438 \u0438 localStorage \u043c\u0435\u0436\u0434\u0443 \u0437\u0430\u0434\u0430\u0447\u0430\u043c\u0438.<\/p>\n<\/li>\n<li>\n<p><strong>\u0420\u043e\u0442\u0430\u0446\u0438\u044f IP<\/strong> \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u043a\u0430\u0436\u0434\u043e\u0433\u043e context: \u043d\u043e\u0432\u044b\u0439 proxy-\u0441\u0435\u0440\u0432\u0435\u0440.<\/p>\n<\/li>\n<li>\n<p><strong>\u041b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/strong> \u0432\u0441\u0435\u0445 \u043e\u0448\u0438\u0431\u043e\u043a \u0438 \u0437\u0430\u0434\u0435\u0440\u0436\u0435\u043a \u0434\u043b\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430.<\/p>\n<\/li>\n<\/ul>\n<h3>\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f ProxyEmpire<\/h3>\n<pre><code class=\"python\"># credentials.py PROXY_USER = \"\u0432\u0430\u0448_\u043b\u043e\u0433\u0438\u043d\" PROXY_PASS = \"\u0432\u0430\u0448_\u043f\u0430\u0440\u043e\u043b\u044c\" PROXY_HOST = \"gateway.proxyempire.io\" PROXY_PORT = 5000<\/code><\/pre>\n<ul>\n<li>\n<p>\u041f\u0443\u043b \u0438\u0437 5000 IP (\u0421\u0428\u0410, \u0415\u0421, \u0410\u0417\u0418\u042f \u0438 \u0434\u0440.).<\/p>\n<\/li>\n<li>\n<p>\u0410\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u0447\u0435\u0440\u0435\u0437 HTTP Basic.<\/p>\n<\/li>\n<li>\n<p>Round\u2011robin \u0440\u043e\u0442\u0430\u0446\u0438\u044f \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 TCP\u2011\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439 Playwright.<\/p>\n<\/li>\n<\/ul>\n<h3>\u041a\u043e\u0434: \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u0441\u043a\u0440\u0435\u0439\u043f\u0435\u0440<\/h3>\n<pre><code class=\"python\"># scraper.py import asyncio import logging from playwright.async_api import async_playwright, TimeoutError as PlaywrightTimeout  from credentials import PROXY_USER, PROXY_PASS, PROXY_HOST, PROXY_PORT  logging.basicConfig(level=logging.INFO, format=\"%(asctime)s %(levelname)s %(message)s\")   CATEGORY_URLS = [     \"https:\/\/www.temu.com\/ru\/computers-and-office-c-123.html\",     # \u0434\u043e\u0431\u0430\u0432\u044c\u0442\u0435 \u0434\u0440\u0443\u0433\u0438\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u044b ]   async def fetch_category(page, url):     try:         await page.goto(url, timeout=60000)         await page.wait_for_selector(\"div[class*='product-card']\", timeout=10000)         cards = await page.query_selector_all(\"div[class*='product-card']\")         results = []          for card in cards:             title = await card.query_selector_eval(\"h3\", \"el =&gt; el.innerText.trim()\")             price = await card.query_selector_eval(\"div[class*='price']\", \"el =&gt; el.innerText.trim()\")             link = await card.query_selector_eval(\"a\", \"el =&gt; el.href\")             results.append({\"title\": title, \"price\": price, \"link\": link})          logging.info(f\"[{url}] \u0421\u043e\u0431\u0440\u0430\u043d\u043e {len(results)} \u043a\u0430\u0440\u0442\u043e\u0447\u0435\u043a\")         return results      except PlaywrightTimeout as te:         logging.warning(f\"[{url}] \u0422\u0430\u0439\u043c\u0430\u0443\u0442: {te}\")     except Exception as ex:         logging.error(f\"[{url}] \u041e\u0448\u0438\u0431\u043a\u0430: {ex}\")      return []   async def worker(name, url_queue, output):     proxy_url = f\"http:\/\/{PROXY_USER}:{PROXY_PASS}@{PROXY_HOST}:{PROXY_PORT}\"     async with async_playwright() as p:         browser = await p.chromium.launch(headless=True)         while not url_queue.empty():             url = await url_queue.get()             context = await browser.new_context(proxy={\"server\": proxy_url})             page = await context.new_page()             data = await fetch_category(page, url)             output.extend(data)             await context.close()             await asyncio.sleep(1)   # \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0430\u044f \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0430             url_queue.task_done()         await browser.close()   async def main():     url_queue = asyncio.Queue()     for url in CATEGORY_URLS:         await url_queue.put(url)      results = []     workers = [asyncio.create_task(worker(f\"worker-{i}\", url_queue, results))                for i in range(5)]  # 5 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u0445 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043e\u0432      await url_queue.join()     for w in workers:         w.cancel()      # \u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0432 CSV     import csv     with open(\"temu_products.csv\", \"w\", newline=\"\", encoding=\"utf-8\") as f:         writer = csv.DictWriter(f, fieldnames=[\"title\", \"price\", \"link\"])         writer.writeheader()         writer.writerows(results)      logging.info(f\"\u0418\u0442\u043e\u0433\u043e \u0441\u043e\u0431\u0440\u0430\u043d\u043e: {len(results)} \u0437\u0430\u043f\u0438\u0441\u0435\u0439\")   if __name__ == \"__main__\":     asyncio.run(main())<\/code><\/pre>\n<p><strong>\u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438:<\/strong><\/p>\n<ul>\n<li>\n<p><strong>Queue + worker\u2011pattern<\/strong> \u0434\u043b\u044f \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f URL;<\/p>\n<\/li>\n<li>\n<p><strong>\u0418\u0437\u043e\u043b\u044f\u0446\u0438\u044f \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043e\u0432<\/strong> Playwright \u0434\u043b\u044f \u0447\u0438\u0441\u0442\u044b\u0445 \u0441\u0435\u0441\u0441\u0438\u0439;<\/p>\n<\/li>\n<li>\n<p><strong>ProxyEmpire<\/strong> \u0437\u0430\u0434\u0430\u0451\u0442\u0441\u044f \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 context;<\/p>\n<\/li>\n<li>\n<p><strong>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043e\u0448\u0438\u0431\u043e\u043a<\/strong>: \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u044b \u0438 \u043d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043b\u043e\u0433\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0438 \u043d\u0435 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u044e\u0442 \u0440\u0430\u0431\u043e\u0442\u0443.<\/p>\n<\/li>\n<\/ul>\n<h3>\u0422\u043e\u043d\u043a\u043e\u0441\u0442\u0438 \u043e\u0431\u0445\u043e\u0434\u0430 \u0437\u0430\u0449\u0438\u0442\u044b<\/h3>\n<ol>\n<li>\n<p><strong>\u0414\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438<\/strong><\/p>\n<ul>\n<li>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0440\u043e\u0442\u0430\u0446\u0438\u044e User\u2011Agent: \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u0432;<\/p>\n<\/li>\n<li>\n<p>\u041c\u0430\u0441\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0433\u043e\u043b\u043e\u0432\u044b: <code>Accept-Language<\/code>, <code>Referer<\/code>.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><strong>Anti-Detect<\/strong><\/p>\n<ul>\n<li>\n<p>\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u044d\u043c\u0443\u043b\u044f\u0446\u0438\u044e \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043d\u044b\u0445 \u0441\u0432\u043e\u0439\u0441\u0442\u0432:<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<pre><code class=\"python\">context = await browser.new_context(     proxy={...},     user_agent=random.choice(USER_AGENTS),     viewport={\"width\": 1280, \"height\": 720},     java_script_enabled=True )\u041a\u0443\u043a\u0438 \u0438 localStorage  \u0414\u043b\u044f \u0447\u0430\u0441\u0442\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f: \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0438 \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c state;  Captcha\u2011\u0437\u0430\u0449\u0438\u0442\u0430  \u0415\u0441\u043b\u0438 \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f invisible reCAPTCHA, \u043c\u043e\u0436\u043d\u043e \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0430\u043d\u0442\u0438\u043a\u0430\u043f\u0447\u0430-\u0441\u0435\u0440\u0432\u0438\u0441.<\/code><\/pre>\n<p>3.<strong>\u041a\u0443\u043a\u0438 \u0438 localStorage<\/strong><\/p>\n<ul>\n<li>\n<p>\u0414\u043b\u044f \u0447\u0430\u0441\u0442\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f: \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0438 \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c state;<\/p>\n<\/li>\n<\/ul>\n<p>4.<strong>Captcha\u2011\u0437\u0430\u0449\u0438\u0442\u0430<\/strong><\/p>\n<ul>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f invisible reCAPTCHA, \u043c\u043e\u0436\u043d\u043e \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0430\u043d\u0442\u0438\u043a\u0430\u043f\u0447\u0430-\u0441\u0435\u0440\u0432\u0438\u0441.<\/p>\n<\/li>\n<\/ul>\n<h3>8. \u0412\u044b\u0432\u043e\u0434\u044b \u0438 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u0438<\/h3>\n<ol>\n<li>\n<p><strong>Headless\u2011\u0431\u0440\u0430\u0443\u0437\u0435\u0440 + \u043f\u0440\u043e\u043a\u0441\u0438<\/strong> \u2014 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0434\u0443\u044d\u0442 \u043f\u0440\u0438 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0430\u043d\u0442\u0438\u0431\u043e\u0442\u2011\u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0430\u0445.<\/p>\n<\/li>\n<li>\n<p><strong>\u0418\u0437\u043e\u043b\u044f\u0446\u0438\u044f \u0441\u0435\u0441\u0441\u0438\u0439<\/strong> Playwright \u0438\u0437\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043e\u0442 \u201c\u043f\u0440\u043e\u0442\u0435\u043a\u0430\u043d\u0438\u044f\u201d \u043a\u0443\u043a\u0438 \u043c\u0435\u0436\u0434\u0443 \u0437\u0430\u0434\u0430\u0447\u0430\u043c\u0438.<\/p>\n<\/li>\n<li>\n<p><strong>\u0422\u043e\u043d\u043a\u0430\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430<\/strong> User\u2011Agent, \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u0432 \u0438 \u0437\u0430\u0434\u0435\u0440\u0436\u0435\u043a \u0441\u043d\u0438\u0436\u0430\u0435\u0442 \u043f\u043e\u0434\u043e\u0437\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435.<\/p>\n<\/li>\n<li>\n<p><strong>ProxyEmpire<\/strong> \u0441 \u043f\u043e\u0440\u0442\u043e\u043c 5000 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u0440\u043e\u0442\u0430\u0446\u0438\u044e IP \u0438 \u0433\u0435\u043e\u2011\u0442\u0430\u0440\u0433\u0435\u0442\u0438\u043d\u0433.<\/p>\n<\/li>\n<\/ol>\n<h3>\u041f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0441\u0441\u044b\u043b\u043a\u0438<\/h3>\n<ul>\n<li>\n<p>Playwright Python: <a href=\"https:\/\/playwright.dev\/python\/\" rel=\"noopener noreferrer nofollow\">https:\/\/playwright.dev\/python\/<\/a><\/p>\n<\/li>\n<li>\n<p>ProxyEmpire: <a href=\"https:\/\/proxyempire.io\/\" rel=\"noopener noreferrer nofollow\">https:\/\/proxyempire.io\/<\/a><\/p>\n<\/li>\n<li>\n<p>\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f Temu (\u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432): <a href=\"https:\/\/www.temu.com\/\" rel=\"noopener noreferrer nofollow\">https:\/\/www.temu.com\/<\/a><\/p>\n<\/li>\n<\/ul>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \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\/934080\/\"> https:\/\/habr.com\/ru\/articles\/934080\/<\/a><br \/><\/br><\/br><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-469623","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/469623","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=469623"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/469623\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=469623"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=469623"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=469623"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}