প্রক্সি দিয়ে Google সার্চ ফলাফল স্ক্র্যাপিং (SERP, ২০২৬)

12 জুন 2026 প্রকাশিত · ≈9 মিনিট পড়া

Google হলো স্ক্র্যাপ করার সবচেয়ে কঠিন মূলধারার টার্গেট, আর কারণটি সহজ: এটি যে কারো চেয়ে বেশি ট্রাফিক দেখে, তাই একজন আসল অনুসন্ধানকারী দেখতে কেমন তার সবচেয়ে সমৃদ্ধ মডেল এর কাছে আছে। যেকোনো ভলিউমে একটি datacenter IP থেকে এটিকে আঘাত করুন এবং আপনি একটি 429, একটি "sorry/index" পেজ, অথবা একটি সফট ব্লক পাবেন যেখানে ফলাফল নীরবে পাতলা হয়ে যায়। এই গাইড আসলে কী Google-এর ব্লক ট্রিগার করে এবং কোন প্রক্সি ও রেট-লিমিট কৌশল ২০২৬ সালে একটি SERP স্ক্র্যাপারকে বাঁচিয়ে রাখে তা কভার করে।

কী একটি Google ব্লক ট্রিগার করে

Google একটি সিগন্যালের উপর নির্ভর করে না — এটি কয়েকটি স্তূপীকৃত করে এবং সম্মিলিত স্কোর একটি রেখা অতিক্রম করলে ব্যান করে:

এখানে Residential আপসহীন

বেশির ভাগ টার্গেটের জন্য আপনি সর্বজনীন ডেটায় datacenter IP দিয়ে পার পেয়ে যেতে পারেন। Google ব্যতিক্রম: এর ASN রেপুটেশন স্কোরিং যথেষ্ট আক্রমণাত্মক যে datacenter প্রক্সি প্রায় তাৎক্ষণিকভাবে থ্রটল হয়। Residential exit — আসল ভোক্তা ASN — সেগুলোই একটি SERP স্ক্র্যাপারকে ভলিউম বজায় রাখতে দেয়। বাকি সবকিছুর জন্য datacenter রিজার্ভ রাখুন এবং residential বাজেট সেখানে খরচ করুন যেখানে এটি আসলে কাজে লাগে।

ঘোরান, কিন্তু প্রতি Exit-এ রেট-লিমিট করুন

রোটেশন লোড ছড়িয়ে দেয় যাতে কোনো একক IP বটের মতো না দেখায়, কিন্তু যে শৃঙ্খলা আপনাকে বাঁচিয়ে রাখে তা হলো প্রতি-exit হার, শুধু পুলের আকার নয়। হাজার প্রক্সিও ব্যান হয় যদি আপনি সবগুলোকে একসাথে পুরোদমে ছোড়েন। প্রতিটি 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) নিজেই একটি fingerprint। এটিকে বৈচিত্র্যময় করুন, এবং exit জুড়ে কোয়েরি ছড়িয়ে দিন যাতে প্রতিটি Google-এর প্রতি-IP থ্রেশহোল্ডের নিচে থাকে।

Sticky Session ও Geolocation

স্থানীয়কৃত ফলাফল (র‍্যাঙ্কিং, ভাষা, মুদ্রা) exit-এর অবস্থানের উপর নির্ভর করে, তাই আপনি যে ভূগোল পরিমাপ করতে চান সেখানে প্রক্সি বেছে নিন এবং একটি মাল্টি-পেজ কোয়েরির জন্য একটি sticky session ধরে রাখুন যাতে একটি অনুসন্ধানের সব পেজ একই জায়গা থেকে আসে। কোয়েরির মাঝখানে exit মেশানো আপনাকে ভিন্ন লোকেল থেকে সেলাই করা ফলাফল দেয় — র‍্যাঙ্ক ট্র্যাকিংয়ের জন্য অকেজো।

Fingerprint ভুলবেন না

Google আপনার TLS handshake-ও পড়ে। একটি সাধারণ requests কল একটি JA3 পাঠায় যা চিৎকার করে Python বলে, যা IP স্কোরকে আরও জটিল করে। curl_cffi (উপরে ব্যবহৃত) দিয়ে একটি আসল ব্রাউজার fingerprint পাঠান অথবা একটি আসল ব্রাউজার — দেখুন curl_cffi দিয়ে TLS Fingerprinting Bypass। Google যদি একটি JS consent দেয়ালে গেট করা শুরু করে, একটি আসল ব্রাউজার ইঞ্জিনে উন্নীত হোন যেমনটি Turnstile গাইডে কভার করা হয়েছে — একই "একটি JS রানটাইম প্রয়োজন" যুক্তি প্রযোজ্য।

ব্লক সুন্দরভাবে সামলান

চেকলিস্ট

সকল IP পণ্যের জন্য · যেকোনো সময় উপলব্ধ বিশাল নোড পুল

এখনই নিবন্ধন করুন এবং আপনার রিচার্জে ১০০% পর্যন্ত ফেরত পান

নতুন ব্যবহারকারীরা নিবন্ধনের সময় 500MB পান, সাথে প্রথম রিচার্জে বোনাস। সীমিত সময়ের অফার।