Зачем сравнивать парсинг Google и Bing?
Хотя Google доминирует в поиске с более чем 90% рыночной долей глобально, Bing занимает значительную долю на конкретных рынках: примерно 9% в США, выше среди корпоративных пользователей, и он обеспечивает результаты поиска для DuckDuckGo, Yahoo и Ecosia. Для комплексного SERP-мониторинга отслеживание обоих поисковиков даёт более полную картину органической видимости.
Технические различия между парсингом Google и Bing существенны. Каждый поисковик имеет разные HTML-структуры, антибот-защиты, ограничения скорости и требования к прокси. Это руководство разбирает эти различия, чтобы вы могли создать парсеры, надёжно работающие для обоих.
Основы парсинга SERP описаны в нашем руководстве по парсингу SERP с прокси.
Сравнение антибот-защиты
Главное различие между парсингом Google и Bing — насколько агрессивно каждый поисковик обнаруживает и блокирует автоматические запросы.
| Метод обнаружения | Bing | |
|---|---|---|
| Ограничение по IP | Очень агрессивное — блокирует после ~10-20 запросов/час на IP | Умеренное — допускает ~30-50 запросов/час на IP |
| CAPTCHA | Частые reCAPTCHA на подозрительных IP | Реже, используются более простые вызовы |
| Обнаружение серверных IP | Активно блокирует известные серверные диапазоны | Менее строгое — серверные прокси часто работают |
| Отпечаток браузера | Продвинутый TLS/JS-фингерпринтинг | Базовая проверка заголовков и User-Agent |
| Поведенческий анализ | Сложное обнаружение паттернов | Менее сложное |
| Контроль cookies | Отслеживает и проверяет cookies | Меньше зависит от поведения cookies |
Ключевой вывод: Bing значительно проще парсить, чем Google. Для Bing при умеренных объёмах часто достаточно серверных прокси, тогда как Google почти всегда требует резидентских прокси.
Различия HTML-структуры
Google и Bing используют совершенно разные HTML-структуры для результатов поиска, требуя отдельной логики парсинга.
Структура SERP Google
# 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
Структура SERP Bing
# 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-фич
Оба поисковика показывают расширенные SERP-фичи помимо стандартных ссылок, но они различаются по формату и частоте:
| Фича | Bing | |
|---|---|---|
| Расширенный сниппет | Частый — div.xpdopen | Реже — div.b_ans |
| Похожие вопросы | Очень часто — div.related-question-pair | Присутствует — div.b_rs |
| Локальная выдача | Карта с 3 результатами — div.VkpGBb | Карта с листингами — div.b_localA |
| Панель знаний | Правый сайдбар — div.kp-wholepage | Правый сайдбар — div.b_entityTP |
| Карусель изображений | Вверху или встроенная — div.ULSxyf | Вверху — div.imgpt |
| Видео-результаты | Формат карусели | Формат сетки — div.b_vidAns |
| Связанные запросы | Внизу — div.s75CSd | Внизу и в сайдбаре — div.b_rs |
Полный парсер для обоих поисковиков
Вот унифицированный парсер на Python, обрабатывающий Google и 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
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');
Сравнение требований к прокси
Стратегия прокси для каждого движка должна различаться в зависимости от уровня обнаружения:
Для Google
- Тип прокси: резидентские прокси необходимы для надёжных результатов
- Ротация: смена IP при каждом запросе
- Скорость: 1-2 запроса в минуту на IP
- Заголовки: полный набор заголовков браузера с Sec-Ch-Ua, Sec-Fetch
- Геотаргетинг: локация прокси должна соответствовать параметрам gl/hl
Для Bing
- Тип прокси: серверные прокси часто достаточны; резидентские для масштаба
- Ротация: можно использовать один IP для 3-5 запросов перед сменой
- Скорость: 3-5 запросов в минуту на IP
- Заголовки: обычно достаточно стандартных User-Agent и Accept
- Геотаргетинг: используйте параметр cc; привязка IP к геолокации менее критична
Резидентские прокси ProxyHat оптимально работают для обоих движков. Для парсинга только Bing при умеренных объёмах могут подойти серверные прокси, но резидентские обеспечивают стабильные результаты для обоих поисковиков без отдельной инфраструктуры. Настройку смотрите в документации.
Сравнение URL-параметров
| Назначение | Параметр Google | Параметр Bing |
|---|---|---|
| Поисковый запрос | q | q |
| Результатов на страницу | num (10-100) | count (1-50) |
| Смещение результатов | start | first |
| Страна | gl | cc |
| Язык | hl | setlang |
| Безопасный поиск | safe | safeSearch |
| Отключение персонализации | pws=0 | Н/Д (менее персонализирован по умолчанию) |
| Переопределение локации | uule | location |
Когда отслеживать оба поисковика
Отслеживание Google и Bing особенно ценно в таких сценариях:
- Корпоративные рынки: Bing имеет более высокую долю среди корпоративных пользователей из-за интеграции с Microsoft Edge и Windows
- Фокус на рынке США: Bing занимает около 9% поискового трафика США — миллионы потенциальных посетителей
- Голосовой поиск: Bing обеспечивает результаты Cortana и некоторых голосовых ассистентов
- Разнообразие алгоритмов: хорошие позиции в Bing часто требуют других стратегий оптимизации
- Трафик DuckDuckGo и Yahoo: оба используют индекс Bing, поэтому позиции в Bing влияют и на эти платформы
Обработка специальных случаев
Региональные домены Bing
В отличие от Google, который использует google.com с параметром gl, Bing имеет доменные зоны для стран:
# 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",
}
Различия пагинации
# 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}
Создание мультидвижкового SERP-трекера с единой прокси-инфраструктурой — наиболее эффективный подход. Резидентские прокси ProxyHat работают с обоими поисковиками через одно подключение, упрощая архитектуру и обеспечивая надёжные результаты.
Подробнее о создании надёжной инфраструктуры парсинга читайте в наших руководствах по использованию прокси в Python, использованию прокси в Node.js и в обзоре лучших прокси для веб-скрапинга. Смотрите решения ProxyHat для SERP-трекинга.






