Ang Google ang pinakamahirap na mainstream na target na i-scrape, at simple ang dahilan: nakikita nito ang mas maraming traffic kaysa kaninuman, kaya may pinakamayamang modelo ito kung ano ang hitsura ng isang totoong searcher. Tamaan ito mula sa datacenter IP sa anumang volume at makakakuha ka ng 429, isang "sorry/index" na page, o isang soft block kung saan tahimik na nanipis ang results. Sinasaklaw ng gabay na ito kung ano talaga ang nag-tritrigger ng mga block ng Google at ang proxy at rate-limit strategy na pinapanatiling buhay ang isang SERP scraper sa 2026.
Hindi umaasa ang Google sa isang signal — nagpapatong ito ng ilan at nagba-ban kapag tumawid sa linya ang pinagsamang score:
Para sa karamihan ng target ay makakaalpas ka gamit ang datacenter IPs sa public data. Ang Google ang exception: ang ASN reputation scoring nito ay sapat na agresibo para halos agad na ma-throttle ang datacenter proxies. Ang residential exits — totoong consumer ASNs — ang nagbibigay-daan sa isang SERP scraper na magpanatili ng volume. Ireserba ang datacenter para sa lahat ng iba pa at gugulin ang residential budget kung saan ito talaga gumagana.
Ang rotation ay namamahagi ng load kaya walang iisang IP na mukhang bot, pero ang disiplinang nagpapanatili sa iyong buhay ay ang per-exit rate, hindi lang ang laki ng pool. Isang libong proxy ay mababban pa rin kung pasasabugin mo silang lahat nang sabay-sabay. Bagalan ang bawat exit na parang tao:
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
Ang randomized delay ay gumagawa ng tunay na trabaho: ang isang nakapirming sleep(3) ay isa nang fingerprint. Pag-iba-ibahin ito, at ikalat ang mga query sa mga exit kaya ang bawat isa ay nananatili sa ilalim ng per-IP threshold ng Google.
Ang localized results (rankings, language, currency) ay nakadepende sa lokasyon ng exit, kaya pumili ng mga proxy sa geography na gusto mong sukatin at humawak ng isang sticky session para sa isang multi-page query kaya lahat ng pages ng isang search ay galing sa iisang lugar. Ang paghahalo ng exits sa gitna ng query ay nagbibigay sa iyo ng results na pinagtagpi mula sa magkaibang locale — walang silbi para sa rank tracking.
Binabasa rin ng Google ang TLS handshake mo. Ang isang simpleng requests call ay nagpapadala ng JA3 na sumisigaw ng Python, na nagpapalala sa IP score. Magpadala ng totoong browser fingerprint gamit ang curl_cffi (ginamit sa itaas) o isang totoong browser — tingnan ang Bypass TLS Fingerprinting with curl_cffi. Kung magsimula ang Google na mag-gate sa isang JS consent wall, mag-escalate sa isang totoong browser engine tulad ng tinalakay sa gabay sa Turnstile — ang parehong "kailangan ng JS runtime" na lohika ang umiiral.
/sorry/ — ihinto ang pagtama sa exit na iyon, umikot, at mag-back off nang exponential. Ang pagpapahirap sa naka-flag na IP ay nagpapahaba ng ban./sorry/ sa halip na muling tumama papasok sa mas mahabang ban.Ang mga bagong user ay makakatanggap ng 500MB sa pagrehistro, kasama ang bonus sa unang recharge. Limitadong oras lang ang alok.