Google vs Bing SERPスクレイピング:主な違い

GoogleとBingのSERPスクレイピングの違いを比較。検出メカニズム、必要なプロキシタイプ、結果構造、パース戦略の違いを理解し、各エンジンに最適化したスクレイピングを学びます。

Google vs Bing SERPスクレイピング:主な違い

Why Compare Google and Bing Scraping?

While Google dominates search with over 90% market share globally, Bing holds significant share in specific markets: roughly 9% in the United States, higher among enterprise users, and it powers search results for DuckDuckGo, Yahoo, and Ecosia. For comprehensive SERP monitoring, tracking both search engines gives you a more complete view of your organic visibility.

The technical differences between scraping Google and Bing are substantial. Each search engine has different HTML structures, anti-bot protections, rate limiting, and proxy requirements. This guide breaks down these differences so you can build scrapers that work reliably for both.

For foundational SERP scraping concepts, start with our SERP scraping with proxies guide.

Anti-Bot Protection Comparison

The biggest difference between Google and Bing scraping is how aggressively each search engine detects and blocks automated requests.

Detection MethodGoogleBing
IP rate limitingVery aggressive — blocks after ~10-20 queries/hour per IPModerate — tolerates ~30-50 queries/hour per IP
CAPTCHA challengesFrequent reCAPTCHA on suspicious IPsLess frequent, uses simpler challenges
Datacenter IP detectionActively blocks known datacenter rangesLess strict — datacenter proxies often work
Browser fingerprintingAdvanced TLS/JS fingerprintingBasic header and User-Agent checks
Behavioral analysisSophisticated pattern detectionLess sophisticated
Cookie enforcementTracks and validates cookiesLess reliant on cookie behavior
The key takeaway: Bing is significantly easier to scrape than Google. You can often use datacenter proxies for Bing at moderate volumes, while Google almost always requires residential proxies for reliable results.

HTML Structure Differences

Google and Bing use completely different HTML structures for their search results, requiring separate parsing logic.

Google SERP Structure

# Google organic result selectors
# Container: div#search .g
# Title: h3
# URL: a[href]
# Snippet: .VwiC3b or div[data-snf]
from bs4 import BeautifulSoup
def parse_google(html):
    soup = BeautifulSoup(html, "html.parser")
    results = []
    for g in soup.select("div#search .g"):
        title = g.select_one("h3")
        link = g.select_one("a")
        snippet = g.select_one(".VwiC3b")
        if title and link:
            results.append({
                "title": title.get_text(),
                "url": link["href"],
                "snippet": snippet.get_text() if snippet else "",
            })
    return results

Bing SERP Structure

# Bing organic result selectors
# Container: li.b_algo
# Title: h2 a
# URL: cite
# Snippet: p.b_lineclamp2 or div.b_caption p
def parse_bing(html):
    soup = BeautifulSoup(html, "html.parser")
    results = []
    for item in soup.select("li.b_algo"):
        title_el = item.select_one("h2 a")
        snippet_el = item.select_one("p.b_lineclamp2") or item.select_one("div.b_caption p")
        cite_el = item.select_one("cite")
        if title_el:
            results.append({
                "title": title_el.get_text(),
                "url": title_el["href"],
                "snippet": snippet_el.get_text() if snippet_el else "",
                "display_url": cite_el.get_text() if cite_el else "",
            })
    return results

SERP Feature Comparison

Both search engines display rich SERP features beyond standard blue links, but they differ in format and frequency:

FeatureGoogleBing
Featured snippetCommon — div.xpdopenLess common — div.b_ans
People Also AskVery common — div.related-question-pairPresent as "People also ask" — div.b_rs
Local packMap with 3 results — div.VkpGBbMap with listings — div.b_localA
Knowledge panelRight sidebar — div.kp-wholepageRight sidebar — div.b_entityTP
Image carouselTop or inline — div.ULSxyfTop — div.imgpt
Video resultsCarousel formatGrid format — div.b_vidAns
Related searchesBottom — div.s75CSdBottom and sidebar — div.b_rs

Complete Dual-Engine Scraper

Here is a unified Python scraper that handles both Google and Bing:

import requests
from bs4 import BeautifulSoup
import time
import random
import json
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",
]
def scrape_serp(keyword, engine="google", country="us"):
    """Scrape SERP from Google or Bing."""
    proxies = {"http": PROXY_URL, "https": PROXY_URL}
    headers = {
        "User-Agent": random.choice(USER_AGENTS),
        "Accept-Language": "en-US,en;q=0.9",
        "Accept": "text/html,application/xhtml+xml",
    }
    if engine == "google":
        url = "https://www.google.com/search"
        params = {"q": keyword, "num": 10, "hl": "en", "gl": country}
    else:
        url = "https://www.bing.com/search"
        params = {"q": keyword, "count": 10, "cc": country}
    response = requests.get(
        url,
        params=params,
        headers=headers,
        proxies=proxies,
        timeout=15,
    )
    response.raise_for_status()
    soup = BeautifulSoup(response.text, "html.parser")
    if engine == "google":
        return parse_google_results(soup)
    else:
        return parse_bing_results(soup)
def parse_google_results(soup):
    results = []
    for i, g in enumerate(soup.select("div#search .g"), 1):
        title = g.select_one("h3")
        link = g.select_one("a")
        snippet = g.select_one(".VwiC3b")
        if title and link:
            results.append({
                "position": i,
                "title": title.get_text(),
                "url": link["href"],
                "snippet": snippet.get_text() if snippet else "",
            })
    return results
