Yandex Haritalar için Kendi Web Kazıyıcınızı Yapın: Bloklanmadan İşletmeleri, Yorumları ve Telefonları Toplayın
Makale içeriği
- Giriş: ne elde edeceksiniz ve bu rehber kimlere hitap ediyor?
- Ön hazırlık: araçlar, erişimler ve gereksinimler
- Temel kavramlar: haritalar nasıl çalışır ve kart kazıma nedir?
- Adım 1: ortamı hazırlıyoruz ve mobil proxy'yi bağlıyoruz
- Adım 2: i̇şletme kartlarının bağlantılarını topluyoruz
- Adım 3: i̇şletme kartını kazıyoruz — isim, adres, telefon, site
- Adım 4: kartlardan yorumları topluyoruz
- Adım 5: ip rotasyonunu ve blok korumasını ayarlıyoruz
- Adım 6: verileri temizleyip excel'e kaydediyoruz
- Sonuç kontrolü: hazır kazıyıcının kontrol listesi
- Sık yapılan hatalar ve çözümleri
- İ̇leri düzey kullanıcılar i̇çin ek olanakla
- Sss: yandex haritalar kazıma hakkında sık sorulan sorular
- Sonuç
Giriş: Ne elde edeceksiniz ve bu rehber kimlere hitap ediyor?
Yandex Haritalar uzun süredir bir navigasyon aracı olmaktan çıkıp Rusya'nın en kapsamlı işletme kataloğuna dönüştü. İşletme kartlarında her pazarlamacının, arbitrajcının ya da işletme sahibinin ihtiyaç duyduğu her şey var: tam adresler, telefonlar, web siteleri, çalışma saatleri, puanlar ve binlerce gerçek müşteri yorumu. Sorun şu ki, bir şehirdeki beş yüz diş kliniği kartını elle dolaşmak imkânsız, hazır servisler ise ya pahalı ya da güncelliğini yitirmiş veriler sunuyor.
Bu rehberde birlikte Python ile kendi Yandex Haritalar kazıyıcımızı yazacağız. Ücretli program yok, başkasının sunucusu yok. Rehberin sonunda elinizde şunlar olacak:
- Herhangi bir sorgu ve şehir için işletme kartlarını toplayan çalışan bir betik.
- İsim, kategori, adres, telefon, web sitesi, puan ve çalışma saatlerini içeren bir Excel tablosu.
- Yorumlar için ayrı bir tablo: yazar, puan, tarih, metin.
- Mobil proxy'ler üzerinden yükü dağıtarak captcha ve bloklardan nasıl kaçınacağınızı anlama.
Bu makalenin önemli sınırı: Biz tam olarak Haritalar içindeki işletme kartlarını ele alıyoruz. Yandex'in normal arama sonuçlarını kazıma, anti-detect tarayıcılarla çalışma ve mobil proxy'lerin temel kurulumu blogun diğer yazılarında anlatıldı; burada onları tekrar etmiyor, sadece üzerine inşa ediyoruz.
Bu rehber kimler için?
- Pazarlamacılar ve işletme sahipleri — bölgedeki rakiplerin veya iş ortaklarının gerçek telefon ve puanlarına ihtiyaç duyanlar.
- Arbitrajcılar — çevrimdışı nişleri ve yerel teklifleri toplayıp analiz edenler.
- Geliştiriciler — kendilerine Haritalar'dan veri toplama görevi verilen ve sıfırdan başlamak istemeyenler.
- Analistler — bir nişteki hizmet kalitesini değerlendirmek için yorumları inceleyenler.
Önceden bilmeniz gerekenler
Karmaşık bir şey yok. Program kurmayı, komut satırını açmayı ve metin kopyalamayı bilmeniz yeterli. Programlama deneyimi şart değil: tüm kod hazır, sadece kendi değerlerinizi yerleştirmeniz gerekiyor. Daha önce bir kez Python betiği çalıştırdıysanız işiniz çok kolay. İleri düzey bölümünde asenkron çalışma ve ağ yanıtlarına değineceğiz, ama o kısmı atlayabilirsiniz.
Ne kadar zaman gerekir?
- Ortam hazırlığı: 30-40 dakika.
- Kazıyıcıyı adım adım yazma ve hata ayıklama: 1,5-2 saat.
- 300-500 kart için ilk tam toplama: Siz başka işlerle ilgilenirken 1-3 saat arka plan süresi.
Yani bir iş gününün yarısında, size haftalarca elle emek tasarrufu sağlayacak bir araç elde ediyorsunuz.
Ön Hazırlık: Araçlar, erişimler ve gereksinimler
Kod yazmaya başlamadan önce gereken her şeyi toplayalım. Python zaten kuruluysa ve mobil proxy erişiminiz varsa bu bölümü atlayın.
Sistem gereksinimleri
- Windows 10 veya 11, macOS 12 ve üzeri ya da herhangi bir modern Linux.
- En az 8 GB RAM: Gerçek bir Chromium tarayıcısı çalıştıracağız.
- Python, tarayıcı ve sonuçlar için 3-4 GB boş disk alanı.
- Sabit internet. Hız kritik değil, kesinti olmaması daha önemli.
Kurulması gerekenler
- Python 3.11 veya 3.12. Kurulum dosyasını python.org'un resmi sitesinden indirin. Windows'ta kurulum sırasında ilk pencerenin altındaki Add Python to PATH kutusunu mutlaka işaretleyin, aksi halde konsoldaki komutlar çalışmaz.
- Kod editörü. Visual Studio Code, PyCharm Community hatta Notepad++ bile olur. Biz VS Code'u baz alacağız, ama görevlerimiz için fark etmez.
- Python kütüphaneleri: Tarayıcı yönetimi için playwright, tablolar için pandas ve openpyxl, proxy kontrolü için requests. Bunları ilk adımda kuracağız.
- Playwright için Chromium tarayıcısı. Ayrı bir komutla indirilir, yaklaşık 150 MB.
Mobil proxy erişimi
Bu, «ban yok» bölümünün kilit unsurudur. Yandex Haritalar aynı adresten gelen istek sıklığına karşı hassastır. Mobil proxy'ler, aynı anda binlerce normal kullanıcının bağlı olduğu gerçek hücresel operatör IP adresleri sağlar, bu yüzden Yandex onlara son derece olumlu yaklaşır. mobileproxy.space kişisel panelinizde proxy satın aldıktan sonra dört değere ihtiyacınız olacak:
- Host (sunucu adresi) ve HTTP bağlantısı için port.
- Kimlik doğrulama için kullanıcı adı ve şifre.
- IP değiştirme bağlantısı: Bu URL'ye erişildiğinde proxy operatörden yeni bir adres alır. Bunu ayrı bir dosyaya kopyalayın, beşinci adımda gerekecek.
İpucu: Kazıdığınız şehirle aynı bölgeden, en azından aynı ülkeden proxy seçin. Haritalar sonuçları konuma göre uyarlar; başka ülkeden bir proxy eksik işletme listesi veya farklı dilde arayüz gösterebilir.
Yedekler ve çalışma klasörü
Diskinizde örneğin maps_parser adında bir klasör oluşturun. İçinde betikler ve sonuçlar yer alacak. Tüm ara verileri her karttan sonra dosyalara kaydedeceğiz; yani betik üç yüzüncü işletmede çökse bile ilk iki yüz doksan dokuz kaybolmaz. Sonuç dosyasının bir kopyasını her yeniden çalıştırmadan önce almak mantıklı: Eski dosyayı tarih ekleyerek yeniden adlandırın.
Kontrol: Komut satırını açın (Windows'ta Win+R tuşlayıp cmd yazıp Enter'a basın) ve python --version komutunu girin. Python 3.12.x gibi bir satır görüyorsanız hazırlık tamam. Hata alıyorsanız Python'u Add to PATH seçeneğiyle yeniden kurun.
Temel Kavramlar: Haritalar nasıl çalışır ve kart kazıma nedir?
Kod yazmadan önce terimleri netleştirelim. Basitler, ama onlar olmadan neden böyle yaptığımız anlaşılmaz.
Anahtar terimler sade bir dille
- Kazıma (scraping) — Bir sitenin sayfalarından otomatik bilgi toplama. Program, bir insanın yapacağı gibi sayfayı açar ve gerekli parçaları çeker.
- İşletme kartı — Haritalar'da yandex.ru/maps/org/isim/sayısal-kimlik/ biçiminde adrese sahip ayrı bir sayfa. Telefon, adres, yorumlar ve diğer veriler tam da burada bulunur. Soldaki işletme listesi sadece bir vitrindir, biz ondan yalnızca kart bağlantılarını alırız.
- Seçici (selector) — Sayfa içindeki bir öğenin «adresi». Örneğin business-contacts-view__address sınıfı adres bloğunu gösterir. Betik seçiciler aracılığıyla gerekli metni bulur.
- Headless tarayıcı — Programın yönettiği gerçek bir tarayıcı. Pencereli (ne olduğunu görürsünüz) veya penceresiz çalışabilir.
- Playwright — Python'dan tarayıcıyı yönetmek için bir kütüphane. Onu seçtik çünkü Haritalar tamamen JavaScript üzerine kurulu; basit bir HTML isteği verisiz boş bir sayfa döndürür.
- Mobil proxy — Bilgisayarınızla site arasında, hücresel ağ IP adresine sahip bir aracı. Site sizin adresinizi değil, operatörün adresini görür.
- IP rotasyonu — Yükün tek bir IP'de yoğunlaşmaması için proxy adresinin periyodik olarak değiştirilmesi.
- Captcha — «Robot olmadığınızı doğrulayın» kontrol sayfası. Bizim için bu, çok acele ettiğimizin işaretidir. Bunu harici servislerle çözmeyeceğiz; sadece duracağız, IP'yi değiştireceğiz ve tempoyu düşüreceğiz.
Yandex Haritalar kazıyıcısının temel çalışma prensipleri
Mantık basit ve üç aşamadan oluşur. Önce istediğimiz işletmelerin kart bağlantılarının listesini alırız. Sonra her kartı sırayla açıp verileri çıkarırız. Sonunda hepsini bir tabloya dökeriz. Bu işlemler arasında rastgele sürelerde bekleriz ve zaman zaman adres değiştirme bağlantısı üzerinden IP'mizi değiştiririz.
Yasallık ve etik hakkında bilinmesi gerekenler
Dikkat: Yalnızca halka açık işletme verilerini toplayın ve analiz için kullanın. Bir şirketin telefonu ve adresi kişisel veri değildir, ancak yorum yazarlarının isimleri 152-FZ kapsamında kişisel veri sayılabilir. Gereksizse saklamayın ve topladığınız telefonları izin olmadan toplu gönderim için kullanmayın; bu, reklam yasasını ve Yandex kurallarını ihlal eder. Ayrıca unutmayın: Yandex kullanıcı sözleşmesi otomatik toplamayı sınırlar, bu yüzden yükü minimumda tutun; büyük hacimli ticari projeler için Yandex'in işletme arama API'sini değerlendirin.
Adım 1: Ortamı hazırlıyoruz ve mobil proxy'yi bağlıyoruz
Aşamanın amacı: Tüm kütüphaneleri kurmak, tarayıcıyı indirmek ve isteklerin doğrudan değil mobil proxy üzerinden gittiğinden emin olmak.
Kütüphanelerin kurulumu
- Komut satırını veya terminali açın.
- cd komutu ve klasör yolu ile çalışma klasörüne gidin. Örneğin: Windows'ta cd C:\maps_parser, macOS ve Linux'ta cd ~/maps_parser.
- Kütüphanelerin diğer projelere karışmaması için sanal ortam oluşturun: python -m venv venv
- Etkinleştirin. Windows: venv\Scripts\activate. macOS ve Linux: source venv/bin/activate. Terminal satırının başında (venv) yazısı görünecek.
- Kütüphaneleri tek komutla kurun:
pip install playwright pandas openpyxl requests
playwright install chromiumİkinci komut Chromium'u indirecek. İnternet hızına bağlı olarak 2-5 dakika sürer. Terminalde tekrar giriş istemi belirene kadar bekleyin.
Proxy kontrolü
Düzenleyicide check_proxy.py dosyasını oluşturun ve kişisel panelinizdeki değerlerle KULLANICI_ADI, ŞİFRE, HOST ve PORT'u değiştirerek aşağıdaki kodu yapıştırın:
import requests
proxy = 'http://KULLANICI_ADI:ŞİFRE@HOST:PORT'
proxies = {'http': proxy, 'https': proxy}
direct = requests.get('https://api.ipify.org?format=json', timeout=30).json()
via_proxy = requests.get('https://api.ipify.org?format=json', proxies=proxies, timeout=30).json()
print('Doğrudan IP adresiniz:', direct['ip'])
print('Proxy üzerinden IP:', via_proxy['ip'])Dosyayı python check_proxy.py komutuyla çalıştırın. İki farklı adres görmelisiniz. Adresler aynıysa veya bağlantı hatası çıktıysa proxy çalışmıyor, devam etmenin anlamı yok.
IP değişimini kontrol etme
Kişisel panelinizden IP değiştirme bağlantısını normal tarayıcıda açın. Genellikle başarılı değişim hakkında kısa bir yanıt döner. 15-30 saniye bekleyin ve check_proxy.py'yi tekrar çalıştırın. Proxy üzerinden adres değişmiş olmalı. Değişimin gerçekte kaç saniye sürdüğünü not edin: Bu değeri beşinci adımda betiğe koyacağız.
İpucu: Tüm proxy ayarlarını PROXY_HOST, PROXY_PORT, PROXY_LOGIN, PROXY_PASSWORD ve CHANGE_IP_URL değişkenleriyle ayrı bir config.py dosyasına kaydedin. O zaman diğer betiklerde from config import * yazmanız yeter, şifreleri on kere yeniden yazmanız gerekmez.
Kontrol: playwright --version komutu sürüm numarasını veriyor, check_proxy.py evdeki adresinizden farklı bir hücresel operatör IP'si gösteriyor ve adres değiştirme bağlantısına eriştikten sonra adres değişiyor.
Olası sorunlar
- «pip iç komut değil» hatası. Python, PATH'e eklenmeden kurulmuş. Onay kutusuyla yeniden kurun veya pip yerine py -m pip komutunu kullanın.
- 407 Proxy Authentication Required hatası. Kullanıcı adı veya şifre yanlış. Kopyalarken fazladan boşluk olup olmadığını kontrol edin.
- Proxy üzerinden istekte Timeout. Port yanlış belirtilmiş veya proxy o anda IP değiştiriyor. Yarım dakika bekleyip tekrar deneyin.
Adım 2: İşletme kartlarının bağlantılarını topluyoruz
Aşamanın amacı: İstediğiniz sorgu ve şehirdeki tüm işletmelerin kart adreslerini içeren links.json dosyasını elde etmek.
Burada Haritalar sonuç listesine sadece bir kez, bağlantıları almak için bakacağız. Verilerin kendisini yalnızca kartlardan alacağız; yani liste bize sadece bir içindekiler tablosu olarak lazım, o kadar.
İşletme listesi nasıl çalışır?
Haritalar'da «diş kliniği İstanbul» gibi bir sorgu girdiğinizde solda kaydırılabilir bir panel ve küçük özet kartları görünür. Her özet kart bir kart sayfasına bağlantı içerir. Liste, kaydırdıkça parça parça yüklenir; bu yüzden betik fare tekerleğiyle paneli kaydıracak ve yeni bağlantı çıkmayana kadar her kaydırmadan sonra bağlantıları toplayacak.
Bağlantı toplama betiğini yazalım
collect_links.py dosyasını oluşturun:
from playwright.sync_api import sync_playwright
import time, random, json
from config import *
PROXY = {'server': f'http://{PROXY_HOST}:{PROXY_PORT}', 'username': PROXY_LOGIN, 'password': PROXY_PASSWORD}
QUERY = 'diş kliniği İstanbul'
MAX_SCROLLS = 40
with sync_playwright() as p:
browser = p.chromium.launch(headless=False, proxy=PROXY)
context = browser.new_context(locale='tr-TR', viewport={'width': 1400, 'height': 900})
page = context.new_page()
page.goto('https://yandex.com.tr/maps/?text=' + QUERY, wait_until='domcontentloaded')
time.sleep(random.uniform(5, 8))
page.mouse.move(350, 500)
links = set()
stale = 0
for i in range(MAX_SCROLLS):
before = len(links)
page.mouse.wheel(0, random.randint(1200, 2000))
time.sleep(random.uniform(1.5, 3.5))
for a in page.query_selector_all('a[href*="/maps/org/"]'):
href = a.get_attribute('href') or ''
clean = href.split('?')[0]
if clean.startswith('/'):
clean = 'https://yandex.com.tr' + clean
links.add(clean)
stale = stale + 1 if len(links) == before else 0
print(f'Kaydırma {i+1}: bağlantı sayısı {len(links)}')
if stale >= 4:
break
with open('links.json', 'w', encoding='utf-8') as f:
json.dump(sorted(links), f, ensure_ascii=False, indent=2)
print('Toplam toplanan:', len(links))
browser.close()Neler olduğunu açıklayalım
- headless=False satırı tarayıcıyı pencereli açar. Hata ayıklama aşamasında bu şarttır: Haritanın yüklenip yüklenmediğini ve captcha olup olmadığını kendi gözlerinizle görürsünüz.
- page.mouse.move(350, 500) imleci sol panele yerleştirir. Bu olmadan fare tekerleği listeyi değil haritanın kendisini kaydırır.
- a[href*="/maps/org/"] seçicisi /maps/org/ parçasını içeren tüm bağlantıları arar. Yandex'in birkaç ayda bir değiştirdiği sınıflardan daha dayanıklıdır.
- stale sayacı, üst üste dört kaydırma yeni bağlantı getirmezse döngüyü durdurur. Bu, listenin bittiği anlamına gelir.
- Bağlantılar soru işaretinden sonraki parametrelerden temizlenir, böylece bir işletme dosyaya iki kere girmez.
Betiği çalıştırın: python collect_links.py. Bir tarayıcı penceresi açılacak, sonuçlarla harita yüklenecek, panel kaymaya başlayacak. Terminalde bağlantı sayacı hızla akacak. Orta büyüklükte bir şehir için tek sorguda genellikle 2-4 dakikada 100 ila 400 kart toplanır.
İpucu: Haritalar tek sorguda nadiren 500'den fazla sonuç verir. Metropolde tüm nişi toplamanız gerekiyorsa sorguyu ilçelere bölün: «diş kliniği Kadıköy İstanbul», «diş kliniği Beşiktaş İstanbul». Farklı sorgulardan gelen bağlantıları yukarıdaki kodda olduğu gibi set üzerinden birleştirin, tekrarlar kendiliğinden kaybolur.
Kontrol: Klasörde links.json dosyası oluştu; içinde https://yandex.com.tr/maps/org/isim/1234567890/ biçiminde adresler var. İki-üç adresi normal tarayıcıda elle açıp doğru işletmelerin kartları olduğundan emin olun.
Olası sorunlar
- Sıfır bağlantı toplandı. Muhtemelen sayfa yüklenmedi veya imleç liste üzerinde değildi. İlk beklemeyi 10 saniyeye çıkarın ve fare koordinatlarını kontrol edin: Panel imlecin altında olmalı.
- Liste kaymıyor, harita hareket ediyor. Pencerenizdeki panel genişliğine göre mouse.move'daki X koordinatını azaltın veya artırın.
- Hemen captcha açıldı. Bağlantı üzerinden IP'yi değiştirin, bir dakika bekleyin ve yeniden çalıştırın. Tekrar ediyorsa başka bir proxy kanalını deneyin.
Adım 3: İşletme kartını kazıyoruz — isim, adres, telefon, site
Aşamanın amacı: Bir kartı açıp işletmenin temel verilerini içeren bir sözlük döndüren fonksiyon yazmak ve links.json'daki tüm bağlantılar için çalıştırmak.
Seçicileri kendiniz nasıl bulursunuz?
Yandex zaman zaman şablon sınıflarını yeniden adlandırır. Bu yüzden sadece hazır koda güvenmek yerine onları kendiniz bulmayı bilmek önemlidir. Şöyle yapılır:
- Herhangi bir işletme kartını normal Chrome tarayıcıda açın.
- İşletmenin telefonuna sağ tıklayın ve İncele'yi seçin (veya F12'ye basıp öğe seçme aracıyla tıklayın).
- Açılan panelde class niteliği vurgulanmış etiketi göreceksiniz. Örneğin class="card-phones-view__phone-number". İşte bu seçicidir: Kodda başına nokta koyularak yazılır.
- İsim, adres, site, puan ve çalışma saatleri için tekrarlayın. Sınıfları not defterine yazın.
Bir sınıf boşlukla ayrılmış birkaç kelimeden oluşabilir. İçinde çift alt çizgi bulunan en «konuşkan» ilk kelimeyi alın. Rehberin yazıldığı sırada aşağıdaki koddaki seçiciler günceldir, ama çalıştırmadan önce siz de kontrol edin.
Kart kazıma fonksiyonunu yazalım
parse_cards.py dosyasını oluşturun:
from playwright.sync_api import sync_playwright
import time, random, json, csv, os
from config import *
PROXY = {'server': f'http://{PROXY_HOST}:{PROXY_PORT}', 'username': PROXY_LOGIN, 'password': PROXY_PASSWORD}
OUT = 'orgs.csv'
FIELDS = ['url', 'name', 'category', 'address', 'phones', 'site', 'rating', 'reviews_count', 'hours']
def grab(page, selector):
el = page.query_selector(selector)
return el.inner_text().strip() if el else ''
def parse_card(page, url):
page.goto(url, wait_until='domcontentloaded')
time.sleep(random.uniform(3, 6))
more = page.query_selector('.card-phones-view__more')
if more:
more.click()
time.sleep(random.uniform(1, 2))
phones = [e.inner_text().strip() for e in page.query_selector_all('.card-phones-view__phone-number')]
return {
'url': url,
'name': grab(page, 'h1.orgpage-header-view__header'),
'category': grab(page, '.orgpage-categories-info-view'),
'address': grab(page, '.business-contacts-view__address'),
'phones': '; '.join(dict.fromkeys(phones)),
'site': grab(page, '.business-urls-view__text'),
'rating': grab(page, '.business-rating-badge-view__rating-text'),
'reviews_count': grab(page, '.business-header-rating-view__text'),
'hours': grab(page, '.business-working-status-view'),
}
def load_done():
if not os.path.exists(OUT):
return set()
with open(OUT, encoding='utf-8') as f:
return {row['url'] for row in csv.DictReader(f)}
links = json.load(open('links.json', encoding='utf-8'))
done = load_done()
todo = [u for u in links if u not in done]
print(f'Toplam {len(links)}, kalan {len(todo)}')
with sync_playwright() as p:
browser = p.chromium.launch(headless=False, proxy=PROXY)
page = browser.new_context(locale='tr-TR').new_page()
new_file = not os.path.exists(OUT)
with open(OUT, 'a', newline='', encoding='utf-8') as f:
writer = csv.DictWriter(f, fieldnames=FIELDS)
if new_file:
writer.writeheader()
for n, url in enumerate(todo, 1):
try:
row = parse_card(page, url)
writer.writerow(row)
f.flush()
print(f'{n}/{len(todo)} {row["name"]} | {row["phones"]}')
except Exception as e:
print('Hata:', url, e)
time.sleep(random.uniform(4, 9))
browser.close()Burada önemli olanlar
- «Telefonu göster» düğmesi. Bazı kartlarda tam numara bir düğmenin arkasında gizlidir. card-phones-view__more sınıfıyla onu ararız ve bulursak tıklarız. Ancak ondan sonra numaraları toplarız.
- Her karttan sonra kayıt. f.flush() fonksiyonu verileri diske zorla yazar. Betik çökerse toplanan her şey orgs.csv'de kalır.
- Kaldığı yerden devam etme. load_done fonksiyonu zaten toplanmış bağlantıları okur; betik tekrar çalıştırıldığında baştan başlamaz, kaldığı yerden devam eder.
- Kartlar arasında 4-9 saniye bekleme. Bu, bilgiyi okuyan dikkatli bir insanın temposudur. İlk çalıştırmalarda bu süreyi kısaltmayın.
python parse_cards.py komutunu çalıştırın ve tarayıcı penceresinde ilk beş-on kartı izleyin. Sayfanın açıldığını, gerektiğinde telefonun açığa çıktığını ve terminalde isim ile numaranın göründüğünü görmelisiniz.
Dikkat: Üst üste beş kart boş isim döndürürse betiği derhal Ctrl+C ile durdurun. Neredeyse kesinlikle Yandex şablonu değiştirdi ve seçiciler eskidi. Yukarıdaki talimata göre yenilerini bulun ve kodu güncelleyin. Boş satır toplamaya devam etmek anlamsızdır ve proxy'ye yük bindirmekten başka işe yaramaz.
İpucu: Metnin yanı sıra işletmenin kimliğini de kaydetmek faydalıdır: URL'nin sonundaki sayısal kısım. Bu sayede toplamalar arasında veri tabanlarını kolayca karşılaştırabilir ve kapanan şirketleri takip edebilirsiniz. Sözlüğe 'org_id': url.rstrip('/').split('/')[-1] alanını ekleyin.
Kontrol: orgs.csv Excel'de açılıyor, satırların en az %90'ında name, address, phones sütunları dolu. Telefonlar +90 (212) 000-00-00 biçiminde. Puan virgüllü sayı olarak görünüyor, örneğin 4,7.
Olası sorunlar
- Sitede olmasına rağmen telefonlar boş. «Telefonu göster» düğmesinin sınıfı farklı. F12 ile bulun ve koddaki yenisini değiştirin.
- CSV'de Türkçe karakterler bozuk. Excel kodlamayı tanıyamadı. Dosyayı Veri menüsü, Metinden/CSV'den ile açıp UTF-8 seçin veya 6. adımda verileri xlsx'e dönüştürene kadar bekleyin.
- Betik bir kartta takılıyor. page.goto'ya timeout=45000 parametresi ekleyin; 45 saniye sonra istisna oluşur ve döngü devam eder.
Adım 4: Kartlardan yorumları topluyoruz
Aşamanın amacı: Her işletme için puan, tarih ve metin içeren yorum listesi almak ve bunları ayrı bir reviews.csv dosyasına kaydetmek.
Yorumlar nerede yaşar?
Her kartın https://yandex.com.tr/maps/org/isim/kimlik/reviews/ biçiminde adrese sahip bir «Yorumlar» sekmesi vardır. Yorumlar tıpkı ikinci adımdaki işletme listesi gibi kaydırdıkça parça parça yüklenir. Varsayılan olarak güncelliğe göre sıralanır, tazeleri almak için sıralamayı «Yeniliğe göre» olarak değiştirebilirsiniz.
Yorum toplama fonksiyonunu yazalım
parse_reviews.py dosyasını oluşturun. Temel önceki adımla aynı, o yüzden sadece fonksiyonu ve döngüyü veriyoruz:
def parse_reviews(page, url, max_scrolls=15):
page.goto(url.rstrip('/') + '/reviews/', wait_until='domcontentloaded')
time.sleep(random.uniform(3, 6))
page.mouse.move(350, 600)
seen = 0
for _ in range(max_scrolls):
page.mouse.wheel(0, random.randint(1500, 2500))
time.sleep(random.uniform(1.5, 3))
cards = page.query_selector_all('.business-review-view')
if len(cards) == seen:
break
seen = len(cards)
result = []
for c in page.query_selector_all('.business-review-view'):
def sub(sel):
el = c.query_selector(sel)
return el.inner_text().strip() if el else ''
stars = c.query_selector_all('.business-rating-badge-view__star._full')
result.append({
'org_url': url,
'author': sub('.business-review-view__author-name'),
'date': sub('.business-review-view__date'),
'stars': len(stars),
'text': sub('.business-review-view__body-text'),
})
return resultBağlantılar üzerinden döngüde parse_card yerine parse_reviews çağırın ve listenin her öğesini org_url, author, date, stars, text alanlarıyla reviews.csv'ye ayrı bir satır olarak yazın. Devam etme mantığı ve her işletmeden sonra kayıt aynı kalır.
Ayrıntıları açıklayalım
- max_scrolls=15 sınırı. Popüler mekânlarda iki-üç bin yorum olabilir. Hepsini toplamak pek gerekmez ve çok zaman ve istek tüketir. On beş kaydırma genellikle son 100-150 yorum için yeterlidir.
- Puanı yıldızlar üzerinden alma. Yorumdaki puan metin olarak yazılmaz, yıldızlarla çizilir. Biz _full değiştiricisi olan öğeleri, yani dolu yıldızları sayarız.
- Uzun yorumlar. Bazı metinler katlanmıştır ve «Daha fazla» düğmesine basmak gerekir. Tam metin gerekiyorsa toplamadan önce kart içindeki business-review-view__expand sınıflı tüm düğmelere tıklayın.
Dikkat: Yorum yazarlarının isimleri işletmenin değil kullanıcıların verileridir. Amacınız duygu analizi veya tipik şikâyetleri bulmaksa author alanına ihtiyacınız yok. Gereksizse toplamayın; bu sizi 152-FZ konusunda fazladan sorulardan kurtarır. Alan gerekiyorsa dosyayı yerel olarak saklayın ve üçüncü kişilerle paylaşmayın.
İpucu: Yorum toplamayı tüm işletmeler için değil, filtrelenmiş bir liste için çalıştırın: örneğin yalnızca puanı 4,0'ın altında olanlar veya yalnızca doğrudan rakipler. Bu, istek hacmini kat kat azaltır, verinin değerini kaybettirmez.
Kontrol: reviews.csv'de her işletme için 20 ila 150 satır var, stars sütunu 1 ile 5 arası sayılar içeriyor, text içinde anlamlı Türkçe metin var. Tarih «15 Ocak» veya «3 Mart 2026» gibi görünüyor.
Olası sorunlar
- Sıfır yorum bulundu. URL'nin /reviews/ ile bittiğinden ve kaydırırken yorum panelinin imlecin altında olduğundan emin olun.
- Tüm yorumlarda stars 0. Dolu yıldızın sınıfı değişti. F12 ile yıldıza tıklayarak bulun.
- Yorumlar tekrarlanıyor. Panel tam kaymadı ve bir blok iki kere sayıldı. Altıncı adımda author artı text çiftine göre tekrarları kaldırın.
Adım 5: IP rotasyonunu ve blok korumasını ayarlıyoruz
Aşamanın amacı: Kazıyıcıya dikkatli bir kullanıcı gibi davranmayı öğretmek: IP'yi programa göre değiştirmek, captcha'yı tanımak ve bloklara çarpmak yerine otomatik olarak tempoyu düşürmek.
Banlar neden oluşur?
Yandex kartlara bakmayı yasaklamaz, ama anormallikleri takip eder: bir adresten dakikada yüzlerce sayfa, istekler arasında aynı aralıklar, fare hareketlerinin olmaması, boş çerezler. Şüphe birikince SmartCaptcha sayfası çıkar, ısrar edilirse IP'ye geçici sınırlama gelir. Bizim stratejimiz korumayı «kırmak» değil, devreye girmesine neden olmamak.
Sakin bir Yandex Haritalar kazıyıcısının üç kuralı
- İnsan temposu. Bir IP için dakikada 8-12 karttan fazla değil. Sabit değil, rastgele molalar.
- Düzenli IP değişimi. Her 25-40 kartta veya her 10-15 dakikada bir adres değiştirme bağlantısına başvururuz. Mobil proxy saniyeler içinde yeni bir operatör IP'si alır ve site açısından istek geçmişi «sıfırlanır».
- Captcha'da anında geri çekilme. Doğrulamayı gördük — geçmeye çalışmıyoruz, 2-3 dakika mola verip IP'yi değiştiriyoruz ve aynı karttan yeni bir tarayıcı bağlamında devam ediyoruz.
Koda rotasyon ekleyelim
Aşağıdaki fonksiyonları parse_cards.py ve parse_reviews.py içine ekleyin ve ana döngüde çağırın:
import requests
def change_ip():
try:
r = requests.get(CHANGE_IP_URL, timeout=30)
print('IP değişimi:', r.status_code)
except Exception as e:
print('IP değiştirilemedi:', e)
time.sleep(IP_CHANGE_WAIT)
def is_captcha(page):
if 'showcaptcha' in page.url or 'checkcaptcha' in page.url:
return True
return page.query_selector('.CheckboxCaptcha') is not None
def new_page(browser):
ctx = browser.new_context(locale='tr-TR', viewport={'width': random.choice([1366, 1440, 1536]), 'height': 900})
return ctx.new_page()Ve ana döngü şu hâle gelir:
page = new_page(browser)
since_change = 0
for n, url in enumerate(todo, 1):
if since_change >= random.randint(25, 40):
page.context.close()
change_ip()
page = new_page(browser)
since_change = 0
row = parse_card(page, url)
if is_captcha(page):
print('Captcha! Mola ve IP değişimi')
page.context.close()
time.sleep(random.uniform(120, 180))
change_ip()
page = new_page(browser)
row = parse_card(page, url)
writer.writerow(row)
f.flush()
since_change += 1
time.sleep(random.uniform(4, 9))Anlaşılması gerekenler
- Yeni IP ile birlikte yeni bağlam. Bağlamı kapatarak çerezleri ve yerel depolamayı sıfırlarız. Çerezleri sıfırlamadan adres değiştirmek anlamsızdır: Site sizi oturumdan tanımaya devam eder.
- config.py'deki IP_CHANGE_WAIT değişkeni — birinci adımda ölçülen süredir, genellikle 15-30 saniye. Daha az koyulamaz: Tarayıcı sayfayı eski adres üzerinden açar.
- Rastgele pencere boyutu tarayıcı parmak izine çeşitlilik katar. Bu yumuşak bir önlemdir, ama bedavadır.
- Bağlantı üzerinden rotasyonlu mobil proxy'ler burada diğerlerinden daha kullanışlıdır: Onlarca adres arasında elle geçiş yapmazsınız, sadece bir URL'yi çağırırsınız.
İpucu: Basit bir günlük tutun: Dosyaya zamanı, kart numarasını ve olayı (başarı, captcha, IP değişimi) kaydedin. Bir hafta sonra günlükten hangi tempoda captcha'nın hiç çıkmadığını net görürsünüz ve molaları proxy kanalınıza göre ayarlarsınız.
Kontrol: Bir saat kesintisiz çalışmada betik 400-600 kart topladı, terminalde captcha hakkında en fazla bir-iki mesaj çıktı, her birinden sonra toplama otomatik devam etti. Proxy üzerinden IP en az on kere değişti (bu «IP değişimi: 200» satırlarından görülür).
Olası sorunlar
- Captcha her 10 kartta çıkıyor. Kanalınız için tempo çok yüksek. Molaları 8-15 saniyeye çıkarın ve IP'yi her 15 kartta değiştirin.
- IP değişiminden sonra sayfalar yüklenmiyor. IP_CHANGE_WAIT'i artırın: Operatör henüz yeni adres atamamış.
- IP değiştirme bağlantısı sık çağrı hatası veriyor. Çoğu tarifede değişimler arasında minimum bir aralık vardır, genellikle bir ila iki dakika. IP'yi daha sık değiştirmeyin.
Adım 6: Verileri temizleyip Excel'e kaydediyoruz
Aşamanın amacı: Ham CSV'leri tekrarsız, teleforları normalleştirilmiş ve puanı sayısal hâle getirilmiş düzenli Excel tablolarına dönüştürmek.
Temizlik betiğini yazalım
clean_export.py dosyasını oluşturun:
import pandas as pd
def norm_phone(value):
out = []
for raw in str(value).split(';'):
digits = ''.join(ch for ch in raw if ch.isdigit())
if len(digits) == 11 and digits[0] in '78':
out.append('+7' + digits[1:])
elif len(digits) == 10:
out.append('+7' + digits)
return '; '.join(dict.fromkeys(out))
orgs = pd.read_csv('orgs.csv', encoding='utf-8')
orgs = orgs.drop_duplicates(subset='url')
orgs['phones'] = orgs['phones'].fillna('').apply(norm_phone)
orgs['rating'] = pd.to_numeric(orgs['rating'].astype(str).str.replace(',', '.'), errors='coerce')
orgs['reviews_count'] = pd.to_numeric(orgs['reviews_count'].astype(str).str.extract('(\d+)')[0], errors='coerce')
orgs = orgs.sort_values('rating', ascending=False)
reviews = pd.read_csv('reviews.csv', encoding='utf-8')
reviews = reviews.drop_duplicates(subset=['org_url', 'author', 'text'])
with pd.ExcelWriter('yandex_maps_result.xlsx', engine='openpyxl') as w:
orgs.to_excel(w, sheet_name='İşletmeler', index=False)
reviews.to_excel(w, sheet_name='Yorumlar', index=False)
print('İşletmeler:', len(orgs), 'Yorumlar:', len(reviews))Yorum sayısını çıkaran satırda tek ters eğik çizgi ve parantez içinde d harfinden oluşan bir düzenli ifade kullanılır: «312 yorum» gibi metinden ilk sayıyı çeker. Dikkatlice kopyalayın.
Betik ne yapar?
- URL'ye göre işletme tekrarlarını kaldırır.
- Tüm telefonları parantez, boşluk ve tireleri kaldırarak +7XXXXXXXXXX biçimine getirir. Bu biçim CRM ve veri tabanı karşılaştırması için uygundur.
- Puan içindeki virgülü noktaya çevirir; Excel onu sayı olarak algılar ve sıralamaya izin verir.
- Yorum sayısını metin satırından çıkarır.
- Yorum tekrarlarını kaldırır ve tek xlsx dosyasına iki sayfa yazar.
python clean_export.py komutunu çalıştırın ve yandex_maps_result.xlsx dosyasını açın. İlk sayfada işletmeler puana göre sıralanmış, telefonlar tek biçimde; ikinci sayfada org_url sütunuyla işletmeye bağlı yorumlar var.
İpucu: Betiğe geçerli tarihi içeren «toplama tarihi» sütunu ekleyin. Bir ay sonra toplamayı tekrarlayın ve tabloları pandas'taki merge işleviyle karşılaştırın: Yeni işletmeleri, kapanan noktaları ve rakiplerin puan değişimlerini görürsünüz. Artık bu tam bir pazar takibidir.
Kontrol: xlsx dosyası uyarı vermeden açılıyor, Türkçe karakterler okunuyor, rating sütunu sayı olarak sıralanıyor, phones sütununda parantez ve boşluk yok, «İşletmeler» sayfasındaki satır sayısı links.json'daki benzersiz bağlantı sayısı eksi hatalar ile aynı.
Sonuç Kontrolü: Hazır kazıyıcının kontrol listesi
Listeyi gözden geçirin. Her maddeye «evet» dediyseniz Yandex Haritalar kazıyıcınız düzenli çalışmaya hazır.
Kontrol listesi
- check_proxy.py evdeki adresinizden farklı bir hücresel operatör IP'si gösteriyor.
- collect_links.py ortalama bir sorguda 50'den fazla bağlantı topluyor ve kendi kendine duruyor.
- parse_cards.py kartların en az %90'ında isim, adres ve telefonu dolduruyor.
- «Telefonu göster» düğmesi otomatik açılıyor.
- parse_reviews.py 1 ile 5 arası puanlı yorumlar döndürüyor.
- Captcha çıktığında betik mola veriyor, IP'yi değiştiriyor ve sizin müdahaleniz olmadan devam ediyor.
- Acil durdurma sonrası yeniden çalıştırma kesintinin olduğu yerden devam ediyor.
- clean_export.py iki sayfalı ve normalleştirilmiş telefonlu xlsx oluşturuyor.
Baştan sona nasıl test edilir?
- Şehirde 30-60 işletme bulunan küçük bir sorgu seçin, örneğin taşrada «lastik tamircisi».
- Tüm betikleri sırayla çalıştırın ve süreyi ölçün. Yorumlu 50 kart için 15-25 dakika gitmeli.
- Tablodan rastgele beş işletme seçip telefon ve adresleri kartlardan elle doğrulayın.
- parse_cards.py'yi ortasında Ctrl+C ile durdurun ve tekrar başlatın. «Kalan» sayacının sıfırlanmadığından, azaldığından emin olun.
Başarılı çalışma göstergeleri
- Elle doğrulamada veri doğruluğu: telefon ve adreslerde %100 eşleşme.
- Boş isim oranı: %3'ten az.
- Captcha sıklığı: 200-300 kartta birden fazla değil.
- Hız: Güvenli tempoda bir proxy kanalıyla saatte 400-600 kart.
Sık Yapılan Hatalar ve Çözümleri
Yandex Haritalar için ilk defa kazıyıcı yazan neredeyse herkesin karşılaştığı sorunları ve çözüm yollarını topladık.
Çoğu kartta alanlar boş
Neden: Yandex şablonu güncelledi, öğe sınıfları değişti. Çözüm: Kartı Chrome'da açın, F12'ye basın, yeni sınıfları bulun ve parse_card fonksiyonunda değiştirin. Seçicileri dosya başında tek bir sözlükte tutun ki sadece bir yeri düzeltmeniz yetsin.
Captcha daha ilk sayfada çıkıyor
Neden: Proxy IP'si önceki etkinlikten «yorgun» ya da tarayıcı şüpheli parametrelerle başlatılıyor. Çözüm: Başlamadan önce IP'yi değiştirin, locale='tr-TR' ayarının yapıldığından emin olun ve ilk çalıştırmalarda headless modunu kullanmayın: Otomasyona dair daha çok sinyal üretir.
Liste kaydırma haritayı hareket ettiriyor, paneli değil
Neden: Fare imleci sol panelin dışında. Çözüm: page.mouse.move koordinatlarını pencere boyutunuza göre ayarlayın. 1400 piksel genişlikte panel yatayda yaklaşık ilk 450 pikseli kaplar.
Aynı 20 işletme toplanıyor
Neden: Panel sona kadar kaymıyor, stale sayacı erken tetikleniyor. Çözüm: Kaydırmadan sonra beklemeyi 3-4 saniyeye ve stale eşiğini 6'ya çıkarın; Haritalar bazen sonraki partiyi yavaş yükler.
Telefonlar tarayıcıda görünüyor ama tabloda boş
Neden: Numara yalnızca tıklamadan sonra çıkıyor, betik ise tamamlanmadan önce veri topluyor ya da düğmenin sınıfı farklı. Çözüm: Tıklamadan sonra beklemeyi 2-3 saniyeye çıkarın ve düğmenin sınıfını kontrol edin.
Target closed veya Browser has been closed hatası
Neden: IP değiştirirken bağlamı kapattınız ama eski page nesnesini kullanmaya devam ediyorsunuz. Çözüm: Her page.context.close() işleminden sonra page değişkeninin 5. adımdaki örnekte olduğu gibi new_page(browser) ile yeniden atandığından emin olun.
IP değişiminden sonra sayfalar sonsuza kadar yükleniyor
Neden: Operatör henüz yeni adres atamamış, proxy geçiş durumunda. Çözüm: IP_CHANGE_WAIT'i 30-40 saniyeye çıkarın ve page.goto'ya timeout ekleyin ki takılma döngüyü bloke etmesin.
Excel CSV'yi bozuk karakterlerle açıyor
Neden: Excel BOM işareti olmadan UTF-8'i tanımıyor. Çözüm: clean_export.py kullanıp xlsx ile çalışın ya da CSV yazarken encoding='utf-8-sig' belirtin.
İleri Düzey Kullanıcılar İçin Ek Olanaklar
Temel kazıyıcı zaten görevlerin %90'ını çözer. Daha fazla hız ve veri istiyorsanız geliştirilecek yönler şunlardır.
Şablonu ayrıştırmak yerine ağ yanıtlarını yakalamak
Haritalar kart verilerini ayrı isteklerle JSON formatında yükler. Playwright bunlara page.on('response', handler) ile abone olabilir. Yönetici içinde response.url'in /maps/api/ parçasını içerip içermediğini kontrol edin ve response.json() kaydedin. Yöntemin artısı: Veriler yapılandırılmıştır ve şablon sınıflarından bağımsızdır. Eksisi: İç adresler haber vermeden değişir ve iç içe JSON'u ayrıştırmak sayfadan metin okumaktan zordur. Bu yaklaşımı temelle birleştirmek iyidir: JSON yanıtı geldiyse onu alırız, aksi hâlde HTML ayrıştırmaya düşeriz.
Birden çok proxy kanalıyla paralel çalışma
Bir mobil proxy güvenli tempoda saatte 400-600 kart verir. Daha hızlı gerekliyse iki-üç kanal alın ve links.json'u eşit parçalara bölerek her biri için ayrı bir süreç çalıştırın. Tek kanaldan birden çok tarayıcı çalıştırmayın: IP başına toplam tempo artar ve captcha geri döner. Düzenleme için subprocess tabanlı basit bir başlatıcı betik ya da async_playwright'li asyncio kütüphanesi uygundur; her işçi new_context'in proxy parametresinde kendi bağlamını ve proxy'sini alır.
Değişiklik takibi
Her toplamanın sonuçlarını tarihli ayrı bir dosyaya kaydedin ve org_id üzerinden karşılaştırın. Ortaya çıkan kimlikler pazardaki yeni oyuncular, kaybolanlar kapanan noktalar, rating ve reviews_count değişimi itibar dinamikleridir. Windows Görev Zamanlayıcısı veya cron ile iki haftada bir çalıştırma ayarlayın, elinizde nişin canlı haritası olur.
Alanları genişletmek
Kartlarda başka faydalı bloklar da vardır: fiyatlı hizmet listesi, sosyal medya bağlantıları, «Doğrulanmış işletme» işareti, fotoğraf sayısı, en yakın metro. Her alan aynı şemaya göre eklenir: F12 ile sınıfı bulun, sözlüğe bir grab ekleyin. Fiyat bloğu özellikle nişin ortalama sepetini değerlendiren arbitrajcılar için değerlidir.
Yorum analizi
Toplanan metinler basit analize çok uygun: bir-iki yıldızlı yorumlarda kelime sıklığını sayın ve müşterilerin rakiplere yönelik ana şikâyetlerinin listesini elde edin. Bunun için pandas ve standart kütüphaneden Counter yeterlidir. İleri seviye seçenek: Metinleri konuya göre (fiyat, kalite, hizmet, bekleme) sınıflandırmak için bir dil modelinden geçirmek.
Alternatif olarak resmî API
Büyük ticari projeler için Yandex'in işletme arama API'sini değerlendirin. İsim, adres, telefon ve kategorileri yapılandırılmış şekilde verir ve blok riski yaratmaz. İçinde yorum yoktur, limitler ücretlidir, ama iletişim veri tabanı toplamak için en temiz yoldur. O durumda kart kazıyıcı, yorumlar ve API'de bulunmayan alanlar için bir araç olarak kalır.
SSS: Yandex Haritalar kazıma hakkında sık sorulan sorular
Yandex Haritalar'dan işletme telefonu toplamak yasal mı?
Şirketlerin iletişim verileri kurumlar tarafından halka açık şekilde yayımlanmıştır ve kişisel veri sayılmaz. Kendi analiziniz için toplamak kabul edilebilir. Ancak bu numaraları izin olmadan toplu arama ve gönderim için kullanmak reklam yasasını ihlal eder. Ayrıca Yandex kullanıcı sözleşmesinin otomatik toplamaya ilişkin sınırlamalarını hatırlayın ve yükü minimumda tutun.
Tarayıcı olmadan normal requests istekleriyle idare edilemez mi?
Haritalar tamamen JavaScript koduyla çizilir. Sunucu neredeyse boş bir HTML gönderir, veriler sonradan yüklenir. requests, telefon ve adres içermeyen bir iskelet elde eder. Bu yüzden gerçek Chromium'lu Playwright gerekir.
Mobil proxy şart mı, evdeki IP ile kazıma yapılabilir mi?
Teknik olarak ilk 50-100 kart böyle de toplanır. Ama sonra captcha çıkar ve evdeki IP saatlerce kısıtlamaya girer, Yandex'i normal şekilde kullanamazsınız. Mobil proxy'ler sorunu iki şekilde çözer: Hücresel operatör adresi zaten daha çok güven uyandırır ve bağlantı üzerinden rotasyon, toplamayı durdurmadan yükü adresler arasında dağıtmanızı sağlar.
Bir proxy ile günde kaç kart toplanabilir?
Güvenli tempoda dakikada 8-12 kart, molalar ve her 30 kartta IP değişimiyle kesintisiz çalışmada günde yaklaşık 5-8 bin kart. Yorumlarla birlikte hacim iki-üç kat azalır, çünkü her yorum sayfası kaydırma gerektirir.
Yandex şablonu değiştirir ve kazıyıcı bozulursa ne yapmalı?
Bu olağan bir durumdur, yılda birkaç kez olur. Kartı açın, F12'ye basın, gerekli öğelerin yeni sınıflarını bulun ve koddaki yenilerini değiştirin. 10-15 dakika sürer. Süreci kolaylaştırmak için tüm seçicileri dosya başında tek bir sözlükte tutun.
Tek şehir yerine tüm bölgedeki işletmeleri nasıl toplarım?
Yerleşim yerlerinin listesini yapın ve collect_links.py'yi döngüde, adı QUERY'ye koyarak çalıştırın. Bağlantıları tek bir set'te birleştirin. Büyük şehirler için ek olarak ilçelere bölün, çünkü tek sorgu nadiren 500'den fazla sonuç verir.
Kazıyıcıyı tarayıcı penceresi olmadan arka planda çalıştırabilir miyim?
Evet, headless=True yapın. Ama bunu ancak seçicilerde hata ayıklayıp captcha çıkmadığından emin olduktan sonra yapın. Penceresiz modda sorunu fark etmek daha zordur ve bazı otomasyon işaretleri daha güçlü görünür. Bir denge: headless=True artı her hatada page.screenshot(path='error.png') ile sayfa ekran görüntüsü.
Ekrana bakmıyorsam betiğin captcha aldığını nasıl anlarım?
5. adımdaki is_captcha fonksiyonu sayfa adresini ve doğrulama bloğunun varlığını kontrol eder. Kendinize bildirim ekleyin, örneğin günlük dosyasına yazın ya da bot üzerinden mesajla haber verin; sorunu anında öğrenirsiniz.
Yorumlar tümü değil, yalnızca son yüz tanesi toplanıyor. Daha fazlasını nasıl alırım?
parse_reviews içindeki max_scrolls'u 50-100'e çıkarın. Unutmayın: Her kaydırma sunucuya ek bir istek demektir, bu yüzden binlerce yorumlu işletmeler için toplama birkaç dakika sürer ve daha sık IP değişimi gerektirir.
Bu yöntem hazır kazıma servislerinden neden daha iyi?
Alanları, tempoyu ve verinin tazeliğini tamamen siz kontrol edersiniz, satır başı ödeme yapmazsınız ve başkasının güncelleme takvimine bağlı kalmazsınız. Hazır servisler birkaç yüz kartlık tek seferlik işler için uygundur; kendi Yandex Haritalar kazıyıcınız ise ikinci toplamada kendini amorti eder.
Sonuç
Özetleyelim. Python ve Playwright'ı kurdunuz, mobil proxy'yi bağladınız ve IP değişimini kontrol ettiniz. Sorgu ve şehre göre işletme kartlarının bağlantılarını topladınız. Her kartı açan, gizli telefonu ortaya çıkaran ve isim, adres, site, puan ve çalışma saatlerini alan fonksiyonu yazdınız. Puanlı yorum toplamayı eklediniz. Kazıyıcıya programa göre IP değiştirmeyi ve captcha'ya doğru tepki vermeyi öğrettiniz. Son olarak verileri temizlediniz ve iki sayfalı düzenli bir Excel elde ettiniz.
Hatırlanması gereken en önemli şey: Yandex Haritalar kazıyıcısının dayanıklılığı hilelerde değil, üç şeyde yatar — insan temposu, mobil proxy'ler üzerinden düzenli adres rotasyonu ve ilk sinyalde durmaya hazır olmak. Kaynağa saygı duyan bir betik aylarca müdahalesiz çalışır.
Bundan sonra ne yapmalı?
- Kendi nişinizde ilk tam toplamayı çalıştırın ve beş-on kartı elle kontrol edin.
- Toplamayı iki haftada bir programa koyun ve değişiklik geçmişini biriktirmeye başlayın.
- Şablona daha az bağımlı olmak için ileri düzey bölümdeki JSON yanıtı yakalamayı deneyin.
- Hacim artıyorsa ikinci bir proxy kanalı ekleyip çalışmayı paralelleştirin.
Nereye gelişmeli?
Sonraki mantıklı adım, toplanan yorumların otomatik analizi ve tablonun CRM'iniz veya reklam hesabınızla bağlanmasıdır. Birden çok platformla çalışıyorsanız, aynı Playwright ve mobil proxy yaklaşımını dinamik yüklemeli herhangi bir siteye taşıyabilirsiniz. İlkeler aynı, yalnızca seçiciler değişir. İyi toplamalar ve temiz veriler!