İçerik: Giriş · Ön Hazırlık · Temel Kavramlar · Adım 1: Python ve kütüphanelerin kurulumu · Adım 2: Proxy olmadan hızlı test · Adım 3: Mobil proxy üzerinden istek yapma · Adım 4: IP rotasyonu · Adım 5: Hatalar, zaman aşımı ve tekrarlar · Adım 6: CAPTCHA işleme · Sonuç kontrolü · Tipik Hatalar · Gelişmiş Olanaklar · SSS · Sonuç

Giriş

Bu adım adım rehberde, Python çalışma ortamınızı ayarlayacak, mobil proxy üzerinden web sayfalarına isteklerde bulunacak, BeautifulSoup ile gerekli verileri parse edecek ve IP rotasyonu ile güvenli ve stabil bir şekilde çalışmayı öğreneceksiniz. Ağ istekleri için requests kütüphanesini ve HTML ayrıştırma için BeautifulSoup'u kullanacağız. Sonuç olarak, HTTP isteklerini mobil proxy üzerinden gönderen, mobil cihaz için başlıkları doğru bir şekilde değiştiren, hata durumlarında akıllı bir şekilde istekleri tekrarlayan, mobil proxy sağlayıcısının tarafında IP'leri döndüren, karşılaşılması durumunda CAPTCHA'yı nazik bir şekilde yöneten ve verileri kullanışlı bir formatta saklayan işlevsel bir parser elde edeceksiniz.

Bu rehber kimin için: web scraping ile yeni tanışanlar; basit ve güvenilir bir araca ihtiyaç duyan yan alan uzmanları (pazarlama, araştırma, OSINT); hızlı bir prototip oluşturup geliştirmek isteyen yazılımcılar için.

Önceden bilmeniz gerekenler: Bilgisayar ile temel düzeyde çalışma becerileri; dosya, klasör nedir ve komut istemcisinin nasıl açılacağını anlama; Python ile en azından temel bir tanışıklık avantajdır, ancak gerekli değildir çünkü adım adım ilerliyoruz. Önemli: Hedef sayfaları işlemek için yasal bir dayanağınız olmalı ve sitelerin kurallarına, robots.txt ve kullanıcı sözleşmelerine uymalısınız.

Ne kadar zaman alır: Eğer her şeyi sırayla yaparsanız 2-4 saat. Ortamın kurulumu ve hızlı bir test yaklaşık 30 dakika alacak. Mobil proxy'ye bağlanmak ve rotasyonu ayarlamak 40 dakikadan 1,5 saate kadar sürer. Hataların ve CAPTCHA'nın işlenmesi ise 30 ila 60 dakika alacaktır.

Tavsiye: Adım 4: IP rotasyonu ve Adım 5: Hatalar, zaman aşımı ve tekrarlar bölümlerinin bağlantısını kaydedin. Bu parçalar, hata ayıklama ve stabilite artırma için en sık ihtiyacınız olan yerlerdir.

⚠️ Uyarı: Tüm materyal, yasal scraping öğrenimi ve pratiği için sağlanmıştır. Erişim kısıtlamalarını aşmak için teknikler kullanmayın, yasaları ihlal etmeyin ve sitelerin kullanım koşullarını çiğnemeyin. Ayrıca VPN ve diğer yasakları aşma yöntemlerini tartışmıyoruz.

Ön Hazırlık

Gerekli araçlar ve erişimler: Windows, macOS veya Linux işletim sistemine sahip bir bilgisayar; internet erişimi; Python 3.11-3.13 (güncel sürüm önerilir) kurulu; pip paket yöneticisi; metin editörü (Visual Studio Code, PyCharm Community veya başka bir seçenek). Ayrıca mobil proxy sağlayıcınızda bir hesap oluşturmanız gerekecek. Örnek olarak, mobileproxy.space türü hizmetlerin sağladığı işlevsel gereksinimlere göz atabilirsiniz: ayrı bir proxy uç noktası, kullanıcı adı ve şifre ile veya IP üzerinden yetkilendirme, ayarlanabilir rotasyon (zamanlayıcıya veya API üzerinden), istek istatistikleri.

Sistem gereksinimleri: en az 4 GB RAM; Python ve kütüphaneler için diskte 1-2 GB boş alan; 10 Mbit/s'ten fazla stabil bir internet bağlantısı; program yüklemek için yeterli yetki. Yalnızca Python’u kurmak için admin haklarına ihtiyaç vardır (Windows'ta).

