Вход Регистрация
Проверка позиций

Прокси для проверки позиций со страной прямо в ссылке

Поисковики показывают выдачу по региону, поэтому чекеру позиций нужен IP нужной страны на каждую пачку запросов. Resi Core даёт домашний адрес любой из 200+ стран прямо в строке подключения, а безлимитные пакеты с фильтром по стране закрывают большие ядра. Отдельно разобран съём ИИ-ответов Google: они тоже зависят от страны и города.

  • Resi Core: страна в строке
  • новый IP на каждый запрос
  • пакеты для больших ядер
Монитор с растущим графиком позиций на столе
Проверка позиций

Что нужно чекеру позиций и что даёт пакет

Позиции зависят от того, откуда пришёл запрос. Пул должен сначала ответить на этот вопрос.

Что нужно задачеЧто дают тарифы

Адреса из страны, которую вы отслеживаете

Resi Core: страна задаётся в логине; на пакетах колонка страны в CSV-выгрузке

Новый IP на каждую пачку запросов

Resi Core меняет адрес на каждый запрос, в пакетах около трети адресов меняется ежедневно

Хватит параллельных запросов на большое ядро

Потоки на Resi без лимита, на пакетах от 500 до 5 000

Работает с чекером, который у вас уже стоит

Resi по логину и паролю в строке, пакеты по IP; HTTP и SOCKS5 принимают A-Parser, Key Collector и Rank Tracker

Резидентные прокси

Посчитайте трафик под своё ядро

Страница выдачи весит мало, поэтому гигабайт уходит на тысячи запросов. Цена за ГБ падает с объёмом заказа.

Цена резидентных прокси за 1 ГБ в зависимости от объёма заказа
Объём заказаResi CoreResi Prime
от 1 ГБ$0.85$2.29
от 10 ГБэкономия 7%$0.79$2.09
от 50 ГБ$0.72$1.95
от 100 ГБ$0.65$1.75
от 500 ГБ$0.57$1.55
от 1000 ГБ$0.49$1.39

Цены в долларах США за 1 ГБ. Трафик покупается целым числом гигабайт, от 1 ГБ.

Пул

  • 2 млн+ домашних IP в 200+ странах
  • Новый адрес на каждый запрос или один на сессию, пока устройство доступно
  • Почта со своего ящика: 465 и 587 на отправку, IMAP 993 и POP3 995 на приём, порт 25 закрыт
  • До 1000 строк за раз, список обновляется сам каждые N минут
Итого
$19.75
За 1 ГБ
$0.79
Ступень
10–49 ГБ

Экономия 7% ($1.50) против цены от 1 ГБ

Ещё 25 ГБ, и каждый гигабайт выйдет по $0.72

Купить этот объём

Гигабайты можно расходовать 3 месяца с даты покупки, потом остаток списывается.

Про резидентные

Три шага до снятого ядра

Выберите регион

Google.de снимайте через Европу, Яндекс через СНГ, Baidu через Китай. Микс Мира закрывает остальное и даёт самые большие пулы.

Выгрузите по стране

Возьмите CSV-выгрузку и оставьте строки, где колонка страны совпадает с нужным рынком; готовый сборщик сам пишет файл ip:port на страну.

Скормите чекеру

Чекеры позиций принимают файл с прокси или URL. Поставьте обновление раз в 10 минут, и список будет актуальным сам по себе.

Готовый чекер: позиция в выдаче из нужной страны

Задайте DOMAIN и COUNTRY, положите запросы в keywords.txt. Скрипт спрашивает поисковик через прокси этой страны и пишет позицию домена в CSV. Пул сначала прогоните через прокси-чекер.

CSV export link from your dashboard
ISO 3166-1 alpha-2: positions are read from this country
keep proxies with speed >= this value
the domain whose position you track
one keyword per line
{q}=keyword, {cc}=country
keyword;position;proxy is written here
Значения берутся из формы: скопируйте или скачайте готовый файл.
Показать код скрипта
Python 3.8+ · rank.py
#!/usr/bin/env python3
"""Search-position checker for Advanced.name proxies.

Reads the CSV proxy export, keeps one country, then asks a search engine for each
keyword through a proxy from that country and reports where your domain sits in
the results. Standard library only. Edit CONFIG and run: python3 rank.py
"""

# ================================ CONFIG ====================================
CSV_URL = "https://get.advanced.name/YOUR_LIST_ID.csv"  # CSV export link from your dashboard
COUNTRY = "DE"          # ISO 3166-1 alpha-2: positions are read from this country
MIN_SPEED = 3           # keep proxies with speed >= this value
DOMAIN = "example.com"  # the domain whose position you track
KEYWORDS_FILE = "keywords.txt"           # one keyword per line
SEARCH_URL = "https://www.bing.com/search?q={q}&count=50&setlang={cc}"  # {q}=keyword, {cc}=country
OUT_FILE = "positions.csv"               # keyword;position;proxy is written here
TIMEOUT = 20
# ============================================================================

