Bölgeyi seçin
Google.de'yi Avrupa üzerinden, Yandex'i BDT üzerinden, Baidu'yu Çin üzerinden takip edin. World MIX geri kalanı kapsar ve en büyük havuzlara sahiptir.
Arama motorları sonuçları bölgeye göre gösterir, bu yüzden bir sıralama kontrolcüsü her sorgu grubu için doğru ülkeden bir IP'ye ihtiyaç duyar. Resi Core, 200'den fazla ülkeden herhangi birinde ev adresini doğrudan bağlantı dizesinde verir; ülke filtreli sınırsız paketler ise büyük anahtar kelime listelerini karşılar. Ayrı bir bölüm, yine ülkeye ve şehre bağlı olan Google yapay zekâ yanıtlarının takibini anlatır.
Sıralama, sorgunun nereden geldiğine bağlıdır. Havuz önce bu soruyu yanıtlamalı.
Takip ettiğiniz ülkeden adresler
Resi Core: ülke kullanıcı adına yazılır; paketlerde CSV dışa aktarımında bir ülke sütunu
Her sorgu grubu için yeni bir IP
Resi Core adresi her istekte değiştirir, paketler adreslerin yaklaşık üçte birini her gün yeniler
Büyük bir anahtar kelime listesi için yeterli paralel sorgu
Resi'de thread sınırı yok, paketlerde 500 ila 5000 thread
Zaten kullandığınız denetleyiciyle çalışır
Resi dizede kullanıcı adı ve şifreyle, paketler IP ile; A-Parser, Key Collector ve Rank Tracker HTTP ve SOCKS5 kabul eder
Bir sonuç sayfası az tutar, bu yüzden bir gigabayt binlerce sorguya yeter. GB başına fiyat sipariş büyüdükçe düşer.
| Sipariş büyüklüğü | Resi Core | Resi Prime |
|---|---|---|
| 1 GB+ | $0.85 | $2.29 |
| 10 GB+%7 tasarruf | $0.79 | $2.09 |
| 50 GB+ | $0.72 | $1.95 |
| 100 GB+ | $0.65 | $1.75 |
| 500 GB+ | $0.57 | $1.55 |
| 1000 GB+ | $0.49 | $1.39 |
Fiyatlar 1 GB başına ABD doları cinsindendir. Tam gigabayt satın alırsınız, birden başlayarak.
Havuz
1 GB+ fiyatına göre %7 ($1.50) tasarruf edersiniz
25 GB ekleyin, her gigabayt $0.72 fiyatına iner
Bu miktarı satın alGigabaytları satın alma tarihinden itibaren 3 ay kullanabilirsiniz; sonrasında kalan kısım silinir.
Google.de'yi Avrupa üzerinden, Yandex'i BDT üzerinden, Baidu'yu Çin üzerinden takip edin. World MIX geri kalanı kapsar ve en büyük havuzlara sahiptir.
CSV dışa aktarımı alın ve ülke sütunu takip ettiğiniz pazarla eşleşen satırları tutun; hazır oluşturucu her ülke için ayrı bir ip:port dosyası yazar.
Sıralama denetleyicileri bir proxy dosyası ya da URL alır. Yenilemeyi 10 dakikaya ayarlayın, liste kendiliğinden güncel kalsın.
DOMAIN ve COUNTRY değerlerini girin, anahtar kelimelerinizi keywords.txt dosyasına koyun. Betik arama motorunu o ülkenin proxy'si üzerinden sorgular ve alan adınızın sırasını bir CSV'ye yazar. Ona proxy denetleyicisinden geçmiş temiz bir havuz verin.
#!/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()
Panelinizden bir Resi satırı yapıştırın, DOMAIN'i ayarlayın ve anahtar kelimeleri keywords.txt dosyasına koyun. Betik sonuçları proxy üzerinden gerçek bir Chromium'da açar, yapay zekâ bloğunun yüklenmesini bekler ve bloğun olup olmadığını, hangi alan adlarını kaynak gösterdiğini ve sizinkinin aralarında olup olmadığını CSV'ye yazar. AB çerez bannerını kendisi kapatır, captcha'yı veya proxy hatasını ayrı bir satırda işaretler. Google işaretlemesini değiştirir, bu yüzden blok başlığı LABELS içinde durur.
#!/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 ve Key Collector'da ip:port listesini proxy alanına yapıştırın ve kontrol aralığını bir anahtar kelime bir adrese günde en fazla bir kez düşecek şekilde ayarlayın. Rank Tracker ve benzeri masaüstü araçlar bir proxy dosyası okur; onları oluşturucunun ülke başına yazdığı listeye yönlendirin.
Sıralama sorgunun nereden geldiğine bağlıdır, bu yüzden her pazar için ayrı liste tutun: ülke başına bir izleyici örneği ve her birine yalnızca o ülkenin adresleri.
Yukarıdaki betik arama motorunu ülke proxy'si üzerinden sorgular ve alan adınızın yerini kaydeder. Motorun dil ve bölge parametrelerini proxy ile birlikte gönderin: adres ülkeyi, parametreler şehri belirler.
Her çalıştırmadan önce havuzu proxy denetleyicisi ile kontrol edin; hafif bir elle test için ücretsiz proxy listesi işe yarar. Bölgesel arama sonuçları üzerine bir giriş yazısı makalelerde yer alacak.
Google giderek daha sık normal sonuçların üstüne bir yapay zekâ bloğu koyuyor: kaynak bağlantılı kısa bir yanıt. Tıklamaların bir kısmı oraya gider, bu yüzden sitenizin kaynaklara girip girmediğini ve hangi sorgularda bloğun hiç çıkmadığını bilmeniz gerekir. Blok kullanıcının konumuna göre oluşturulur: aynı sorgu için Berlin ve Münih farklı kaynaklar görebilir.
Normal bir sonuç scraper'ı bu bloğu asla görmez: Google onu sayfa yüklendikten sonra JavaScript ile çizer. Gerçek bir tarayıcıya, örneğin Playwright ile Chromium'a, ve doğru ülkeden bir ev IP'sine ihtiyacınız var. Liste adresleri bu sonuçlarda sık sık captcha'ya takılır, bu yüzden burada işi Resi Core ve Resi Prime yapar.
Ülke düzeyinde takip için kullanıcı adında ülke kodu olan Resi Core yeterlidir. Müşteri bir şehri önemsiyorsa dizede şehir olan Resi Prime'ı ve her sorgu grubu için sabit bir oturumu alın: tüm grup o şehirdeki tek bir adresten çıkar.
Anahtar kelime listesini günde veya haftada bir çalıştırın: yapay zekâ bloğu normal pozisyonlardan daha yavaş değişir. Her sorgu için tarihi, ülkeyi veya şehri, bloğun olup olmadığını, hangi alan adlarını kaynak gösterdiğini ve sizinkinin aralarında olup olmadığını yazın. Bir ay sonra yapay zekânın yanıtına hangi sayfaları aldığını ve hangilerinin düştüğünü görürsünüz.
Yukarıdaki ikinci betik tam olarak bu alanları CSV'ye yazar. İlk betik aynı ülkedeki normal pozisyonları takip eder, böylece iki rapor sorguya göre örtüşür.

Ülke sonuçlarını Resi Core ile, şehir sonuçlarını Resi Prime ile takip edin; büyük anahtar kelime listelerini her gün sınırsız bir paketle daha ucuza çalıştırın.
Ülke sonuçlarıEn uygun seçim
Her istekte doğru ülkeden bir ev IP'si. Bir sonuç sayfası az tutar, bu yüzden bir gigabayt binlerce sorguya yeter.
başlangıç $0.49 GB başına1 GB: $0.85
Şehir sonuçları
Bağlantı dizesindeki şehir ve bölge, o şehirdeki bir kullanıcının gördüğü sonuçları verir.
başlangıç $1.39 GB başına1 GB: $2.29
Büyük anahtar kelime listeleri
Trafik sayacı olmadan günde on binlerce sorgu. Pazar ülkesini CSV dışa aktarımındaki sütuna göre seçersiniz.
$378 aylıkveya saatlik $2.10
1 GB Resi Core alın, ülkeyi dizede ayarlayın ve checker'ı canlı adreslerde çalıştırın.