İndirmeniz ve kurmanız gerekenler: Python yükleyicisi; kod editörü (örneğin, VS Code); requests, beautifulsoup4, lxml (HTML'yi hızlandırılmış şekilde parse etmek için) kütüphaneleri.

Yedeklemeler oluşturmak (geçerliyse): mevcut projeleri değiştirmeden önce kodun bulunduğu klasörün bir kopyasını oluşturun. Projeyi ilk kez oluşturuyorsanız, ayrı bir çalışma dizini açın. Proxy erişim bilgilerini depo dışında saklayın ve mümkünse .env dosyası ile gizlilik yöneticisi kullanın.

Tavsiye: Projeyi, ismi boşluk ve Kiril alfabesi içermeyen bir klasör olarak oluşturun, örneğin parser_mobile_proxy. Bu, scriptlerin çalıştırılmasını kolaylaştırır ve yol hatalarını önler.

Temel Kavramlar

Açık bir dille anahtar terimler: parsing veya web scraping — web sayfalarından kamuya açık verilerin otomatik toplanmasıdır. requests — HTTP istekleri gerçekleştirmek için Python kütüphanesi. BeautifulSoup — HTML'yi ayrıştırmak ve içerik parçalarını etiketler, sınıflar, nitelikler üzerinden çıkarmak için kullanılan Python kütüphanesi. Proxy — isteği kendi adına siteye ileten ara sunucudur. Mobil proxy — mobil operatörlerin IP adreslerini kullanan proxy'dir. IP rotasyonu — belirli bir periyodiklikle veya komutla çıkış IP'sinin değiştirilmesidir.

Çalışma prensipleri: bir web sitesine HTTP isteği oluşturursunuz; isteğiniz mobil proxy üzerinden gider; site, adresi sizin değil proxy'nin gördüğü için; HTML sayfasını alırsınız ve BeautifulSoup ile onu ayrıştırırsınız.

Başlamadan önce bilmeniz gerekenler: robots.txt ve site kurallarına uyun; sunucuya sık sık istek göndermeyin; zaman aşımı kullanın; makul bir miktarda paralel istek gönderin; 4xx ve 5xx yanıt kodlarını işleyin. Mobil proxy, dolandırıcılık tetikleyicileri ve kısıtlamaların oluşma olasılığını azaltmaya yardımcı olur çünkü mobil IP aralıkları gerçek kullanıcılar tarafından aktif bir şekilde kullanılmaktadır. Ancak bu durum, sağlayıcının kalitesine, yük durumuna ve kodunuzun doğruluğuna bağlıdır.

⚠️ Uyarı: Yetkilendirmeyi aşmak veya kapalı bölümlere erişmek için parsing kullanmayın. Site işleyişine müdahale etmeyin. Sadece işlem hakkına sahip olduğunuz açık verilerle çalışın.

Adım 1: Python ve kütüphanelerin kurulumu

Aşamanın amacı

Python ve gerekli kütüphaneleri kuracağız, bir proje oluşturacak ve temel dosyaları hazırlayacağız. Bu adımın sonunda scriptleri çalıştırabilecek ve HTTP isteklerini gerçekleştirebileceksiniz.

Adım adım rehber

  1. Python'u resmi web sitesinden indirin ve kurun. Windows'ta kurulum sırasında Add Python to PATH seçeneğini işaretleyin. macOS'ta brew paket yöneticisini veya resmi yükleyiciyi kullanabilirsiniz. Linux'ta sisteminizin depolarını kullanın.
  2. Kurulumu kontrol edin. Terminali açın ve python --version veya python3 --version komutunu çalıştırın. Sürümün 3.11 ile 3.13 arasında olduğundan emin olun.
  3. Proje klasörü oluşturun, örneğin C:\Users\kullanıcı_adınız\parser_mobile_proxy veya /Users/kullanıcı_adınız/parser_mobile_proxy.
  4. Projeyi kod editöründe açın. main.py dosyasını ve requirements.txt dosyasını oluşturun.
  5. requirements.txt'ye şunları ekleyin: requests==2.32.3; beautifulsoup4==4.12.3; lxml==5.2.2.
  6. Pip install -r requirements.txt veya pip3 install -r requirements.txt komutuyla bağımlılıkları yükleyin.
  7. Kütüphanelerin yüklendiğini kontrol edin. Terminalde python -c "import requests, bs4, lxml; print('ok')" komutunu çalıştırın. ok çıktı alırsanız tamamdır.

Önemli noktalar

Önemli: Kütüphaneleri sanal bir ortamda kurun, böylece sürüm çakışmaları yaşanmaz. Python'u kurmak için python -m venv .venv komutuyla bir ortam oluşturup, ardından source .venv/bin/activate (macOS, Linux) veya .venv\Scripts\activate (Windows) komutunu kullanarak etkinleştirin, sonrasında pip install -r requirements.txt komutunu çalıştırın.

Tavsiye: Eğer admin haklarınız yoksa, pip install --user -r requirements.txt komutunu ya da sanal ortamda çalışmayı tercih edebilirsiniz.

Beklenen sonuç

Basit bir script çalıştırıp gerekli modülleri hatasız bir şekilde içe aktarabilirsiniz.

Olası sorunlar ve çözümleri

  • python komutu bulunamıyor. Çözüm: python3 kullanın veya PATH'in ayarlandığından emin olun. Python'u Add to PATH seçeneği ile yeniden kurun.
  • lxml sürüm çakışması. Çözüm: pip'i güncelleyin (python -m pip install --upgrade pip), ardından lxml'yi tekrar yükleyin.
  • Kurulumda yeterli yetki yok. Çözüm: sanal ortamı etkinleştirin veya --user bayrağını kullanın.

✅ Kontrol: python -c "import requests, bs4; print('ready')" komutu ready yazdırıyor, ayrıca main.py dosyasının proje klasöründe olduğunu görüyorsunuz.

Adım 2: Proxy olmadan hızlı test

Aşamanın amacı

requests + BeautifulSoup'un temel çerçevesinin çalıştığını anlamak, proxy ekleme aşamasına geçmeden önce. Test sayfasına standart bir istek yapacağız ve başlığı alacağız.

Adım adım rehber

  1. main.py dosyasını kod editöründe açın.
  2. İstek ve parse için temel kodu ekleyin.
  3. Script'i çalıştırın ve çıktıyı kontrol edin.

Örnek kod

import requests; from bs4 import BeautifulSoup; session = requests.Session(); session.headers.update({"User-Agent": "Mozilla/5.0 (Linux; Android 13; Pixel 7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0 Mobile Safari/537.36"}); url = "https://example.com"; resp = session.get(url, timeout=30); html = resp.text; soup = BeautifulSoup(html, "lxml"); title = soup.title.text.strip() if soup.title else "(no title tag)"; print("Durum:", resp.status_code, "Başlık:", title)

Önemli noktalar

Önemli: Mobil bir User-Agent kullanarak mobil tarayıcıyı taklit ediyoruz. Bu, bir sonraki adımda mobil proxy ile davranışın uyuşmasını sağlayacaktır.

Tavsiye: Hedef sayfa masaüstü ve mobil cihazlar için farklı versiyonlar dönebilir. Hata ayıklama amacıyla HTML'yi dosyaya kaydedin: open("sayfa.html", "w", encoding="utf-8").write(html). Böylece etiket yapısını inceleyebilirsiniz.

Beklenen sonuç

Script, yanıt kodunu ve sayfa başlığını yazdırır. Bu, parser'ın HTML'yi görebildiğinin ve onu ayrıştırabildiğinin temel bir kontrolüdür.

Olası sorunlar ve çözümleri

  • 403 veya 404 kodu. Çözüm: URL'yi kontrol edin; User-Agent'ı değiştirmeyi deneyin; sitenin erişilebilir olduğundan emin olun.
  • Zaman aşımı. Çözüm: zaman aşımını 60'a çıkarın, internet bağlantısını kontrol edin.
  • Yanlış kodlama. Çözüm: parsing'den önce resp.encoding = resp.apparent_encoding kullanın.

✅ Kontrol: 200 durumu ve Başlık: (sayfanın adı) satırını görüyorsunuz. Eğer HTML'yi kaydettiyseniz, klasörde sayfa.html dosyası da oluşabilir.

Adım 3: Mobil proxy üzerinden istek yapma

Aşamanın amacı

Mobil proxy'yi requests'e bağlamak, bir istek yapmak ve trafiğin gerçekten proxy üzerinden mi yoksa doğrudan mı gittiğini kontrol etmek. Ayrıca kimlik doğrulamayı ekleyip başlıkları kontrol edeceğiz.

Hazırlık yapmanız gerekenler

Mobil proxy'nizin verileri: host (örneğin, proxy.provider.local veya IP adresi), port (örn, 12345), kimlik doğrulama için kullanıcı adı ve şifre ya da IP üzerinden doğrulama için onaylı beyaz liste. Çoğu mobil sağlayıcı, mobileproxy.space düzeyindeki çözümler dahil, bu parametreleri kişisel panelde sunar.

Adım adım rehber

  1. main.py dosyasını açın.
  2. Proxy verileriyle birlikte bir proxies sözlüğü ekleyin.
  3. Session.get ile proxies parametresini kullanarak isteği gönderin.
  4. Cevabın geldiğini kontrol edin ve sayfayı parse edin.

Örnek kod

import requests; from bs4 import BeautifulSoup; PROXY_HOST = "PROXY_HOST"; PROXY_PORT = 12345; PROXY_USER = "USER"; PROXY_PASS = "PASS"; proxy_auth = f"http://{PROXY_USER}:{PROXY_PASS}@{PROXY_HOST}:{PROXY_PORT}"; proxies = {"http": proxy_auth, "https": proxy_auth}; session = requests.Session(); session.headers.update({"User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 16_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.2 Mobile/15E148 Safari/604.1", "Accept-Language": "tr-TR,tr;q=0.9,en-US;q=0.8,en;q=0.7"}); url = "https://example.com"; resp = session.get(url, proxies=proxies, timeout=45); print("HTTP:", resp.status_code); soup = BeautifulSoup(resp.text, "lxml"); print("BAŞLIK:", soup.title.text.strip() if soup.title else "(yok)")

Önemli noktalar

Önemli: Eğer sağlayıcınızın IP'den yetkilendirme varsa, proxies formatını kullanıcı adı ve şifre olmadan kullanmalısınız: "http": f"http://{PROXY_HOST}:{PROXY_PORT}". Şu anki IP'nizin sağlayıcının panelinde beyaz listedeyle kaydedildiğinden emin olun.

Tavsiye: İlk çalıştırdığınızda yalnızca TLS hatalarının tanısı için verify=False parametresini ekleyin. Bunu üretim ortamında bırakmayın. Sağlayıcı gerekiyorsa kök sertifikalarını yükleyin.

Tavsiye: Proxy ayarlarınızı bir .env dosyasına kaydedin: PROXY_HOST, PROXY_PORT, PROXY_USER, PROXY_PASS. Bunları os.getenv veya python-dotenv kütüphanesi ile yükleyerek kod içinde gizli bilgileri saklamayın.

Beklenen sonuç

200 kodunu ve geçerli bir başlığı alıyorsunuz. Eğer IP'nizi gösteren bir sayfadaysanız, IP'niz mobil proxy'nin IP'sinden farklı olacaktır (sağlayıcının kontrol paneline bakın).

Olası sorunlar ve çözümleri

  • 407 Proxy Authentication Required. Çözüm: kullanıcı adı ve şifreyi kontrol edin; kimlik doğrulama için doğru URL formatını kullandığınızdan emin olun.
  • 403 Forbidden. Çözüm: User-Agent'ı mobil olanla değiştirin; Accept-Language başlıklarını kontrol edin; isteklerin sıklığını azaltın.
  • ConnectionError veya ReadTimeout. Çözüm: zaman aşımını artırın, sağladığınız proxy'nin stabilitesini kontrol edin, istekleri backoff ile tekrarlayın.

✅ Kontrol: Cevap 200 kodu ile geliyor. Başlık doğru. IP'nizi gösteren bir sayfada test ediyorsanız, IP'niz mobil proxy'nın IP'sine uyuyor (sağlayıcının kontrol paneline bakın).

Adım 4: IP adreslerinin güvenli ve öngörülebilir bir şekilde rotasyonu

Aşamanın amacı

Mobil proxy'nin IP'sinin zamanlayıcıya veya API komutuna göre değiştirilmesini ayarlamak. Bu, parsing'in sürdürülebilirliğini artırır ve koruma sınırlamalarına karşı riskleri azaltır. İki yöntem uygulayacağız: proxy uç noktaları için döngüsel liste ve tek bir uç noktada API veya zamanlayıcıya göre rotasyon.

Adım adım rehber

  1. Rotasyon stratejisini belirleyin: zamanla (örneğin, her 5-10 dakikada bir), istek sayısına göre (örneğin, her 10-20 istekte bir) veya karmaşık olarak.
  2. Birden fazla proxy uç noktası varsa, bir liste oluşturun ve round-robin değişimini uygulayın.
  3. Sağlayıcınızın tek bir uç nokta için IP değiştirme API'si varsa, kodunuza çağrıyı ekleyin ve onaylı rotasyon penceresini bekleyin (genellikle 10-60 saniye).
  4. Sağlayıcının sınırlamalarını dikkate alın: minimum rotasyon aralığı ve günlük API çağrıları sınırı.
  5. Rotasyon sonrası IP'yi kontrol etmek için gecikmeler ve denetimler ekleyin, yeni IP'nin etkin olduğunu doğrulayın.

Birden fazla uç noktadan round-robin örneği

import itertools, requests; from bs4 import BeautifulSoup; proxies_list = [ {"http": "http://user1:pass1@host1:10001", "https": "http://user1:pass1@host1:10001"}, {"http": "http://user2:pass2@host2:10002", "https": "http://user2:pass2@host2:10002"} ]; cycle = itertools.cycle(proxies_list); def fetch(url): s = requests.Session(); s.headers.update({"User-Agent": "Mozilla/5.0 (Linux; Android 14) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0 Mobile Safari/537.36"}); proxies = next(cycle); r = s.get(url, proxies=proxies, timeout=45); return r; r = fetch("https://example.com/catalog"); print(r.status_code)

API ile bir uç nokta içinde rotasyon örneği

Çoğu mobil proxy sağlayıcısı, mobilproxy.space gibi, tek bir uç noktada IP değiştirme olanağı verir, bu bir zamanlayıcıya göre (örneğin, her N dakikada bir) ya da API'den gelen bir talebe bağlıdır. Kodda, bu sağlayıcının yardımcı URL'sine yapılan ek bir istek olarak görünür. Aşağıda genel bir şablon verilmiştir. URL'yi ve token'i sağlayıcınızın panelinden alın. Sınırlamaları ve rotasyon pencerelerini dikkate alın.

import time, requests; def rotate_ip(api_rotate_url, timeout=30): try: r = requests.get(api_rotate_url, timeout=timeout); return r.status_code, r.text; except Exception as e: return None, str(e); api_url = "http://PROXY_HOST:PORT/changeip?token=YOUR_TOKEN"; status, body = rotate_ip(api_url); print("ROTASYON:", status, body); time.sleep(20); # rotasyon penceresi için bekleyin; s = requests.Session(); proxies = {"http": "http://USER:PASS@PROXY_HOST:PORT", "https": "http://USER:PASS@PROXY_HOST:PORT"}; resp = s.get("https://example.com", proxies=proxies, timeout=45); print(resp.status_code)

Önemli noktalar

Önemli: Rotasyon, sihirli bir çözüm değildir. Eğer kısa bir süre içinde çok fazla istek yaparsanız, koruma saldırı tetikleyicileri devreye girebilir. Orta düzeyde bir sıklık tutun, rastgele gecikmeler ve geriye dönüşler kullanın.

Tavsiye: Rotasyonu saatlik ve yük durumuna göre planlayın. Örneğin, her 10-20 dakikada bir rotasyon yapın ve ayrıca her 15-25 istekte bir değişimini gerçekleştirin. Bu, davranışı yumuşatır ve doğal görünmesini sağlar.

Tavsiye: İsteklerin metadata'sını saklayın: hangi proxy'nin kullanıldığını, hangi IP'nin mevcut olduğunu, sunucunun ne tür bir yanıt verdiğini. Bu, hata ayıklamayı hızlandırır.

Beklenen sonuç

Kodunuz, proxy uç noktalarını istikrarlı bir şekilde değiştirecek veya tek bir uç noktada IP değişikliğini başlatacak ve rotasyon penceresini bekleyecektir. Değişiklik sonrası tekrar herhangi bir 200 durumu ile talepler devam edecek.

Olası sorunlar ve çözümleri

  • API çağrısının ardından IP değişmiyor. Çözüm: daha uzun bekleyin, limitleri kontrol edin; doğru URL çağırdığınızdan ve token'in geçerliliğinden emin olun; sağlayıcının panelinden istatistikleri inceleyin.
  • Rotasyon anında erişim kaybı yaşıyorsunuz. Çözüm: rotasyon esnasında başka bir uç noktaya geçin, round-robin'de yedek bir yol kullanın.
  • Fazla 429 Too Many Requests hatası alıyorsunuz. Çözüm: İstek aralıklarını artırın, toplam eşzamanlı akış sayısını azaltın.

✅ Kontrol: Mevcut IP'nizi loglarda düzenli olarak yazdırıyorsanız, adresin rotasyon stratejinize uyduğunu göreceksiniz ve isteklerin durum kodları 200-299 arasındadır.

Adım 5: Hataların, zaman aşımının ve tekrarların işlenmesi

Aşamanın amacı

Parser'ınızın ağ hatalarına ve sunucu geçici hatalarına dayanıklı olmasını sağlamak. Zaman aşımını, tekrarları, rastgele gecikmeyi ve loglamayı ekleyeceğiz.

Adım adım rehber

  1. Maksimum tekrar sayısını (örneğin, 3-5) ve temel gecikmeyi (örneğin, 1-2 saniye) belirleyin.
  2. Her başarısızlıkta beklemeyi 2 katına çıkararak rastgele bir gürültü ekleyerek backoff uygulayın.
  3. 5xx ve 429 kodlarını geçici olarak, 4xx kodlarını ise dikkatle ele alın (403 genellikle sürekli bir engellemedir).
  4. Her adımda ne olduğunu anlamak için anlaşılır loglar ekleyin.
  5. Network çağrısını yeniden kullanımı kolay bir fetch_safely fonksiyonuna kapsayıcı hale getirin.

Örnek kod

import time, random, requests; from bs4 import BeautifulSoup; def fetch_safely(url, session, proxies=None, max_retries=4, base_delay=1.5, timeout=45): attempt = 0; while attempt <= max_retries: try: r = session.get(url, proxies=proxies, timeout=timeout); if r.status_code in (200, 201): return r; elif r.status_code in (429, 500, 502, 503, 504): delay = base_delay * (2 ** attempt) + random.uniform(0.0, 0.7); time.sleep(delay); attempt += 1; continue; elif r.status_code == 403: return r; else: return r; except (requests.exceptions.ConnectTimeout, requests.exceptions.ReadTimeout, requests.exceptions.ConnectionError) as e: delay = base_delay * (2 ** attempt) + random.uniform(0.1, 0.9); time.sleep(delay); attempt += 1; continue; return None

Önemli noktalar

Önemli: Mantıklı zaman aşım süreleri ayarlayın: stabil olmayan kanallar için 30-60 saniye, hızlı ağlar için 10-20 saniye. Kritik bir gerekçe yoksa SSL'yi devre dışı bırakmayın.

Tavsiye: Loglar için logging modülünü kullanın. Başlangıçta minimum bir yapılandırma ekleyin: logging.basicConfig(level=logging.INFO, format="%(asctime)s [%(levelname)s] %(message)s"). Bu, belirti teşhisi için yararlıdır.

Tavsiye: "Geçici hatalar" ve "kalıcı başarısızlıklar" olarak ayrı kategoriler oluşturun. Geçiciler - tekrar edin; kalıcılar - durumu kaydedin ve diğer göreve geçin, böylece döngüye girmeyin.

Beklenen sonuç

Script, geçici hatalarla çalışmaya devam eder ve yanıt döndürür ya da düzgün bir şekilde bir sonraki göreve geçer, çökmeksizin.

Olası sorunlar ve çözümleri

  • Tekrarlar işe yaramıyor, hep 429. Çözüm: İstek sıklığını azaltın, gecikmeleri uzatın, IP rotasyonları arasındaki aralığı artırın.
  • Sürekli 403. Çözüm: Sitelerin politikasını netleştirin, başlıkların doğruluğunu kontrol edin, sıklığı azaltın, gerekirse resmi API'leri kullanın.
  • Sık ConnectionError. Çözüm: Mobil proxy sağlayıcınızı kontrol edin; belki başka bir bölgeden veya porttan başka bir proxy gerekebilir.

✅ Kontrol: Başarımsız durumu simüle ettiğinizde, loglarda artan gecikme ile tekrarları görmektesiniz. 1-2 denemeden sonra, birçok isteğin başarılı olduğu sonucunu alıyorsunuz.

Adım 6: CAPTCHA'yı yasal bir şekilde tespit etme ve işleme

Aşamanın amacı

Sayfanın bir CAPTCHA döndürdüğünü tanımayı ve nazikçe reaksiyon göstermeyi öğrenmek: yükü azaltmak, geçici olarak istekleri duraklatmak, IP rotasyonunu nazikçe ve akıllıca kullanmak. Koruma aşmayı değil, dürüst bir scraping çerçevesinde çalışıyoruz.

Adım adım rehber

  1. Hedef sitelerde CAPTCHA belirtilerini tanımlayın: HTML'deki anahtar kelimeler (captcha, g-recaptcha), alışılmadık alanları olan formlar, geçici sayfalar.
  2. HTML içeriğini ayrıştırmadan önce kontrol için kodunuza ekleyin.
  3. Eğer CAPTCHA'sı korunduysa, nazik işlem yapın: bekleme süresini artırın; alan üzerindeki sıklığı azaltın; IP rotasyonunu başlatın; tekrar talep edin.
  4. Eğer CAPTCHA devam ediyorsa, otomatik denemeleri sonlandırın ve sitenin şartlarını inceleyin. Belki veriler resmi API üzerinden mevcuttur.

Örnek kod

from bs4 import BeautifulSoup; import time, requests; def is_captcha(html): text = html.lower(); hints = ["captcha", "g-recaptcha", "hcaptcha", "distil", "cloudflare", "please verify", "are you a human"]; return any(h in text for h in hints); def get_with_captcha_handling(url, session, proxies, rotate_func=None): r = session.get(url, proxies=proxies, timeout=45); if r.status_code == 200 and not is_captcha(r.text): return r; time.sleep(10); if rotate_func: try: rotate_func(); time.sleep(20); except Exception: pass; r2 = session.get(url, proxies=proxies, timeout=60); return r2

Önemli noktalar

Önemli: CAPTCHA devam ediyorsa, tarama yoğunluğunu azaltın, bir sonraki rotasyon penceresini bekleyin veya başka bir uç noktaya geçin. Sayfanın kurallarını ve dürüstlüğünü göz önünde bulundurun.

Tavsiye: Bazen CAPTCHA sadece belirli yollar için gösterilmektedir. Sadece bu yollar için daha düşük sıklık ayarlayın, tüm alan için değil. Bu, genel hızı koruyacaktır.

⚠️ Uyarı: Üçüncü taraf hizmetler, geçici aşma scriptleri, tarayıcı emülasyon teknikleri ile geçiş yolları kullanılmasını tartışmıyoruz. Yalnızca izin verilen yöntemlerle çalışın, varsa resmi API'leri kullanın.

Beklenen sonuç

Script, CAPTCHA'ya nazikçe yanıt verme yeteneğine sahiptir: bir bekleme süresi yapar, IP değişikliğini başlatır (varsa) ve yeniden talep eder. Bu, yanlışladı oranını azaltır ve stabiliteyi korur.

Olası sorunlar ve çözümleri

  • Her istekte CAPTCHA. Çözüm: sıklığı radikal bir şekilde azaltın, istekler arası bekleme süresini farklılaştırın, sağlayıcınızın (varsa) saat dilimini veya bölgesini değiştirin, robots.txt'i inceleyin.
  • CAPTCHA kayboluyor, ancak veriler instabil. Çözüm: zaman aşımını artırın, HTML'yi saklayın ve analiz edin, farklı IP'lerdeki sayfa versiyonlarını karşılaştırın.

✅ Kontrol: Belirli bir tetikleyici (örneğin, kısa süre içinde sık talepler) karşısında, loglarda duraksamalar ve rotasyon görüyorsunuz, ardından başarılı ayıtlar elde ediyorsunuz.

Sonuç kontrolü

Kontrol listesi

  • Python kurulu, bağımlılıklar yüklendi.
  • Script, proxy olmadan HTML alıyor ve başlığı parse ediyor.
  • Mobil proxy ile script 200 durumu döndürüyor.
  • IP rotasyonu etkin ve kontrol edildi.
  • Hatalar durumunda tekrarlar çalışıyor, zaman aşım süreleri ayarlandı.
  • CAPTCHA belirtilerini işleme koyma mevcut.
  • Veriler beklenildiği gibi bir dosyaya kaydediliyor ya da konsolda yazdırılıyor.

Nasıl test edilir

  1. Proxy olmadan temel bir talep yapın ve başlık parsing'inin çalıştığını kontrol edin.
  2. Proxy ekleyin ve talebi tekrarlayın, sonuçları karşılaştırın.
  3. Sağlayıcıdan IP değişimini talep edin (varsa) ve 20-60 saniye sonra tekrar talep edin.
  4. Zaman aşımını 1-2 saniyeye düşürün ve tekrarların backoff ile açılmasını, ardından zaman aşımının geri döndüğünü kontrol edin.
  5. Birçok istekle bir siteyi yükleyin ve CAPTCHA belirtileri göründüğünde bekleme sürelerini ayarladığınızdan ve gerektiğinde rotasyonun etkinleştiğinden emin olun.

Başarılı sonuçların göstergeleri

  • Başarılı istek oranı "sakin" sitelerde %90'ın üzerinde.
  • 429 ve 5xx kodları nadir görülür ve tekrarlamalarla ele alınır.
  • IP rotasyonu belirlenen şekilde gerçekleşir, uzun beklemeler olmadan.

Tavsiye: "Yanıt süresi" ve "tekrar sayısı" metriğini uygulayın ve loglayın. Bu, rotasyon stratejinizi veya istek sıklığınızı değiştirmeniz gereken zamanı anlamanızı sağlar.

Tipik hatalar ve çözümleri

  • Sorun: 407 Proxy Authentication Required. Sebebi: yanlış kullanıcı adı ya da şifre, proxy URL'sinin hatalı oluşturulması. Çözüm: http://USER:PASS@HOST:PORT formatını yeniden kontrol edin, gereksiz karakterler ve boşluk olmadığından emin olun; eğer yetkilendirme IP üzerindeyse kullanıcı adı ve şifreyi kaldırın.
  • Sorun: 403 Forbidden. Sebebi: sitenin koruma mekanizması devreye girdi, uygun User-Agent veya fazla istek. Çözüm: mobil User-Agent kullanın, sıklığı azaltın, IP rotasyonu ekleyin, Accept, Accept-Language ve Referer başlıklarını kontrol edin.
  • Sorun: 429 Too Many Requests. Sebebi: limit aşımı. Çözüm: eksponensiyel backoff ekleyin, gecikmeleri artırın, rotasyonu daha seyrek yapın, istekleri günün farklı saatlerine dağıtın.
  • Sorun: ConnectionError veya ReadTimeout. Sebebi: proxy'nin dengesiz bağlantısı veya aşırı yüklenmiş ağ. Çözüm: zaman aşımını artırın, backoff ile tekrar edin, yedek uç nokta kullanın.
  • Sorun: yanlış parsing, boş veriler. Sebebi: HTML yapısı değişti ya da içerik JavaScript ile yükleniyor. Çözüm: BeautifulSoup seçimlerini güncelleyin; veriler dinamik olarak üretiliyorsa, sayfanın ağ taleplerini inceleyin ve resmi JSON uç noktalarını kullanın, eğer mevcutsa ve izinli ise.
  • Sorun: her sayfada CAPTCHA. Sebebi: agresif yükleme veya şüpheli aktiviteler. Çözüm: sıklığı azaltın, gecikmeleri artırın, rotasyonu kullanın, başlıkların doğruluğunu ve robots.txt'ye uyumu kontrol edin.
  • Sorun: birkaç başarılı istektan sonra engellenme. Sebebi: scriptin öngörülebilir davranışı. Çözüm: rastgele bekleme süreleri uygulayın, istek sırasını değiştirtin, diğer proxy'ler arasında dolaşın, başlıkları güncelleyin.

Tavsiye: Olay öncesi ve sonrası HTML örneklerini saklayın. Bu, tasarımın değişimini, anti-bot koruma belirtilerinden hızlı bir şekilde ayırmanıza yardımcı olacaktır.

Gelişmiş imkanlar

İleri Düzey Ayarlar

  • Oturum ve çerezler: requests.Session kullanarak çerezleri otomatik saklayın, bu davranışı gerçek tarayıcıya yaklaştırır.
  • Başlıklar: ihtiyaç duyulduğunda Accept, Accept-Language, Referer ve DNT ekleyin. Mobil ajanslar havuzundan User-Agent'ı değiştirin.
  • SOCKS proxy: gerekli ise requests[socks] ile bağlanın. Ancak mobil proxy'ler genellikle HTTP(S) olarak sağlanır.
  • CSV veya JSON'a kaydetme: parsing'den sonra verileri dosyalara kaydedin. Bu, entegrasyonlar için kullanışlıdır.

Bir mini parsing pipeline örneği

import csv, requests, time; from bs4 import BeautifulSoup; MOBILE_UA = "Mozilla/5.0 (Linux; Android 14) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0 Mobile Safari/537.36"; session = requests.Session(); session.headers.update({"User-Agent": MOBILE_UA}); proxies = {"http": "http://USER:PASS@HOST:PORT", "https": "http://USER:PASS@HOST:PORT"}; urls = ["https://example.com/page1", "https://example.com/page2"]; rows = []; for u in urls: r = session.get(u, proxies=proxies, timeout=45); if r.status_code == 200: s = BeautifulSoup(r.text, "lxml"); title = s.title.text.strip() if s.title else ""; rows.append({"url": u, "title": title}); time.sleep(2); open("data.csv", "w", newline="", encoding="utf-8"); with open("data.csv", "w", newline="", encoding="utf-8") as f: w = csv.DictWriter(f, fieldnames=["url","title"]); w.writeheader(); w.writerows(rows); print("kaydedildi:", len(rows))

Optimizasyon

  • Paket işleme: istekleri yavaşlama ve rotasyon sürelerini göz önünde bulundurarak alanlara göre gruplandırın.
  • Önbellekleme: zaten elde edilen sayfaları yerel olarak saklayarak tekrar talep etmeyin.
  • Süre dayanıklılığı stratejisi: istek zamanlamalarını "yoğun olmayan" saatlere planlayın, site daha az yoğun olduğunda.

Tavsiye: Eğer birçok göreviniz varsa, onları daha küçük partilere ayırın ve sırayla yürütün. Bu, stabiliteyi artırır ve CAPTCHA alma durumunu azaltır.

Tavsiye: Birçok mobil proxy sağlayıcısının (mobilproxy.space gibi) görsel istatistik sunan kontrol panelleri bulunmaktadır. Zamanı, sıklığı ve yanıt kodlarını kontrol ederek, daha doğru rotasyon yapma zamanını anlamamızı sağlar.

SSS

Soru: İsteğin kesinlikle mobil proxy üzerinden gittiğini nasıl anlayabilirim? Cevap: Sağlayıcının kontrol panelinde aktif bağlantıları ve mevcut dış IP'yi kontrol edin, bunu sayfanın yanıtlarından görülenle karşılaştırın. Ayrıca sağlayıcı genelde uç noktalara yapılan istatistikleri gösterir.

Soru: User-Agent'ı Android mi yoksa iOS mu seçmeliyim? Cevap: İçeriğinizin çalıştığı platforma göre seçin (web sitesinin mobil versiyonu). Genellikle Android ajansı tutarlı sonuçlar verir. Her ikisini de test edin ve daha az hata alanını kaydedin.

Soru: Parsing sırasında IP'yi ne sıklıkta değiştirmeliyim? Cevap: Temel öneri: 10-20 dakikada bir veya bir alan üzerinde 15-25 istekten sonra en geç.

Soru: Site içeriklerini JavaScript üzerinden veriyor ise ne yapmalıyım? Cevap: Sayfanın ağ taleplerini inceleyin (tarayıcı geliştirici araçlarında). Veriler genellikle JSON uç noktaları üzerinden gelir. Erişimin yasal ve kurallara uygun olması durumunda, bu uç noktaları kullanın. Aksi takdirde, sitenin kurallarına göz atın.

Soru: Birden fazla mobil sağlayıcıyı bir arada kullanabilir miyim? Cevap: Evet, eğer bu yük dağılımı için gerekli ise. Round-robin ayarlayın ve her sağlayıcının limitlerine dikkat edin.

Soru: Kimlik bilgilerini güvenli bir şekilde nasıl saklayabilirim? Cevap: Ortam değişkenleri ve .env dosyası kullanın, gizli bilgileri repoya kaydetmeyin. Üretim aşamasında gizli bilgileri gizlilik yöneticilerinde saklayın.

Soru: Kütüphaneyi toplu hatalar halinde durdurmanın en iyi yolu nedir? Cevap: Başarısız denemeleri sayın ve üst sınır koyun. Eğer ardışık N alan isteğinden sonra hepsi başarısız oluyorsa, uzun bir bekleme yapın, olayları loglayın ve işlemi sonlandırın.

Soru: Eğer lxml'i kullanıyorsam, html.parser yeterli midir? Cevap: Yerleşik parser basit durumlar için uygundur. lxml, hatalı HTML'ye karşı daha hızlı ve dayanıklıdır. Düzenli parsing için lxml önerilir.

Soru: Site stilini değiştirdiğinde ne yapmalıyım? Cevap: Test sayfalarını saklayın, seçimlerde geri alma kontrolü ekleyin. Değişikliklerde, BeautifulSoup mantığını güncelleyin ve yeni yapıya göre adaptör fonksiyonları yazın.

Soru: Mobil proxy kullanmama neden gerek var, o zaman sıradan bir proxy de çalışıyor? Cevap: Mobil adresler, mobil ağların ve trafiğin dağılım durumlarından dolayı genellikle daha az şüphe uyandırır. Bu, makul bir yük altında stabil cevaplar alma şansını artırır.

Sonuç

Yapılan işlemlerin özeti: Python ve requests ile BeautifulSoup kütüphanelerini kurdunuz, proxy olmadan temel parsing'i kontrol ettiniz, mobil proxy eklediniz ve isteklerin bu proxy üzerinden gittiğinden emin oldunuz, IP rotasyonunu farklı yöntemlerle ayarladınız, hata işleme ve CAPTCHA için nazik tepkileri uyguladınız. Artık kamuya açık verileri sürdürülebilir ve dürüst bir şekilde scrapping için bir temel projeniz var.

Sonraki adımlar: Kendi hedeflerinize göre parser'ı geliştirin - yeni seçimler ekleyin, verileri bir veritabanına kaydedin, çalıştırma programları ayarlayın. Başarılı istek oranında düşüş veya 429 ve 403 statüsünde artış olup olmadığını kontrol eden alarmları ekleyin. Yönetim parametreleri için yapılandırma dosyası oluşturun (sıklık, rotasyon, zaman aşım süreleri).

Gelişeceğiniz konular: Python'da asenkron talepler (aiohttp), görev kuyrukları (Celery, RQ), veri saklama ve analiz (SQLite, PostgreSQL, Pandas). Ayrıca veri işleme ve web siteleri ile yasal etkileşimlerin hukuki yönlerini ve erişilen verilerin resmi yollarını inceleyin. Mobil proxy'ler için modern mobileproxy.space düzeyinde sağlanan esnek rotasyon, istatistik, çeşitli bölgeler ve istikrarlı destek sunan fonksiyonlar kullanabilirsiniz.

Tavsiye: Bu rehberi kaydedin ve Adım 4: IP rotasyonu ve Adım 5: Hatalar, zaman aşımı ve tekrarlar bölümlerine sık sık geri dönün. Bunlar temel stabilite artırımları sağlar ve duraksamalardan kaçınmanıza yardımcı olur.

⚠️ Uyarı: Hedef sitelerin robots.txt ve kullanım koşullarını her zaman kontrol edin. Eğer kurallar otomatik veri toplamayı yasaklıyorsa, yasaklara saygı gösterin ve açık veya ücretli API'ler gibi yasal alternatifler arayın.