import csv
import io
import re
import sys
import urllib.parse
import urllib.request

COL_IP, COL_PORT, COL_COUNTRY, COL_SPEED = 0, 1, 2, 3
UA = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/124.0 Safari/537.36"
HREF = re.compile(r'href="https?://([^/"]+)', re.I)


def load_proxies():
    raw = urllib.request.urlopen(CSV_URL, timeout=30).read().decode("utf-8", "replace")
    pool = []
    for row in csv.reader(io.StringIO(raw), delimiter=";"):
        if len(row) <= COL_SPEED or not row[COL_PORT].strip().isdigit():
            continue
        if COUNTRY and row[COL_COUNTRY].strip().upper() != COUNTRY.upper():
            continue
        if int(row[COL_SPEED] or 0) < MIN_SPEED:
            continue
        pool.append(row[COL_IP].strip() + ":" + row[COL_PORT].strip())
    return pool


def position(html, domain):
    """First place the domain shows up among the result links, or 0 if absent."""
    rank, seen = 0, set()
    for host in HREF.findall(html):
        host = host.lower()
        if "bing.com" in host or "microsoft.com" in host or host in seen:
            continue
        seen.add(host)
        rank += 1
        if host == domain or host.endswith("." + domain):
            return rank
    return 0


def main():
    proxies = load_proxies()
    if not proxies:
        sys.exit("No proxies for COUNTRY=%r." % COUNTRY)
    with open(KEYWORDS_FILE, encoding="utf-8") as fh:
        keywords = [line.strip() for line in fh if line.strip()]
    print("proxies: %d (%s), keywords: %d" % (len(proxies), COUNTRY, len(keywords)))

    with open(OUT_FILE, "w", encoding="utf-8", newline="") as out:
        writer = csv.writer(out, delimiter=";")
        writer.writerow(["keyword", "position", "proxy"])
        for i, keyword in enumerate(keywords):
            proxy = proxies[i % len(proxies)]
            url = SEARCH_URL.format(q=urllib.parse.quote(keyword), cc=COUNTRY.lower())
            handler = urllib.request.ProxyHandler({"http": "http://" + proxy, "https": "http://" + proxy})
            req = urllib.request.Request(url, headers={"User-Agent": UA, "Accept-Language": COUNTRY.lower()})
            try:
                html = urllib.request.build_opener(handler).open(req, timeout=TIMEOUT).read().decode("utf-8", "replace")
                pos = position(html, DOMAIN.lower())
            except Exception as exc:
                pos = "err: %s" % exc.__class__.__name__
            writer.writerow([keyword, pos, proxy])
            print("%-40s %s" % (keyword[:40], pos))
    print("written %s" % OUT_FILE)


if __name__ == "__main__":
    main()

Скрипт: есть ли ИИ-блок и цитирует ли он ваш домен

Вставьте строку Resi из кабинета, задайте DOMAIN и положите запросы в keywords.txt. Скрипт открывает выдачу в настоящем Chromium через прокси, ждёт, пока догрузится ИИ-блок, и пишет в CSV, есть ли блок, какие домены он цитирует и есть ли среди них ваш. Окно cookie в странах ЕС он закрывает сам, капчу и ошибки прокси отмечает отдельной строкой. Google меняет вёрстку, поэтому подпись блока вынесена в LABELS.

host:port:login:password line from your dashboard
the domain you want to see among the cited sources
one keyword per line
{q}=keyword
interface language of the results page
country of the results, keep it equal to the country in the login
heading text of the AI block, separated by |
cookie banner buttons in EU countries, in the HL language
keyword;ai_block;cited;your_domain is written here
time for the AI block to finish drawing
set False to watch the browser
Значения берутся из формы: скопируйте или скачайте готовый файл.
Показать код скрипта
Python 3.8+ · ai_overview.py
#!/usr/bin/env python3
"""AI Overview tracker for Advanced.name residential proxies.

Opens Google results for every keyword through a Resi Core or Resi Prime line
in a real Chromium, because the AI block is drawn by JavaScript. Records
whether the page shows the AI block and which domains it cites.
Setup: pip install playwright && python -m playwright install chromium
"""

