Google คือเป้าหมายกระแสหลักที่ scrape ยากที่สุด และเหตุผลก็เรียบง่าย: มันเห็น traffic มากกว่าใคร ดังนั้นมันจึงมีโมเดลที่สมบูรณ์ที่สุดว่าผู้ค้นหาตัวจริงมีหน้าตาอย่างไร ยิงมันจาก IP ดาต้าเซ็นเตอร์ที่ปริมาณใด ๆ แล้วคุณจะได้ 429 หน้า "sorry/index" หรือ soft block ที่ผลลัพธ์ค่อย ๆ บางลงอย่างเงียบ ๆ คู่มือนี้ครอบคลุมสิ่งที่กระตุ้นการบล็อกของ Google จริง ๆ และกลยุทธ์ proxy กับ rate-limit ที่ทำให้ SERP scraper อยู่รอดในปี 2026
Google ไม่พึ่งสัญญาณเดียว — มันซ้อนหลายสัญญาณและแบนเมื่อคะแนนรวมข้ามเส้น:
สำหรับเป้าหมายส่วนใหญ่ คุณรอดได้ด้วย IP ดาต้าเซ็นเตอร์บนข้อมูลสาธารณะ Google คือข้อยกเว้น: การให้คะแนนชื่อเสียง ASN ของมันก้าวร้าวพอที่ datacenter proxy จะถูก throttle แทบจะทันที Exit residential — ASN ของผู้บริโภคจริง ๆ — คือสิ่งที่ทำให้ SERP scraper ทำปริมาณได้ต่อเนื่อง สำรอง datacenter ไว้สำหรับทุกอย่างที่เหลือ และใช้งบ residential ในที่ที่มันสร้างความแตกต่างจริง ๆ
การหมุนเปลี่ยนกระจายภาระเพื่อไม่ให้ IP เดียวดูเหมือนบอท แต่วินัยที่ทำให้คุณอยู่รอดคืออัตราต่อ exit ไม่ใช่แค่ขนาดพูล proxy พันตัวก็ยังถูกแบนหากคุณยิงทั้งหมดเต็มที่ ให้กำหนดจังหวะแต่ละ exit เหมือนคน:
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) แบบตายตัวก็คือลายนิ้วมือในตัวมันเอง ให้แปรเปลี่ยนมัน และกระจาย query ข้าม exit เพื่อให้แต่ละตัวอยู่ใต้เกณฑ์ต่อ IP ของ Google
ผลลัพธ์ที่ถูกปรับให้เป็นท้องถิ่น (อันดับ ภาษา สกุลเงิน) ขึ้นอยู่กับตำแหน่งของ exit ดังนั้นให้เลือก proxy ในภูมิศาสตร์ที่คุณต้องการวัด และคงเซสชัน stickyไว้สำหรับ query หลายหน้า เพื่อให้ทุกหน้าของการค้นหาหนึ่งครั้งมาจากที่เดียวกัน การผสม exit กลางคันทำให้คุณได้ผลลัพธ์ที่เย็บมาจากหลายโลแคล — ไร้ประโยชน์สำหรับการติดตามอันดับ
Google อ่านการจับมือ TLS ของคุณด้วย การเรียก requests ธรรมดาส่ง JA3 ที่ตะโกนว่า Python ซึ่งซ้ำเติมคะแนน IP ส่งลายนิ้วมือเบราว์เซอร์จริงด้วย curl_cffi (ใช้ด้านบน) หรือเบราว์เซอร์จริง — ดูBypass TLS Fingerprinting ด้วย curl_cffi หาก Google เริ่มกั้นด้วยกำแพง consent ของ JS ให้ยกระดับไปใช้เอนจินเบราว์เซอร์จริงตามที่ครอบคลุมในคู่มือ Turnstile — ตรรกะ "ต้องการ JS runtime" เดียวกันใช้ได้
/sorry/ — หยุดยิง exit นั้น หมุนเปลี่ยน และถอยแบบ exponential การกระหน่ำ IP ที่ถูกตั้งธงยืดเวลาแบนออกไป/sorry/ แทนที่จะลองใหม่จนเข้าสู่การแบนที่ยาวกว่าเดิมผู้ใช้ใหม่รับ 500MB เมื่อสมัครสมาชิก พร้อมโบนัสในการเติมเงินครั้งแรก ข้อเสนอมีระยะเวลาจำกัด