كيفية استخراج نتائج بحث Google باستخدام البروكسيات

تعلّم كيف تُخرّجُ نظام تخطيط موارد المؤسسة في (غوغل) بإستعمال العملاء المقيمين. (أمثلة رمزية كاملة في (بيتون) و(نودج) و(نذهب لاستخراج النتائج العضوية و(سنيبل) المميزة و(الناس يسألون البيانات أيضاً.

كيفية استخراج نتائج بحث Google باستخدام البروكسيات

لماذا نتائج البحث عن (سراب جوجل)؟

Google processes over 8.5 billion searches per day, making its search motor results pages (SERPs) the most valuable source of competitive intelligence on the web. إن نتائج البحث عن غوغل تعطيك إمكانية الوصول إلى التصنيفات العضوية، والقنابل المميزة، والناس أيضا يسألون الصناديق، والحزم المحلية، والتنسيب المدفوع الأجر - كل ذلك في الوقت الحقيقي.

سواء كنت تبني SERP monitoring pipeline أو القيام ببحث عن كلمة رئيسية واحدة، وصول البرنامج إلى نتائج جوجل يجعلك تسيّر سير العمل الآلي الذي يستغرق ساعات لإكماله يدوياً. وتشمل حالات الاستخدام المشترك ما يلي:

  • تتبع ترتيب كلماتك الرئيسية عبر الأسواق
  • رصد رؤية المنافسين للاستفسارات المستهدفة
  • تحليل توزيع سمات نظام تخطيط الموارد في المؤسسة (الدميات والصور والفيديو)
  • إعداد مجموعات بيانات عن البحوث واستراتيجية المحتوى في المنظمة

Understanding Google SERP Structure

قبل كتابة الخردة، تحتاج إلى فهم التشريح من صفحة نتائج جوجل. A modern SERP can contain over a dozen distinct result types:

Understanding Google SERP Structure
نوع النتيجةCSS/ Data Markerالوصف
النتائج العضويةdiv#search .gنتائج الرابط الأزرق القياسية مع اللقب، URL، والقنبلة
قناص مسموعdiv.xpdopenصندوق الجواب المعروض فوق النتائج العضوية
الناس يسألونdiv.related-question-pairمسائل واسعة النطاق من طراز FAQ
الحزمة المحليةdiv.VkpGBbخريطة تتضمن 3 قوائم تجارية محلية
فريق المعارفdiv.kp-wholepageجانب معلومات الكيان
النتائجdiv.uEierdإعلانات بحث مدفوعة الأجر في القمة والقاع
(جوجل) يُغيّر أسماء الطبقات كثيراً بناء حزمتك مع إختيارات الخريف والاختبار بشكل منتظم للحفاظ على الاستخراج الموثوق به.

تهيئين بيئتك

لتخريد جوجل بشكل موثوق، تحتاج إلى ثلاثة عناصر: عميلة في شركة HTTP، وصلة محترفة، Below are complete examples in Python, Node.js, and Go using ProxyHat proxies.

Python Example

ضعي المعالين أولاً The ProxyHat Python SDK يُبسّطُ التشكيلةَ البديلةَ.

pip install requests beautifulsoup4
import requests
from bs4 import BeautifulSoup
proxy_url = "http://USERNAME:PASSWORD@gate.proxyhat.com:8080"
proxies = {
    "http": proxy_url,
    "https": proxy_url,
}
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
    "Accept-Language": "en-US,en;q=0.9",
}
def scrape_google(query, num_results=10):
    params = {
        "q": query,
        "num": num_results,
        "hl": "en",
        "gl": "us",
    }
    response = requests.get(
        "https://www.google.com/search",
        params=params,
        headers=headers,
        proxies=proxies,
        timeout=15,
    )
    response.raise_for_status()
    soup = BeautifulSoup(response.text, "html.parser")
    results = []
    for g in soup.select("div#search .g"):
        title_el = g.select_one("h3")
        link_el = g.select_one("a")
        snippet_el = g.select_one(".VwiC3b")
        if title_el and link_el:
            results.append({
                "title": title_el.get_text(),
                "url": link_el["href"],
                "snippet": snippet_el.get_text() if snippet_el else "",
            })
    return results
results = scrape_google("best residential proxies 2026")
for i, r in enumerate(results, 1):
    print(f"{i}. {r['title']}\n   {r['url']}\n")

Node.js Example

استخدام ProxyHat Node SDK و Cheerio for parsing:

npm install axios cheerio https-proxy-agent
const axios = require('axios');
const cheerio = require('cheerio');
const { HttpsProxyAgent } = require('https-proxy-agent');
const agent = new HttpsProxyAgent('http://USERNAME:PASSWORD@gate.proxyhat.com:8080');
async function scrapeGoogle(query) {
  const { data } = await axios.get('https://www.google.com/search', {
    params: { q: query, num: 10, hl: 'en', gl: 'us' },
    headers: {
      'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
      'Accept-Language': 'en-US,en;q=0.9',
    },
    httpsAgent: agent,
    timeout: 15000,
  });
  const $ = cheerio.load(data);
  const results = [];
  $('div#search .g').each((i, el) => {
    const title = $(el).find('h3').text();
    const url = $(el).find('a').attr('href');
    const snippet = $(el).find('.VwiC3b').text();
    if (title && url) {
      results.push({ position: i + 1, title, url, snippet });
    }
  });
  return results;
}
scrapeGoogle('best residential proxies 2026').then(console.log);

Go Example

استخدام ProxyHat Go SDK و الثرثرة:

package main
import (
    "fmt"
    "log"
    "net/http"
    "net/url"
    "github.com/PuerkitoBio/goquery"
)
func main() {
    proxyURL, _ := url.Parse("http://USERNAME:PASSWORD@gate.proxyhat.com:8080")
    client := &http.Client{
        Transport: &http.Transport{Proxy: http.ProxyURL(proxyURL)},
    }
    req, _ := http.NewRequest("GET", "https://www.google.com/search?q=best+residential+proxies&num=10&hl=en&gl=us", nil)
    req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36")
    req.Header.Set("Accept-Language", "en-US,en;q=0.9")
    resp, err := client.Do(req)
    if err != nil {
        log.Fatal(err)
    }
    defer resp.Body.Close()
    doc, _ := goquery.NewDocumentFromReader(resp.Body)
    doc.Find("div#search .g").Each(func(i int, s *goquery.Selection) {
        title := s.Find("h3").Text()
        link, _ := s.Find("a").Attr("href")
        fmt.Printf("%d. %s\n   %s\n\n", i+1, title, link)
    })
}

Parsing Different SERP Features

الخردة الكاملة يجب أن تتعامل مع أكثر من النتائج العضوية وها هي أنماط الفرز لأهم سمات نظام تخطيط الموارد في المؤسسة.

قنابل مسموعة

# Python: Extract featured snippet
snippet_box = soup.select_one("div.xpdopen")
if snippet_box:
    featured = {
        "type": "featured_snippet",
        "text": snippet_box.get_text(strip=True),
        "source_url": snippet_box.select_one("a")["href"] if snippet_box.select_one("a") else None,
    }

الناس يسألون

# Python: Extract PAA questions
paa_questions = []
for q in soup.select("div.related-question-pair"):
    question_text = q.select_one("span")
    if question_text:
        paa_questions.append(question_text.get_text(strip=True))

النتائج المحلية

# Python: Extract local pack
local_results = []
for item in soup.select("div.VkpGBb"):
    name = item.select_one(".dbg0pd")
    rating = item.select_one(".yi40Hd")
    local_results.append({
        "name": name.get_text() if name else "",
        "rating": rating.get_text() if rating else "",
    })

Handling Google Blocks and CAPTCHAs

Google actively defends against automated scraping. بدون بنية تحتية محترفة مناسبة ستواجهون بنايات في غضون عشرات الطلبات وتشمل الآليات الدفاعية الرئيسية ما يلي:

  • المعدل الذي يحد من: عدد كبير جدا من الطلبات المقدمة من أحد شركاء التنفيذ
  • التحديات التي تواجه المركز: Google serves reCAPHA when it suspects functioning
  • IP reputation: IP ranges receive more scrutiny than residential IPs
  • بصمات الأصابع المفقودون أو المتضاربون يرفعون الأعلام

وللاطلاع على استراتيجيات تفصيلية لمكافحة الكشف، انظر دليلنا بشأن الخردة من دون أن يتم منعها و كَمْ نُظُم مضادة للدباباتِ تَكتشفُ المحترفين.

الاستراتيجية الموصى بها

المحترفون المقيمون أساسيون لخردة غوغل المستمرة. وكيلات النيابة إتاحة الوصول إلى الملايين من شركاء التنفيذ عبر الحدود 190 موقعامما يُمكّنك من تناوب شركاء التنفيذ آلياً و توجيه طلباتك النصائح الأساسية:

  • تناوب شركاء التنفيذ على كل طلب - لا يعيد أبدا استخدام نفس IP من أجل الاستفسارات المتتالية عن غوغل
  • إضافة تأخيرات عشوائية بين 2 و5 ثوان بين الطلبات
  • تطابق مستعملك مع نسخة مصففة حقيقية
  • المجموعة hl و gl البارامترات المتسقة مع موقعك

الإحالة إلى وثائق الإثبات من أجل تحديد التوثيق وإدارة الدورة.

بناء Scraper للإنتاج

والانتقال من السيناريو إلى خط أنابيب الإنتاج يتطلب منطق إعادة النظر، والناتج المنظم، والرصد. هنا نسخة صلبة من الخردة البيتونية:

import requests
import time
import random
import json
from bs4 import BeautifulSoup
from datetime import datetime
PROXY_URL = "http://USERNAME:PASSWORD@gate.proxyhat.com:8080"
USER_AGENTS = [
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
    "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
]
def scrape_serp(query, location="us", retries=3):
    for attempt in range(retries):
        try:
            headers = {
                "User-Agent": random.choice(USER_AGENTS),
                "Accept-Language": "en-US,en;q=0.9",
                "Accept": "text/html,application/xhtml+xml",
            }
            response = requests.get(
                "https://www.google.com/search",
                params={"q": query, "num": 10, "hl": "en", "gl": location},
                proxies={"http": PROXY_URL, "https": PROXY_URL},
                headers=headers,
                timeout=15,
            )
            if response.status_code == 429:
                wait = (attempt + 1) * 10
                print(f"Rate limited. Waiting {wait}s...")
                time.sleep(wait)
                continue
            response.raise_for_status()
            soup = BeautifulSoup(response.text, "html.parser")
            # Check for CAPTCHA
            if "captcha" in response.text.lower() or soup.select_one("#captcha-form"):
                print(f"CAPTCHA detected. Retrying with new IP...")
                time.sleep(random.uniform(5, 10))
                continue
            return parse_serp(soup, query)
        except requests.RequestException as e:
            print(f"Attempt {attempt + 1} failed: {e}")
            time.sleep(random.uniform(2, 5))
    return None
def parse_serp(soup, query):
    results = {
        "query": query,
        "timestamp": datetime.utcnow().isoformat(),
        "organic": [],
        "featured_snippet": None,
        "paa": [],
    }
    # Organic results
    for i, g in enumerate(soup.select("div#search .g")):
        title_el = g.select_one("h3")
        link_el = g.select_one("a")
        snippet_el = g.select_one(".VwiC3b")
        if title_el and link_el:
            results["organic"].append({
                "position": i + 1,
                "title": title_el.get_text(),
                "url": link_el["href"],
                "snippet": snippet_el.get_text() if snippet_el else "",
            })
    # Featured snippet
    snippet_box = soup.select_one("div.xpdopen")
    if snippet_box:
        results["featured_snippet"] = snippet_box.get_text(strip=True)[:500]
    # People Also Ask
    for q in soup.select("div.related-question-pair span"):
        results["paa"].append(q.get_text(strip=True))
    return results
# Usage: scrape a list of keywords
keywords = ["best residential proxies", "proxy for web scraping", "serp tracking tools"]
all_results = []
for kw in keywords:
    result = scrape_serp(kw)
    if result:
        all_results.append(result)
    time.sleep(random.uniform(3, 7))  # Delay between keywords
# Save to JSON
with open("serp_results.json", "w") as f:
    json.dump(all_results, f, indent=2)

Scaling your SERP Scraper

عند رصد المئات أو الآلاف من الكلمات الرئيسية، فإن الخردة الوحيدة الجاهزة بطيئة للغاية. النظر في نُهج التقليص هذه:

  • الطلبات المتكررة: Use asyncio (Python), worker threads (Node.js), or goroutines (Go) to send multiple requests in parallel
  • بنية قائمة على أساس كوي: إدفع كلمات رئيسية في طابور (Redis, RabbitMQ) ومعالجتها مع عمال متعددين
  • إدارة المجمعات: (بروكسي هات) يتعامل مع التناوب تلقائياً، لكنّ جلسة التخييم تعتمد على احتياجاتك
  • كاميرا النتائج: Cache SERP data to avoid redundant requests for the same query within a time window

للحصول على توجيهات شاملة بشأن بناء نظم الخردة القابلة للتكرار، قراءتنا دليل كامل لأجهزة التخريد الشبكي.

الاعتبارات القانونية والأخلاقية

شروط خدمة (جوجل) تحد من الوصول الآلي When scraping Google SERPs, follow these guidelines:

  • إحترام الحدود وتجنب خوادم جوجل الغامرة
  • Use the data for legitimate business purposes (SEO monitoring, market research)
  • لا تعيد توزيع بيانات نظام تخطيط الموارد في المؤسسة بشكل تجاري دون فهم القوانين المنطبقة
  • النظر في استخدام نظام (جوجل) الرسمي حيث يلبي احتياجاتك
تحقق دائما من قوانينك المحلية فيما يتعلق بتخريد الشبكة وجمع البيانات قبل نشر كشطة نظام التخطيط على نطاق واسع

¿Listo para empezar?

Accede a más de 50M de IPs residenciales en más de 148 países con filtrado impulsado por IA.

Ver preciosProxies residenciales
← Volver al Blog