# ================================ CONFIG ====================================
PROXY = "res.advanced.name:9000:USER-type-residential-country-us:PASS"  # host:port:login:password line from your dashboard
DOMAIN = "example.com"  # the domain you want to see among the cited sources
KEYWORDS_FILE = "keywords.txt"  # one keyword per line
SEARCH_URL = "https://www.google.com/search?q={q}&hl={hl}&gl={gl}"  # {q}=keyword
HL = "en"  # interface language of the results page
GL = "us"  # country of the results, keep it equal to the country in the login
LABELS = "AI Overview|AI Mode"  # heading text of the AI block, separated by |
CONSENT = "Reject all|Accept all"  # cookie banner buttons in EU countries, in the HL language
OUT_FILE = "ai_overview.csv"  # keyword;ai_block;cited;your_domain is written here
WAIT_MS = 4000  # time for the AI block to finish drawing
HEADLESS = True  # set False to watch the browser
# ============================================================================

import csv
import sys
import urllib.parse

from playwright.sync_api import sync_playwright

FIND_BLOCK = """(labels) => {
  const heads = [...document.querySelectorAll('h1,h2,h3,div,span')]
    .filter(e => e.children.length === 0 && labels.includes(e.textContent.trim()));
  if (!heads.length) return null;
  let box = heads[0];
  for (let i = 0; i < 8 && box.parentElement; i++) {
    box = box.parentElement;
    const links = [...box.querySelectorAll('a[href^="http"]')];
    if (links.length >= 2 && box.innerText.length > 200) return links.map(a => new URL(a.href).hostname);
  }
  return [];
}"""


def proxy_of(line):
    host, port, user, password = line.strip().split(":", 3)
    return {"server": "http://%s:%s" % (host, port), "username": user, "password": password}


def bare(host):
    host = host.lower()
    return host[4:] if host.startswith("www.") else host


def main():
    keywords = [k.strip() for k in open(KEYWORDS_FILE, encoding="utf-8") if k.strip()]
    labels = [x.strip() for x in LABELS.split("|") if x.strip()]
    consent = [x.strip() for x in CONSENT.split("|") if x.strip()]
    rows = []
    with sync_playwright() as pw:
        browser = pw.chromium.launch(headless=HEADLESS, proxy=proxy_of(PROXY))
        page = browser.new_page(locale=HL)
        for kw in keywords:
            url = SEARCH_URL.format(q=urllib.parse.quote_plus(kw), hl=HL, gl=GL)
            try:
                resp = page.goto(url, wait_until="domcontentloaded", timeout=60000)
                if resp is None or resp.status >= 400:
                    status = "http %s" % (resp.status if resp else "none")
                    print("%-40s %s" % (kw[:40], status), file=sys.stderr)
                    rows.append([kw, status, "", ""])
                    continue
                for name in consent:
                    button = page.get_by_role("button", name=name)
                    if button.count():
                        button.first.click()
                        page.wait_for_load_state("domcontentloaded")
                        break
                if "/sorry/" in page.url:
                    print("%-40s captcha: change the session id in the login" % kw[:40], file=sys.stderr)
                    rows.append([kw, "captcha", "", ""])
                    continue
                page.wait_for_timeout(WAIT_MS)
                hosts = page.evaluate(FIND_BLOCK, labels)
            except Exception as exc:
                print("%-40s error: %s" % (kw[:40], str(exc).splitlines()[0]), file=sys.stderr)
                rows.append([kw, "error", "", ""])
                continue
            if hosts is None:
                print("%-40s no AI block" % kw[:40])
                rows.append([kw, "no", "", ""])
                continue
            cited = sorted({bare(h) for h in hosts if "google." not in h})
            mine = any(h == DOMAIN or h.endswith("." + DOMAIN) for h in cited)
            print("%-40s AI block, %d sources, %s %s" % (kw[:40], len(cited), DOMAIN, "cited" if mine else "not cited"))
            rows.append([kw, "yes", " ".join(cited), "yes" if mine else "no"])
        browser.close()
    with open(OUT_FILE, "w", encoding="utf-8", newline="") as f:
        out = csv.writer(f, delimiter=";")
        out.writerow(["keyword", "ai_block", "cited", "your_domain"])
        out.writerows(rows)
    print("saved", OUT_FILE)


if __name__ == "__main__":
    main()
Настройка

Настройка съёма позиций

A-Parser, Key Collector, Rank Tracker

В A-Parser и Key Collector вставьте список ip:port в поле прокси и задайте интервал так, чтобы один ключ бил в один адрес не чаще раза в сутки. Rank Tracker и похожие десктопные программы читают файл прокси — укажите список, собранный под нужную страну.

Позиции зависят от того, откуда пришёл запрос, поэтому держите отдельный список на рынок: по экземпляру чекера на страну, каждому — адреса только этой страны.

Съём позиций своим кодом

Скрипт выше спрашивает поисковик через прокси страны и записывает место вашего домена. Отправляйте параметры языка и региона поисковика вместе с прокси: адрес задаёт страну, параметры — город.

