R'da Proxy Kullanımı Neden Gerekli?
R'da proxy kullanımı, modern veri toplama akışlarında yalnızca bir tercih değil, çoğu zaman bir zorunluluktur. httr ve xml2 ile başlayan ekosistem artık httr2 ve rvest üzerine kurulu. Bu yeni yığın, istekleri request() nesneleri olarak inşa etmenizi ve req_proxy() ile proxy'yi tek bir zincirleme adımda eklemenizi sağlar. Yine de proxy eklemeden önce, neden proxy'ye ihtiyaç duyduğunuzu netleştirmek gerekir.
Birçok site, tek bir IP'den gelen yüksek hacimli istekleri otomatik olarak sınırlandırır. Cloudflare, Datadome ve PerimeterX gibi bot yönetim sistemleri, datacenter IP aralıklarını ASN veritabanlarıyla eşleştirir ve şüpheli trafiği 403, 429 veya sessiz CAPTCHA'larla engeller. RFC 7231 kapsamında 429 Too Many Requests yanıtı, rate limit politikalarının standart sinyalidir ve R tarafında req_retry() ile ele alınabilir.
Residential proxy'ler, gerçek İSS'lere ait IP'lerden trafiği yönlendirdiği için bu filtrelerin çoğunu aşar. Datacenter IP'ler ise ASN bazlı engellemelere karşı savunmasızdır. Aşağıdaki tablo iki yaklaşımı karşılaştırır:
| Özellik | Residential Proxy | Datacenter Proxy |
|---|---|---|
| IP kaynağı | Gerçek İSS ataması | Veri merkezi bloğu |
| Engellenme riski | Düşük | Orta–Yüksek |
| Latans | ~200–600 ms | ~50–150 ms |
| Başarı oranı (SERP) | %90+ | %40–70 |
| Maliyet | GB başına | IP başına veya sınırsız |
ProxyHat, residential, mobile ve datacenter proxy tiplerini tek bir gateway üzerinden sunar. HTTP için gate.proxyhat.com:8080, SOCKS5 için gate.proxyhat.com:1080 kullanılır. Kullanıcı adı içinde geo-targeting ve session flag'leri ile trafiğinizi ince ayar yapabilirsiniz.
Modern R Yığını: httr2 ve rvest
httr2, Hadley Wickham tarafından tasarlanan modern HTTP istemcisidir. İstekleri değişmez (immutable) nesneler olarak modeller; böylece zincirleme req_* fonksiyonları ile okunabilir bir akış elde edersiniz. rvest ise HTML parse etme ve tablo çekme için xml2 üzerine inşa edilmiştir. İkisi birlikte, R'da web scraping için en temel yığını oluşturur.
Aşağıdaki örnek, ProxyHat HTTP proxy'sini req_proxy() ile ekler ve rvest ile bir sayfanın başlığını çeker:
library(httr2)
library(rvest)
proxy_user <- Sys.getenv("PROXYHAT_USER")
proxy_pass <- Sys.getenv("PROXYHAT_PASS")
req <- request("https://example.com") |>
req_proxy(
url = "http://gate.proxyhat.com",
port = 8080,
username = proxy_user,
password = proxy_pass
) |>
req_user_agent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36") |>
req_timeout(30)
resp <- req |> req_perform()
page <- resp |> resp_body_html()
title <- page |> html_element("title") |> html_text2()
message("Title: ", title)
Bu desen, ProxyHat SDK'sının Python ve Node.js'te izlediği desenle aynıdır: kullanıcı adı içinde flag'ler, tek bir gateway, tek bir kimlik bilgisi çifti. Karışık dillerde çalışan ekipler için bu tutarlılık, operasyon yükünü azaltır.
Geo-Targeting ve Sticky Session'lar
ProxyHat, kullanıcı adı içinde geo-targeting ve session flag'leri destekler. Bu, URL'yi değiştirmeden trafiğinizi belirli bir ülke, şehir veya oturuma sabitlemenizi sağlar.
user-country-GB-city-london:pass— Londra'dan bir IP.user-country-DE:pass— Almanya'dan rastgele bir IP.user-session-abc123:pass— Aynı IP'yi tutan sticky session.
Aşağıdaki örnek, geo-targeting ve sticky session'ı birleştirir:
build_proxy_user <- function(country, city = NULL, session = NULL) {
parts <- c(paste0("user-country-", country))
if (!is.null(city)) parts <- c(parts, paste0("city-", tolower(city)))
if (!is.null(session)) parts <- c(parts, paste0("session-", session))
paste(parts, collapse = "-")
}
proxy_user <- build_proxy_user("GB", "london", session = "r-scrape-001")
proxy_pass <- Sys.getenv("PROXYHAT_PASS")
req <- request("https://ipinfo.io/json") |>
req_proxy(
url = "http://gate.proxyhat.com",
port = 8080,
username = proxy_user,
password = proxy_pass
)
resp <- req |> req_perform()
resp |> resp_body_json()
SOCKS5 gerektiğinde, req_proxy() yerine httr2'nin SOCKS desteğini kullanabilirsiniz. SOCKS5, port 1080 üzerindendir ve bazı ağ ortamlarında HTTP CONNECT'ten daha güvenilir çalışır:
req <- request("https://ipinfo.io/json") |>
req_proxy(
url = "socks5://gate.proxyhat.com",
port = 1080,
username = build_proxy_user("DE", session = "socks-002"),
password = Sys.getenv("PROXYHAT_PASS")
)
resp <- req |> req_perform()
resp |> resp_body_json()
Sayfalı Tablo Çekme: purrr ile Döngü
Çoğu gerçek dünya senaryosu tek sayfa değil, sayfalı bir tabloyu tidy bir data frame'e dönüştürmeyi gerektirir. Aşağıdaki örnek, her sayfa için yeni bir sticky session oluşturur, böylece her sayfa farklı bir residential IP'den gelir. req_retry() geçici hataları yönetir, req_throttle() ise saniye başına istek sayısını sınırlar.
library(httr2)
library(rvest)
library(purrr)
library(dplyr)
library(tibble)
fetch_page <- function(page_num) {
session_id <- paste0("page-", page_num, "-", as.integer(Sys.time()))
proxy_user <- build_proxy_user("US", session = session_id)
req <- request("https://scrapethissite.com/pages/forms/") |>
req_url_query(page = page_num) |>
req_proxy(
url = "http://gate.proxyhat.com",
port = 8080,
username = proxy_user,
password = Sys.getenv("PROXYHAT_PASS")
) |>
req_user_agent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)") |>
req_headers("Accept-Language" = "en-US,en;q=0.9") |>
req_retry(max_tries = 3, max_seconds = 60,
retry_on_failure = TRUE) |>
req_throttle(2 / 1) # saniyede 2 istek
resp <- req |> req_perform()
html <- resp |> resp_body_html()
html |>
html_element("table") |>
html_table()
}
pages <- 1:5
tables <- map(pages, possibly(fetch_page, otherwise = tibble()))
result <- bind_rows(tables)
message("Çekilen satır sayısı: ", nrow(result))
Burada purrr::possibly(), bir sayfa başarısız olduğunda tüm akışı durdurmaz; bunun yerine boş bir tibble döndürür. Üretimde, başarısız sayfaları bir log dosyasına yazmak için safely() kullanabilir ve hata nesnelerini daha sonra inceleyebilirsiniz.
JavaScript ile Render Edilen Sayfalar: read_html_live()
Bazı siteler içeriği yalnızca JavaScript çalıştıktan sonra gösterir. rvest 1.0+ sürümünde read_html_live(), chromote paketi üzerinden headless Chrome'u sürdürür ve aynı proxy ayarlarını kullanmanıza izin verir.
library(rvest)
session <- read_html_live(
"https://quotes.toscrape.com/js/",
chrome_args = c(
"--proxy-server=http://gate.proxyhat.com:8080",
"--headless=new",
"--disable-gpu"
)
)
# Chrome proxy kimlik doğrulaması için bir eklenti gerektirebilir.
# ProxyHat kullanıcı adı/parola için, basitlik açısından IP allowlist
# kullanmanız önerilir — dashboard.proxyhat.com üzerinden IP'nizi ekleyin.
quotes <- session |>
html_elements(".quote .text") |>
html_text2()
length(quotes)
Chrome proxy kimlik doğrulaması karmaşık olabilir; ProxyHat dashboard'undan IP allowlist kullanmak, kullanıcı adı/parola akışını atlayarak bu yükü ortadan kaldırır. Bu yaklaşım, özellikle Docker içinde headless Chrome çalıştıran ekipler için daha sadedir.
Hata Yönetimi ve Üretim İpuçları
Üretimde R proxy kullanımı, yalnızca doğru kod yazmaktan ibaret değildir. Aşağıdaki pratikler, uzun süreli veri toplama akışlarını dayanıklı kılar:
- Timeout'lar: Her zaman
req_timeout(30)kullanın. Residential proxy'lerde 200–600 ms latans normaldir; ancak takılı bir IP 60 saniye boyunca yanıt vermeyebilir. - Retry politikası:
req_retry(max_tries = 3, max_seconds = 60)ile 429 ve 503 yanıtlarını otomatik yeniden deneyin. Üstel geri çekilme varsayılan olarak gelir. - Throttle:
req_throttle(2 / 1)ile saniyede 2 istek gibi makul bir hız seçin. Hedef sitenin robots.txt'ini kontrol edin. - Loglama:
req_perform()öncesimessage()ile URL, proxy session ID ve zaman damgasını yazın. Hata ayıklama hayat kurtarır. - IP rotasyonu: Her istekte yeni session ID kullanın; sticky session'ları yalnızca oturum bütünlüğü gerektiren (ör. sepet, çok adımlı form) akışlarda kullanın.
- Circuit breaker: Art arda 5 hata alırsanız akışı durdurun ve alarm verin.
purrr::reduce()ile bir sayaç tutabilirsiniz.
Etik ve Yasal Uyum
Proxy kullanımı, teknik bir araçtır; ancak neyi topladığınız ve nasıl topladığınız yasal ve etik çerçeveye bağlıdır. Avrupa Birliği'nde kişisel veri içeren içerikler GDPR kapsamındadır ve veri konusunun rızası veya meşru bir çıkar temeli gerekir. Kamuya açık veriler genellikle daha düşük risklidir; yine de her zaman sitenin robots.txt dosyasını ve Hizmet Şartları'nı kontrol edin.
Mümkün olduğunda resmi API'leri tercih edin. Birçok platform — GitHub, Twitter/X, Amazon — ücretsiz veya ücretli API'ler sunar. API, hem daha kararlı hem de daha az hukuki risk taşır. API yoksa veya fiyatlandırma engelleyiciyse, o zaman scraping ve proxy mantıklı bir seçenek haline gelir.
ProxyHat ile çalışırken, lokasyonlar sayfasını kullanarak hangi ülkelerin kullanılabilir olduğunu kontrol edin. Fiyatlandırma sayfası, residential GB ve datacenter IP maliyetlerini karşılaştırmanıza yardımcı olur. Web scraping kullanım senaryosu ve SERP takibi sayfaları, yaygın desenleri detaylandırır. Teknik dokümantasyon için ProxyHat docs'una bakın.
Anahtar Çıkarımlar
R'da proxy kullanımı,
httr2::req_proxy()+rvestikilisiyle tek bir zincirleme akışta mümkündür. Geo-targeting ve sticky session'lar kullanıcı adı içinde kodlanır; SOCKS5 için port 1080 kullanılır. Üretimdereq_retry(),req_throttle()vepurrr::possibly()ile dayanıklılık sağlayın. JavaScriptli sayfalar içinread_html_live()ve IP allowlist kombinasyonu en sade yoldur.
- Residential proxy'ler, datacenter IP'lere göre 2–3 kat daha yüksek başarı oranı sunar.
- Her sayfa için yeni session ID, IP rotasyonunu otomatikleştirir.
req_throttle()ile saniyede 1–3 istek, çoğu site için güvenli bir başlangıçtır.- Etik scraping: robots.txt, ToS ve GDPR'i her zaman kontrol edin.
- Resmi API varsa, önce onu deneyin.
SSS
Aşağıdaki sorular, R proxy kullanıcılarının en sık sorduğu konuları özetler.
R'da proxy kullanımı nedir?
R'da proxy kullanımı, httr2 ve rvest gibi paketlerin HTTP isteklerini bir proxy sunucusu üzerinden yönlendirmesidir. ProxyHat için bu, req_proxy('http://gate.proxyhat.com', 8080, username, password) çağrısıyla yapılır. Amaç, IP engellemelerini aşmak, geo-targeting yapmak ve yüksek hacimli veri toplamada dayanıklılık sağlamaktır.
R'da proxy kullanımı neden önemlidir?
Çünkü modern bot yönetim sistemleri, datacenter IP'lerini ASN veritabanlarıyla engeller. Residential proxy'ler, gerçek İSS IP'leri kullandığı için bu filtreleri aşar. Ayrıca geo-walled içeriklere erişim ve rate limit yönetimi için proxy şarttır. R'da doğru proxy kullanımı, scraping成功率 %40'tan %90+'ya çıkarabilir.
Hangi proxy tipi R için en iyisidir?
Engellenme riski yüksek siteler için residential proxy en iyi seçimdir. Hız öncelikliyse ve hedef site datacenter IP'leri engellemiyorsa datacenter proxy yeterlidir. Mobil proxy'ler, en yüksek güven seviyesini sunar ancak maliyet daha yüksektir. ProxyHat üç tipi de tek gateway üzerinden destekler.
R'da proxy kullanırken engellenmeyi nasıl önlersiniz?
Her istekte yeni session ID ile IP rotasyonu yapın, req_throttle() ile hız sınırlayın, gerçekçi User-Agent ve Accept-Language header'ları gönderin ve req_retry() ile 429/503 yanıtlarını yönetin. robots.txt'i kontrol edin ve resmi API varsa önce onu kullanın.
read_html_live ile proxy nasıl kullanılır?
read_html_live(), chromote üzerinden headless Chrome'u --proxy-server=http://gate.proxyhat.com:8080 argümanıyla çalıştırır. Kimlik doğrulama karmaşıklığını önlemek için ProxyHat dashboard'undan IP allowlist kullanmanız önerilir.