def parse_bing_results(soup):
    results = []
    for i, item in enumerate(soup.select("li.b_algo"), 1):
        title_el = item.select_one("h2 a")
        snippet_el = item.select_one("p.b_lineclamp2") or item.select_one("div.b_caption p")
        if title_el:
            results.append({
                "position": i,
                "title": title_el.get_text(),
                "url": title_el["href"],
                "snippet": snippet_el.get_text() if snippet_el else "",
            })
    return results
# Compare rankings across both engines
keyword = "best web scraping proxies"
google_results = scrape_serp(keyword, "google")
time.sleep(random.uniform(3, 6))
bing_results = scrape_serp(keyword, "bing")
print(f"\n=== Google Results for '{keyword}' ===")
for r in google_results[:5]:
    print(f"  #{r['position']}: {r['title']}")
print(f"\n=== Bing Results for '{keyword}' ===")
for r in bing_results[:5]:
    print(f"  #{r['position']}: {r['title']}")

Node.js Dual-Engine Scraper

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 scrapeSERP(keyword, engine = 'google') {
  const config = engine === 'google'
    ? { url: 'https://www.google.com/search', params: { q: keyword, num: 10, hl: 'en', gl: 'us' } }
    : { url: 'https://www.bing.com/search', params: { q: keyword, count: 10 } };
  const { data } = await axios.get(config.url, {
    params: config.params,
    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);
  if (engine === 'google') {
    return parseGoogle($);
  }
  return parseBing($);
}
function parseGoogle($) {
  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;
}
function parseBing($) {
  const results = [];
  $('li.b_algo').each((i, el) => {
    const titleEl = $(el).find('h2 a');
    const title = titleEl.text();
    const url = titleEl.attr('href');
    const snippet = $(el).find('p.b_lineclamp2').text() || $(el).find('div.b_caption p').text();
    if (title && url) results.push({ position: i + 1, title, url, snippet });
  });
  return results;
}
async function compareEngines(keyword) {
  const [google, bing] = await Promise.all([
    scrapeSERP(keyword, 'google'),
    scrapeSERP(keyword, 'bing'),
  ]);
  console.log(`\nGoogle (${google.length} results):`);
  google.slice(0, 5).forEach(r => console.log(`  #${r.position}: ${r.title}`));
  console.log(`\nBing (${bing.length} results):`);
  bing.slice(0, 5).forEach(r => console.log(`  #${r.position}: ${r.title}`));
}
compareEngines('residential proxy service');

Proxy Requirements Comparison

The proxy strategy for each engine should differ based on their detection levels:

For Google

  • Proxy type: Residential proxies required for reliable results
  • Rotation: Rotate IP on every request
  • Rate: 1-2 requests per minute per IP
  • Headers: Full browser-like header set with Sec-Ch-Ua, Sec-Fetch headers
  • Geo-targeting: Match proxy location with gl/hl parameters

For Bing

  • Proxy type: Datacenter proxies often sufficient; residential for scale
  • Rotation: Can reuse IPs for 3-5 requests before rotating
  • Rate: 3-5 requests per minute per IP
  • Headers: Standard User-Agent and Accept headers usually sufficient
  • Geo-targeting: Use cc parameter; IP geo-matching less critical

ProxyHat residential proxies work optimally for both engines. For Bing-only scraping at moderate volume, datacenter proxies may suffice, but residential proxies from ProxyHat provide consistent results across both engines without needing separate infrastructure. Refer to the documentation for setup details.

URL Parameter Comparison

PurposeGoogle ParameterBing Parameter
Search queryqq
Results per pagenum (10-100)count (1-50)
Result offsetstartfirst
Countryglcc
Languagehlsetlang
Safe searchsafesafeSearch
Disable personalizationpws=0N/A (less personalized by default)
Location overrideuulelocation

When to Track Both Engines

Tracking both Google and Bing is particularly valuable in these scenarios:

  • Enterprise markets: Bing has higher market share among corporate users due to Microsoft Edge and Windows integration
  • US market focus: Bing holds approximately 9% of US search traffic, representing millions of potential visitors
  • Voice search: Bing powers Cortana and some voice assistant results
  • Algorithm diversity: Ranking well on Bing often requires different optimization strategies than Google
  • DuckDuckGo and Yahoo traffic: Both use Bing's index, so Bing rankings affect these platforms too

Handling Edge Cases

Bing Market-Specific Domains

Unlike Google which uses google.com with gl parameter for all countries, Bing has country-specific domains:

# Bing country-specific URLs
BING_DOMAINS = {
    "us": "https://www.bing.com/search",
    "uk": "https://www.bing.co.uk/search",
    "de": "https://www.bing.de/search",
    "fr": "https://www.bing.fr/search",
    "jp": "https://www.bing.co.jp/search",
}

Different Pagination

# Google pagination: start parameter (0, 10, 20, ...)
google_page_2 = {"q": "query", "start": 10, "num": 10}
# Bing pagination: first parameter (1, 11, 21, ...)
bing_page_2 = {"q": "query", "first": 11, "count": 10}
Building a multi-engine SERP tracker with a unified proxy infrastructure is the most efficient approach. ProxyHat residential proxies handle both Google and Bing with the same connection, simplifying your architecture while ensuring reliable results from both engines.

For more on building robust scraping infrastructure, see our guides on using proxies in Python, using proxies in Node.js, and our best proxies for web scraping overview. Check ProxyHat SERP tracking solutions for tailored configurations.

始める準備はできましたか?

AIフィルタリングで148か国以上、5,000万以上のレジデンシャルIPにアクセス。

料金を見るレジデンシャルプロキシ
← ブログに戻る