Пул перед прогоном проверяйте прокси-чекером; для лёгкого ручного теста подойдёт бесплатный список. Разбор региональной выдачи будет в статьях.

ИИ-ответы Google: AI Overviews и AI Mode

Над обычной выдачей Google всё чаще ставит ИИ-блок: короткий ответ со ссылками на источники. Часть кликов уходит туда, поэтому важно знать, попал ли ваш сайт в источники и по каким запросам блока нет вовсе. Блок собирается под местоположение пользователя: по одному запросу Берлин и Мюнхен могут увидеть разные источники.

Обычный парсер выдачи этот блок не видит: Google дорисовывает его JavaScript уже после загрузки страницы. Нужен настоящий браузер, например Chromium через Playwright, и домашний IP нужной страны. Адреса из общих списков на такой выдаче часто получают капчу, поэтому здесь работают Resi Core и Resi Prime.

Для съёма по стране хватит Resi Core с кодом страны в логине. Если клиенту важен город, берите Resi Prime с городом в строке и фиксированной сессией на пачку запросов: тогда вся пачка уйдёт с одного адреса этого города.

Что записывать и как часто

Снимайте ядро раз в сутки или раз в неделю: ИИ-блок меняется медленнее обычных позиций. На каждый запрос пишите дату, страну или город, есть ли блок, какие домены он цитирует и есть ли среди них ваш. Через месяц видно, какие страницы ИИ берёт в ответ, а какие выпали.

Второй скрипт выше пишет ровно эти поля в CSV. Обычные позиции в той же стране снимает первый скрипт, и оба отчёта сходятся по запросам.

На практике

Выдача глазами каждой страны

Четыре настройки, при которых данные о позициях честные

  1. Один ключ с одного IP не чаще раза в сутки; пул достаточно большой, чтобы размазать нагрузку.
  2. Держите списки по странам раздельно: смешанные адреса смешивают выдачу.
  3. Добавляйте параметры языка и локации поисковика; прокси задаёт страну, параметры задают город.
  4. Для быстрой проверки возьмите адреса со страницы бесплатных прокси, для ежедневного съёма переходите на Resi Core или пакет.

Эта задача по странам

Показать все страны
FAQ

Вопросы по этой задаче

Какой регион брать под Google?
Google показывает выдачу по стране пользователя. На Resi Core впишите код страны в логин, и каждый запрос уйдёт с домашнего IP этой страны. На пакетах страну отбирают по колонке CSV-выгрузки: Европа для ЕС, Микс Мира для США и остального мира, СНГ для русскоязычных рынков.
Как отслеживать ИИ-ответы Google?
Через Resi Core или Resi Prime и настоящий браузер: ИИ-блок дорисовывает JavaScript, и обычный HTTP-запрос его не видит. Скрипт на этой странице открывает выдачу в Chromium и пишет, есть ли блок и цитирует ли он ваш домен. Для разных городов берите Resi Prime.
Сколько ключей в сутки?
На Resi Core потоки не ограничены, предел задаёт объём купленного трафика. С 1 000 потоков на пакете №2 чекер снимает десятки тысяч запросов в день, держите один IP на ключ в сутки.
Нужны ли логин и пароль?
На пакетах нет: доступ привязан к IP машины с чекером. Resi Core работает по логину и паролю из строки, белый список ему не нужен.
Как снять выдачу конкретного города?
Параметры локации поисковика задают город при любом прокси. Если выдача зависит от IP, берите Resi Prime: город задаётся в строке подключения.
Тарифы под задачу

Что взять под съём позиций

Выдачу по стране снимайте через Resi Core, выдачу города через Resi Prime, а большие ядра каждый день дешевле гонять на безлимитном пакете.

Resi Core

Выдача по странеЛучший выбор

2 млн+ IP · 200+ стран · потоки без лимита

Домашний IP нужной страны на каждый запрос. Страница выдачи весит мало, поэтому гигабайт уходит на тысячи запросов.

от $0.49 за ГБ1 ГБ за $0.85

Resi Prime

Выдача города

30 млн+ IP · 220 стран · потоки без лимита

Город и регион в строке подключения дают выдачу, которую видит пользователь из этого города.

от $1.39 за ГБ1 ГБ за $2.29

Безлимитные прокси

Большие ядра

Пакет №2 · Микс Мира · 12 000 IP · 1 000 потоков

Десятки тысяч запросов в сутки без счётчика трафика. Страну рынка отбираете по колонке CSV-выгрузки.

$378 в месяцили $2.10 в час

Увидьте реальные позиции уже завтра утром

Возьмите 1 ГБ Resi Core, задайте страну в строке и запустите чекер на живых адресах.

Цены Забрать час теста