June 3

Полное руководство по парсингу Yandex для SEO-аналитики

Парсинг результатов поиска Yandex может показаться сложной задачей. Постоянные CAPTCHA, блокировки IP-адресов и сложные антибот-системы легко могут отпугнуть. Но как только вы освоите нужные инструменты и техники, Yandex станет всего лишь ещё одним источником ценных поисковых данных.

Что находится внутри SERP Yandex

По своей сути, страницы результатов поиска (SERP) Yandex не так уж сильно отличаются от Google. Они включают как органические результаты, так и платную рекламу. Например, если вы ищете популярный запрос вроде «iPhone», вы увидите следующее:

  • Платная реклама: Отображается в верхней части страницы, часто помечена как «Реклама» или «Спонсировано». Блок рекламы показывает ключевую информацию о товаре: название, цену и ссылки на Яндекс.Маркет.
  • Органические результаты: Здесь и находится самое ценное. Эти результаты основаны исключительно на релевантности — никакой оплаты. Алгоритм Yandex определяет, какой контент наиболее полезен, и вы можете парсить эти данные для анализа по любым ключевым словам.

Проблема? Yandex активно борется с ботами. CAPTCHA, блокировки IP и антибот-системы — головная боль для каждого парсера. Как обойти эти препятствия? Ответ — в прокси.

Как обойти защиту Yandex

Yandex серьёзно относится к защите от ботов. Но и вы можете быть не менее серьёзны. Используя прокси, вы можете менять IP-адрес, затрудняя обнаружение вашего скрипта.

Шаг 1: Настройка окружения

Перед тем как приступить, убедитесь, что у вас установлен Python и следующие библиотеки. Установите их командой:

pip install requests pandas beautifulsoup4
  • requests — для HTTP-запросов
  • BeautifulSoup — для парсинга HTML
  • pandas — для сохранения данных в CSV

Шаг 2: Настройка прокси и заголовков

Без них вас быстро заблокируют. Пример настройки:

import requests
from bs4 import BeautifulSoup
import pandas as pd

USERNAME = 'PROXY_USERNAME'
PASSWORD = 'PROXY_PASSWORD'

proxies = {
    'http': f'https://{USERNAME}:{PASSWORD}@pr.swiftproxy.net:7777',
    'https': f'https://{USERNAME}:{PASSWORD}@pr.swiftproxy.net:7777'
}

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) Gecko/20100101 Firefox/137.0',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Language': 'en-US,en;q=0.9,ru;q=0.8',
    'Connection': 'keep-alive'
}

Шаг 3: Парсинг данных из Yandex

Теперь отправим запрос к Yandex:

response = requests.get(
    'https://yandex.com/search/?text=what%20is%20web%20scraping',
    proxies=proxies,
    headers=headers
)
response.raise_for_status()

Затем парсим HTML:

soup = BeautifulSoup(response.text, 'html.parser')

Извлекаем заголовки и ссылки:

data = []
for listing in soup.select('li.serp-item_card'):
    title_el = listing.select_one('h2 > span')
    title = title_el.text if title_el else None
    link_el = listing.select_one('.organic__url')
    link = link_el.get('href') if link_el else None

    data.append({'Title': title, 'Link': link})

Шаг 4: Сохраняем результаты

Сохраняем данные в CSV-файл:

df = pd.DataFrame(data)
df.to_csv('yandex_results.csv', index=False)

Полный код парсера

import requests
from bs4 import BeautifulSoup
import pandas as pd

USERNAME = 'PROXY_USERNAME'
PASSWORD = 'PROXY_PASSWORD'

proxies = {
    'http': f'https://{USERNAME}:{PASSWORD}@pr.swiftproxy.net:7777',
    'https': f'https://{USERNAME}:{PASSWORD}@pr.swiftproxy.net:7777'
}

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) Gecko/20100101 Firefox/137.0',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Language': 'en-US,en;q=0.9,ru;q=0.8',
    'Connection': 'keep-alive'
}

response = requests.get(
    'https://yandex.com/search/?text=what%20is%20web%20scraping',
    proxies=proxies,
    headers=headers
)
response.raise_for_status()

soup = BeautifulSoup(response.text, 'html.parser')

data = []
for listing in soup.select('li.serp-item_card'):
    title_el = listing.select_one('h2 > span')
    title = title_el.text if title_el else None
    link_el = listing.select_one('.organic__url')
    link = link_el.get('href') if link_el else None

    data.append({'Title': title, 'Link': link})

df = pd.DataFrame(data)
df.to_csv('yandex_results.csv', index=False)

Масштабирование через API

Для больших объёмов данных лучше использовать API. Он автоматически обрабатывает CAPTCHA, вращает IP и эмулирует поведение браузера.

Шаг 1: Подготовка запроса

payload = {
    'source': 'universal',
    'url': 'https://yandex.com/search/?text=what%20is%20web%20scraping',
}

Шаг 2: Указание инструкций парсинга

payload = {
    'source': 'universal',
    'url': 'https://yandex.com/search/?text=what%20is%20web%20scraping',
    'parse': True,
    'parsing_instructions': {
        'listings': {
            '_fns': [{'_fn': 'css', '_args': ['li.serp-item_card']}],
            '_items': {
                'title': {'_fns': [{'_fn': 'css_one', '_args': ['h2 > span']}, {'_fn': 'element_text'}]},
                'link': {'_fns': [{'_fn': 'xpath_one', '_args': ['.//a[contains(@class, "organic__url")]/@href']}]}
            }
        }
    }
}

Шаг 3: Отправка запроса

response = requests.post(
    'https://realtime.swiftproxy.net/v1/queries',
    auth=('API_USERNAME', 'API_PASSWORD'),
    json=payload
)
response.raise_for_status()

Шаг 4: Сохраняем результат

data = response.json()['results'][0]['content']['listings']
df = pd.DataFrame(data)
df.to_csv('yandex_results_API.csv', index=False)

Заключение

Парсинг Yandex не должен быть трудным. С правильными инструментами — будь то Python-скрипты, прокси или API — вы можете собирать данные в реальном времени и использовать их для анализа. Постройте свой парсер и начните получать нужные SEO-инсайты уже сегодня.