Haber siteleri, internetteki en korunaklı kaynaklardan biridir. Cloudflare, oran sınırlaması, IP engellemeleri — bunların hepsi haber parçalama işlemini ciddi bir teknik zorluk haline getiriyor. Bu rehberde, haber portallarından veri toplamak için proxy'yi nasıl doğru bir şekilde ayarlayacağımızı, farklı görevler için hangi proxy türünü seçeceğimizi ve modern koruma sistemlerini nasıl aşacağımızı inceleyeceğiz.
Haber siteleri neden parçaları engelliyor
Haber portalları, birkaç nedenle otomatik veri toplamaya karşı özellikle hassastır. Öncelikle, içerik — onların ana varlığıdır ve bunu reklamlar ve abonelikler aracılığıyla monetize ederler. Toplu parçalama, rakiplerin materyalleri kopyalamasına olanak tanır ve benzersiz ziyaretçi sayısını azaltır. İkincisi, botlardan gelen yüksek yük, sunucu ve CDN maliyetlerini artırır.
Modern haber siteleri çok katmanlı bir koruma kullanıyor:
- Cloudflare ve benzerleri — JavaScript, TLS parmak izleri, davranışsal kalıpları kontrol eder
- Oran sınırlaması — bir IP'den gelen istek sayısını sınırlar (genellikle dakikada 10-50 istek)
- User-Agent ile engelleme — standart kütüphane başlıklarını yasaklar (Python-requests, curl)
- CAPTCHA — şüpheli etkinlik durumunda gösterilir
- Coğrafi engellemeler — bazı haber portalları yalnızca belirli ülkelerden erişilebilir
Haber sitelerinin parçaları tespit etmesinin tipik belirtileri: aynı IP'nin ardışık olarak çok sayıda istek yapması, JavaScript'in olmaması, HTTP başlıklarının standart dışı sıralaması, isteklerin çok hızlı bir hızı (bir insan saniyede 10 sayfa açamaz), çerezlerin ve referansın olmaması.
Önemli: Haber sitelerinin parçalanması gri bir alandadır. Her zaman hedef kaynağın robots.txt ve Hizmet Şartlarını kontrol edin. Ticari veri kullanımı için resmi API'leri kullanmak veya ortaklık anlaşmaları yapmak önerilir.
Haber parçalamak için hangi proxy türü seçilmeli
Proxy türü seçimi, görevin ölçeğine, bütçeye ve hedef sitelerin koruma seviyesine bağlıdır. Haber parçalama için üç ana seçeneği ve bunların uygulanabilirliğini inceleyelim.
| Proxy Türü | Hız | Maliyet | Ne Zaman Kullanılmalı |
|---|---|---|---|
| Veri merkezi proxy'leri | Yüksek (50-100 ms) | Düşük | Cloudflare olmayan siteler, büyük veri hacmi, test etme |
| Konut proxy'leri | Orta (200-500 ms) | Yüksek | Cloudflare olan siteler, sıkı koruma, coğrafi hedefleme |
| Mobil proxy'ler | Orta (300-600 ms) | Çok yüksek | Maksimum koruma, haber sitelerinin mobil versiyonları |
Haber parçalamak için veri merkezi proxy'leri
Ciddi bir koruma olmayan haber siteleri için uygundur: yerel yayınlar, bloglar, küçük bilgi portalları. Avantajları: yüksek hız (yüzlerce kaynağı parçalama sırasında önemlidir), düşük maliyet (50-100 IP'lik bir havuz kiralanabilir), stabil bağlantı.
Dezavantajları: ASN ile kolayca tespit edilir (veri merkezine ait olduğu), genellikle büyük sitelerin kara listelerine alınmıştır, Cloudflare Challenge'ı %70 oranında geçemez. Veri merkezi proxy'lerini RSS akışlarını, sitemap.xml'yi, API uç noktalarını toplamak veya tam içeriği indirmeden meta verileri (başlıklar, yayın tarihleri) toplamak için kullanın.
Konut proxy'leri — altın standart
Konut proxy'leri, internet servis sağlayıcıları tarafından sağlanan gerçek ev kullanıcılarının IP adresleridir. Haber siteleri için normal ziyaretçiler gibi görünürler, bu da korumalı kaynaklarla çalışırken kritik öneme sahiptir.
Konut proxy'lerinin zorunlu olduğu durumlar: büyük haber portallarının parçalanması (CNN, BBC, Reuters, RBK, Kommersant), Cloudflare veya benzeri koruma olan siteler, belirli ülkelerden veri toplama (coğrafi hedefleme), oturum açma ile uzun süreli oturumlar. Konut proxy'leri, Cloudflare'ın JavaScript kontrollerini geçer, temiz bir IP itibarı vardır, yapışkan oturumları destekler (IP'yi 10-30 dakika boyunca sabit tutma).
Pratik bir öneri: zamanla rotasyon yapan konut proxy'lerini kullanın (yapışkan oturumlar), istek başına değil. Örneğin, bir IP 10 dakika çalışır, 20-30 makale toplar, ardından değişir. Bu, her istekte IP değişiminden daha doğal görünür.
Özel durumlar için mobil proxy'ler
Mobil proxy'ler, mobil operatörlerin IP'lerini (MTS, Beeline, Tele2) kullanır. Maksimum güvenilirliğe sahiptirler, çünkü milyonlarca insan haber okumak için mobil internet kullanır. Bunları, haber sitelerinin mobil versiyonlarını (genellikle basitleştirilmiş koruma vardır), aşırı sıkı koruma olan siteleri, Google News AMP sayfalarını parçalamak için uygulayın.
Mobil proxy'lerin özelliği: IP sıklıkla otomatik olarak değişir (mobil operatörler CGNAT kullanır), bir IP aynı anda yüzlerce kullanıcıda olabilir, bu da engellemeyi anlamsız hale getirir. Dezavantajı — yüksek fiyat, bu yüzden yalnızca en korunaklı hedefler için noktasal olarak kullanın.
Cloudflare ve diğer anti-bot sistemlerinin aşılması
Cloudflare, haber sitelerinin parçaları için en büyük düşmandır. Büyük haber portallarının yaklaşık %40'ı botlara karşı koruma için Cloudflare kullanıyor. Standart kütüphaneler (requests, urllib) kontrolü geçemez, çünkü Cloudflare TLS parmak izini, JavaScript'in yürütülmesini, HTTP başlıklarının sırasını ve davranışsal kalıpları analiz eder.
Cloudflare'ı aşma stratejileri
1. Headless tarayıcılar (Selenium, Playwright, Puppeteer)
JavaScript'in yürütülmesi ile gerçek bir tarayıcıyı taklit eder. Cloudflare, Chrome/Firefox'un doğru TLS parmak izini görür ve isteği geçirir. Dezavantajları: yavaş (sayfa başına 2-5 saniye), çok fazla kaynak gerektirir (RAM, CPU).
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
# Selenium için proxy ayarları
chrome_options = Options()
chrome_options.add_argument('--proxy-server=http://username:password@proxy.example.com:8080')
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-blink-features=AutomationControlled')
driver = webdriver.Chrome(options=chrome_options)
driver.get('https://news-site.com/article')
# JavaScript'in yüklenmesini bekleyin
driver.implicitly_wait(10)
html = driver.page_source
driver.quit()
2. TLS parmak izi ile kütüphaneler (curl_cffi, tls-client)
Headless tarayıcı çalıştırmadan gerçek bir tarayıcının TLS parmak izini taklit eder. Selenium'dan 10-20 kat daha hızlı çalışır, ancak JavaScript'i yürütmez. Temel Cloudflare kontrolü olan siteler için uygundur (JS-challenge olmadan).
from curl_cffi import requests
proxies = {
'http': 'http://username:password@proxy.example.com:8080',
'https': 'http://username:password@proxy.example.com:8080'
}
response = requests.get(
'https://news-site.com/article',
proxies=proxies,
impersonate='chrome110' # Chrome 110'un TLS parmak izini taklit etme
)
print(response.text)
3. Cloudflare'ı aşma hizmetleri (scraperapi, scrapingbee)
Cloudflare'ı otomatik olarak aşan ücretli API'ler. URL gönderirsiniz, onlar size hazır HTML döner. Avantajları: teknik detaylarla uğraşmanıza gerek yok, otomatik proxy rotasyonu, CAPTCHA işleme. Dezavantajları: büyük hacimlerde pahalı (100K istek için ayda 50$'dan).
Doğru HTTP başlıkları
Proxy ile bile doğru başlıklar göndermek önemlidir, aksi takdirde site, standart dışı User-Agent veya Accept-Language eksikliği nedeniyle botu tespit eder.
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Accept-Language': 'tr-TR,tr;q=0.9,en-US;q=0.8,en;q=0.7',
'Accept-Encoding': 'gzip, deflate, br',
'DNT': '1',
'Connection': 'keep-alive',
'Upgrade-Insecure-Requests': '1',
'Sec-Fetch-Dest': 'document',
'Sec-Fetch-Mode': 'navigate',
'Sec-Fetch-Site': 'none',
'Cache-Control': 'max-age=0'
}
User-Agent'ı periyodik olarak güncelleyiniz — güncel tarayıcı sürümlerini kullanın. Parmak izinizi kontrol etmek için whoer.net veya browserleaks.com sitelerini kullanabilirsiniz.
IP rotasyonu ayarları ve istek yönetimi
Doğru proxy rotasyonu, engellemeler olmadan stabil parçalama için anahtardır. Haber siteleri, bir IP'den gelen isteklerin sıklığını izler ve limitin aşılması geçici veya kalıcı bir yasakla sonuçlanır.
Proxy rotasyon türleri
İstek başına rotasyon — her istek yeni bir IP üzerinden gider. Çok sayıda farklı siteyi hızlı bir şekilde parçalamak için uygundur, istek sıklığı nedeniyle yasaklanma riskini en aza indirir. Dezavantajları: oturumları (çerezler, kimlik doğrulama) olan siteler için uygun değildir, bazı korumalar için şüpheli görünebilir.
Zamanla rotasyon (yapışkan oturumlar) — bir IP sabit bir süre (5-30 dakika) kullanılır, ardından değiştirilir. Bir haber portalını birçok sayfa ile parçalamak için uygundur, çerezleri ve oturumları korur, gerçek bir kullanıcının davranışı gibi görünür. Çoğu haber parçalama görevi için önerilir.
Coğrafi konuma göre rotasyon — farklı ülkelerden/şehirlerden IP değişimi. Coğrafi olarak bağımlı içeriği (bölgesel haberler) parçalamak, coğrafi engellemeleri aşmak için kullanılır.
İsteklerin optimal sıklığı
Proxy rotasyonu ile bile, istekleri çok sık yapmamak gerekir. Farklı türde siteler için güvenli aralıklar:
- Büyük haber portalları (RBK, Kommersant, Vedomosti) — bir IP'den gelen istekler arasında 2-5 saniye
- Orta siteler — 1-3 saniye
- Küçük bloglar ve yerel yayınlar — 0.5-1 saniye
İsteklerin doğal görünmesi için rastgele gecikmeler ekleyin:
import time
import random
def fetch_article(url, proxies):
response = requests.get(url, proxies=proxies, headers=headers)
# 2 ile 5 saniye arasında rastgele gecikme
delay = random.uniform(2, 5)
time.sleep(delay)
return response.text
Havuzdan proxy rotasyonu örneği
Eğer bir proxy listeniz varsa, basit bir rotasyonu manuel olarak gerçekleştirebilirsiniz:
import itertools
import requests
# Proxy havuzu
proxy_list = [
'http://user:pass@proxy1.example.com:8080',
'http://user:pass@proxy2.example.com:8080',
'http://user:pass@proxy3.example.com:8080',
]
# Sonsuz bir iteratör oluştur
proxy_pool = itertools.cycle(proxy_list)
def get_next_proxy():
proxy = next(proxy_pool)
return {'http': proxy, 'https': proxy}
# Kullanım
urls = ['https://news1.com/article', 'https://news2.com/article']
for url in urls:
proxies = get_next_proxy()
response = requests.get(url, proxies=proxies, headers=headers)
print(f'Fetched {url} via {proxies["http"]}')
Kod örnekleri: Python + Scrapy + proxy
Scrapy, kutudan çıktığı gibi proxy, middleware, rotasyon ve hata işleme desteği sunan profesyonel bir parçalama çerçevesidir. Proxy rotasyonu ile bir haber sitesinin parçalanması için tam bir örneği inceleyelim.
Bağımlılıkların kurulumu
pip install scrapy scrapy-rotating-proxies
Proxy ile Scrapy ayarları (settings.py)
# settings.py
# Proxy rotasyonu için middleware'i etkinleştir
ROTATING_PROXY_LIST = [
'http://user:pass@proxy1.example.com:8080',
'http://user:pass@proxy2.example.com:8080',
'http://user:pass@proxy3.example.com:8080',
]
DOWNLOADER_MIDDLEWARES = {
'rotating_proxies.middlewares.RotatingProxyMiddleware': 610,
'rotating_proxies.middlewares.BanDetectionMiddleware': 620,
}
# Engellemeleri aşmak için ayarlar
CONCURRENT_REQUESTS = 8 # Aynı anda en fazla 8 istek
DOWNLOAD_DELAY = 2 # İstekler arasında 2 saniye gecikme
RANDOMIZE_DOWNLOAD_DELAY = True # Rastgele gecikme
# User-Agent
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
# Hatalarda yeniden deneme
RETRY_TIMES = 3
RETRY_HTTP_CODES = [500, 502, 503, 504, 408, 429]
Haber parçalama için Spider
# news_spider.py
import scrapy
from datetime import datetime
class NewsSpider(scrapy.Spider):
name = 'news_parser'
# Parçalanacak haber sitelerinin listesi
start_urls = [
'https://example-news.com/latest',
]
def parse(self, response):
# Ana sayfadaki makale listesini parçala
articles = response.css('article.news-item')
for article in articles:
article_url = article.css('a.title::attr(href)').get()
if article_url:
# Makale sayfasına geç
yield response.follow(article_url, callback=self.parse_article)
def parse_article(self, response):
# Makale verilerini çıkar
yield {
'url': response.url,
'title': response.css('h1.article-title::text').get(),
'date': response.css('time.published::attr(datetime)').get(),
'author': response.css('span.author::text').get(),
'text': ' '.join(response.css('div.article-body p::text').getall()),
'tags': response.css('a.tag::text').getall(),
'scraped_at': datetime.now().isoformat(),
}
Parçalama işlemini başlatma
# JSON formatında kaydetme
scrapy crawl news_parser -o news_data.json
# CSV formatında kaydetme
scrapy crawl news_parser -o news_data.csv
requests + BeautifulSoup ile basit bir parçalama
Karmaşık bir mantık gerekmiyorsa, requests + BeautifulSoup kombinasyonunu kullanabilirsiniz:
import requests
from bs4 import BeautifulSoup
import time
import random
# Proxy ayarları
proxies = {
'http': 'http://user:pass@proxy.example.com:8080',
'https': 'http://user:pass@proxy.example.com:8080'
}
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
}
def parse_news_article(url):
try:
response = requests.get(url, proxies=proxies, headers=headers, timeout=10)
response.raise_for_status()
soup = BeautifulSoup(response.text, 'html.parser')
# Verileri çıkarma (seçiciler siteye bağlıdır)
title = soup.find('h1', class_='article-title').text.strip()
date = soup.find('time', class_='published')['datetime']
text = ' '.join([p.text for p in soup.find_all('p', class_='article-text')])
return {
'url': url,
'title': title,
'date': date,
'text': text
}
except Exception as e:
print(f'{url} parçalanırken hata: {e}')
return None
# Makale listesini parçalama
urls = [
'https://news-site.com/article-1',
'https://news-site.com/article-2',
]
for url in urls:
article_data = parse_news_article(url)
if article_data:
print(article_data)
# İstekler arasında gecikme
time.sleep(random.uniform(2, 4))
Haber parçalamada yaygın hatalar
Doğru proxy ayarları ile bile, parçalar sık sık teknik hatalar nedeniyle engellenir. En sık karşılaşılan sorunları ve çözümlerini inceleyelim.
Hata 1: Çok yüksek istek sıklığı
Belirtiler: HTTP 429 (Too Many Requests), geçici IP yasakları, CAPTCHA. Sebep: parça, bir IP'den saniyede 10-50 istek yapıyor. Çözüm: gecikmeler ekleyin (time.sleep()), Scrapy'de DOWNLOAD_DELAY kullanın, CONCURRENT_REQUESTS'i sınırlayın.
Hata 2: Tüm istekler için tek bir proxy kullanma
Belirtiler: proxy hızla yasaklanır, gecikmelere rağmen. Sebep: bir IP, bir siteye yüzlerce istek yapıyor. Çözüm: proxy havuzu kullanın ve rotasyon yapın, büyük siteler için en az 10-20 proxy kullanın, yapışkan oturumlar için IP'yi her 10-15 dakikada bir değiştirin.
Hata 3: Çerezleri göz ardı etme
Birçok haber sitesi ilk ziyaret sırasında çerezler oluşturur ve sonraki isteklerde bunların varlığını kontrol eder. Çerezlerin olmaması, bot belirtisidir. Çözüm: çerezleri otomatik olarak saklamak için requests.Session() kullanın, Scrapy'de COOKIES_ENABLED = True ayarını etkinleştirin.
import requests
session = requests.Session()
session.proxies = {'http': 'http://proxy.com:8080', 'https': 'http://proxy.com:8080'}
# İlk istek — çerezleri al
response1 = session.get('https://news-site.com')
# Sonraki istekler otomatik olarak çerezleri gönderir
response2 = session.get('https://news-site.com/article')
Hata 4: Yönlendirmeleri yanlış işleme
Haber siteleri genellikle mobil versiyonlar, bölgesel alt alan adları, AMP sayfaları için yönlendirmeler (301, 302) kullanır. Eğer parça yönlendirmeleri takip etmiyorsa, boş bir sayfa alır. Çözüm: requests'de varsayılan olarak etkin ( allow_redirects=True), son URL'yi response.url ile kontrol edin.
Hata 5: JavaScript olmadan dinamik içeriği parçalama
Birçok modern haber sitesi, içeriği JavaScript (React, Vue) aracılığıyla yükler. requests kütüphanesi, makaleler olmadan boş bir HTML iskeleti alır. Çözüm: JavaScript'i yürütmek için Selenium/Playwright kullanın, DevTools'ta Network'ü kontrol edin — verilerin API aracılığıyla yüklenip yüklenmediğini kontrol edin (JSON'u doğrudan parçalayabilirsiniz).
Ölçeklendirme: Yüzlerce kaynağı parçalama
Tek bir haber sitesini değil, aynı anda yüzlerce kaynağı parçalamak gerektiğinde (haber agregatörleri, medya izleme), ölçeklenebilir bir mimari gereklidir.
Scrapy Cloud ile dağıtık parçalama
Scrapy Cloud (Scrapy'nin yaratıcısından) parçaları bulutta otomatik ölçeklendirme ile çalıştırmanıza olanak tanır. Avantajları: kendi sunucularınıza gerek yok, otomatik proxy rotasyonu, izleme ve günlükleme. Maliyet: temel plan için ayda 9$'dan.
Görev kuyrukları (Celery + Redis)
Kendi dağıtımınızı yapmak için Celery kullanın — dağıtık görev sistemi. Mimari: Redis, parçalanacak URL'lerin kuyruğunu saklar, birkaç işçi (sunucu) kuyruktan görev alır ve paralel olarak parçalar, her işçi kendi proxy havuzunu kullanır.
# tasks.py
from celery import Celery
import requests
app = Celery('news_parser', broker='redis://localhost:6379/0')
@app.task
def parse_article(url, proxy):
proxies = {'http': proxy, 'https': proxy}
response = requests.get(url, proxies=proxies, timeout=10)
# Parçalama ve veri kaydetme
return response.text
# Kuyruğa görev ekleme
urls = ['https://news1.com/article', 'https://news2.com/article']
proxies = ['http://proxy1.com:8080', 'http://proxy2.com:8080']
for url in urls:
proxy = random.choice(proxies)
parse_article.delay(url, proxy) # Asenkron yürütme
İzleme ve hata işleme
Ölçekli parçalamada izleme kritik öneme sahiptir: kaç URL işlendi, kaç hata oldu, hangi proxy'ler yasaklandı. Python hatalarını izlemek için Sentry kullanın, metrikler (saniyedeki istek sayısı, yanıt süresi) için Grafana + Prometheus kullanın, ELK Stack (Elasticsearch, Logstash, Kibana) ile günlükleme yapın.
Öneri: Proxy'lerin otomatik kontrol sistemini oluşturun. Her 5-10 dakikada bir her proxy üzerinden whoer.net veya httpbin.org'a test isteği gönderin. Eğer proxy yanıt vermez veya yasaklandıysa — onu havuzdan çıkarın ve yenisini ekleyin.
Proxy maliyetlerini optimize etme
Yüzlerce kaynağı parçalama sırasında proxy maliyetleri aylık binlerce dolara ulaşabilir. Optimizasyon stratejileri: basit siteler için veri merkezi proxy'leri kullanın (RSS, API), korumalı siteler için konut proxy'leri kullanın, verileri önbelleğe alın — aynı makaleyi iki kez parçalamayın, yoğun saatlerde (gece) parçalayın (sitelerdeki yük daha düşük, yasaklama riski daha az).
Örnek: 500 haber sitesini parçalamak için %80 veri merkezi proxy'si (RSS ve basit siteler için) ve %20 konut proxy'si (en korunaklı 100 portal için) kullanabilirsiniz. Bu, maliyetleri 3-5 kat azaltacaktır.
Sonuç
Haber sitelerinin parçalanması, doğru proxy seçimi, rotasyon ayarları ve anti-bot sistemlerinin aşılması gerektiren teknik olarak karmaşık bir görevdir. Makaleden çıkarılan ana noktalar: korumalı haber portalları (Cloudflare, sıkı oran sınırlaması) için yapışkan oturumlarla konut proxy'leri kullanın, yüzlerce kaynağın toplu parçalanması için hızlı rotasyonla veri merkezi proxy'leri uygundur, istekler arasında gecikmeler (2-5 saniye) ve doğru HTTP başlıkları eklemeyi unutmayın, Cloudflare'ı aşmak için headless tarayıcılar (Selenium, Playwright) veya TLS parmak izi ile kütüphaneler kullanın.
Ölçeklendirme sırasında dağıtık sistemler (Celery, Scrapy Cloud) ve hata izleme kullanın. Parçalamanın etik olması gerektiğini unutmayın — robots.txt'ye uyun, sunucular üzerinde aşırı yük oluşturmayın ve içerik üzerindeki telif haklarına saygı gösterin.
Eğer Cloudflare koruması olan büyük haber portallarını parçalamayı planlıyorsanız, konut proxy'lerini kullanmanızı öneririz — yüksek güvenilirlik ve minimum yasaklama riski sağlarlar. Hız ve veri hacminin önemli olduğu görevler (RSS, API uç noktalarının parçalanması) için veri merkezi proxy'leri uygundur.