اسکرپ نتایج جستجوی Google با پروکسی (SERP، ۲۰۲۶)

منتشر شده در 12 ژوئن 2026 · زمان مطالعه ≈ 9 دقیقه

Google سخت‌ترین هدف اصلی برای اسکرپ‌کردن است و دلیلش ساده است: بیش از هر کسی ترافیک می‌بیند، پس غنی‌ترین مدل را از این‌که یک جستجوگر واقعی چه شکلی است دارد. از یک IP دیتاسنتر با هر حجمی به آن بزنید و ظرف چند درخواست ۴۲۹، صفحه‌ی «sorry/index» یا بلاک نرم می‌گیرید که نتایج بی‌صدا کم می‌شوند. این راهنما پوشش می‌دهد چه چیزی واقعاً بلاک‌های Google را راه می‌اندازد و چه استراتژی پروکسی و نرخ‌محدودسازی یک اسکرپر SERP را در ۲۰۲۶ زنده نگه می‌دارد.

چه چیزی بلاک Google را راه می‌اندازد

Google به یک سیگنال تکیه نمی‌کند — چندتا را روی هم می‌گذارد و وقتی امتیاز ترکیبی از خط رد شود بن می‌کند:

اینجا مسکونی غیرقابل‌مذاکره است

برای بیشتر هدف‌ها روی داده‌ی عمومی می‌توان با IP دیتاسنتر سر کرد. Google استثناست: امتیازدهی اعتبار ASN آن آن‌قدر تهاجمی است که پروکسی دیتاسنتر تقریباً فوری throttle می‌شود. خروجی‌های مسکونی — ASNهای واقعی مصرف‌کننده — همان چیزی است که به اسکرپر SERP اجازه‌ی دوام حجم می‌دهد. دیتاسنتر را برای بقیه‌ی کارها نگه دارید و بودجه‌ی مسکونی را جایی خرج کنید که واقعاً اثر دارد.

بچرخانید، اما به‌ازای هر خروجی نرخ را محدود کنید

چرخش بار را پخش می‌کند تا هیچ IP شبیه بات نباشد، اما انضباطی که زنده‌تان نگه می‌دارد نرخ به‌ازای هر خروجی است، نه اندازه‌ی استخر. هزار پروکسی هم اگر همه را تمام‌گاز شلیک کنید بن می‌شوند. به هر خروجی مثل یک انسان ریتم بدهید:

import time, random, itertools
from curl_cffi import requests   # browser TLS fingerprint, see notes below

PROXIES = [
    "socks5h://USERNAME:[email protected]:913",
    "socks5h://USERNAME:[email protected]:913",
]
pool = itertools.cycle(PROXIES)

def serp(query, page=0):
    proxy = next(pool)
    params = {"q": query, "start": page * 10, "hl": "en"}
    r = requests.get("https://www.google.com/search", params=params,
                     impersonate="chrome",
                     proxies={"http": proxy, "https": proxy}, timeout=30)
    if r.status_code == 429 or "/sorry/" in r.url:
        raise RuntimeError("rate-limited - back off and rotate")
    return r.text

for q in queries:
    html = serp(q)
    parse(html)
    time.sleep(random.uniform(2.0, 5.0))   # human-paced gap between queries

تأخیر تصادفی کار واقعی می‌کند: یک sleep(3) ثابت خودش یک اثرانگشت است. متغیرش کنید و کوئری‌ها را روی خروجی‌ها پخش کنید تا هرکدام زیر آستانه‌ی به‌ازای IP گوگل بماند.

نشست‌های چسبنده و موقعیت جغرافیایی

نتایج محلی‌شده (رتبه‌بندی، زبان، ارز) به موقعیت خروجی بستگی دارند، پس پروکسی را در جغرافیای موردنظر انتخاب کنید و برای یک کوئری چندصفحه‌ای یک نشست چسبنده نگه دارید تا همه‌ی صفحات یک جستجو از یک جا بیایند. مخلوط‌کردن خروجی‌ها وسط کوئری، نتایجی دوخته از محلی‌های مختلف می‌دهد — برای ردیابی رتبه بی‌فایده.

اثرانگشت را فراموش نکنید

Google handshake TLS شما را هم می‌خواند. یک فراخوان ساده‌ی requests یک JA3 می‌فرستد که فریاد می‌زند پایتون، و این به امتیاز IP اضافه می‌شود. با curl_cffi (بالا) یا مرورگر واقعی اثرانگشت مرورگر بفرستید — دور زدن فینگرپرینتینگ TLS با curl_cffi را ببینید. اگر Google با دیوار رضایت JS گیت کرد، به موتور مرورگر واقعی ارتقا دهید، مثل راهنمای Turnstile — همان منطق «به JS runtime نیاز است».

بلاک را با ظرافت مدیریت کنید

چک‌لیست

برای همه محصولات IP · هزاران نود همیشه در دسترس

همین حالا ثبت‌نام کنید و تا ۱۰۰٪ کش‌بک شارژ بگیرید

کاربران جدید با ثبت‌نام 500MB هدیه می‌گیرند، به‌علاوه بونوس اولین شارژ. پیشنهاد محدود.