Google Colab ve Jupyter Notebook, Python'u yerel makineye yüklemeden hızlı bir şekilde scraping betikleri yazmak ve çalıştırmak için kullanışlı araçlardır. Ancak bulut tabanlı not defterlerinin unutulan bir özelliği vardır: tüm istekler, Google veri merkezlerinin IP adreslerinden gelir ve bu IP'ler, anti-bot sistemleri tarafından bilinir ve neredeyse anında yasaklanır. Bu yazıda, Colab ve Jupyter'da proxy'yi nasıl doğru bir şekilde bağlayacağımızı, bulut ortamının getirdiği sınırlamaları ve scraping işlemini ilk 50 istekten sonra çökmeden nasıl gerçekleştireceğimizi inceleyeceğiz.
Neden Google Colab, normal bir PC'den daha sık yasaklanıyor
Colab'ın scraping için en büyük sorunu, ortak bir IP havuzudur. Her seferinde not defterini çalıştırdığınızda, Google, bulut IP aralıklarından (AS15169 ve benzerleri) bir IP ile sanal bir makine tahsis eder. Bu aralıklar, çoğu anti-bot sisteminin kara listesine çoktan alınmıştır: Cloudflare, DataDome, PerimeterX ve ayrıca Wildberries, Ozon ve pazar yerlerinin yerleşik korumaları bunları anında tanır. İstek, siteye ulaşmadan, ASN (Otonom Sistem Numarası) filtresi tarafından kesilir; User-Agent veya davranış kontrolü yapılmadan önce.
İkinci neden, kullanımın yaygınlığıdır. Binlerce geliştirici aynı anda Colab üzerinden scraper'lar, botlar ve ML betikleri çalıştırdığından, bu IP'lerin birçok hedef sitedeki itibarı çoktan "yakılmıştır" ve sizin isteğinizden çok önce yasaklanmıştır. Eğer 10 saniyede bir düzgün bir GET isteği yapıyorsanız, site, aynı aralıktan bir saat önce birinin sunucuya 500 akışla saldırdığı için 403 dönebilir.
Üçüncü neden, yerel olarak çalıştırılan Jupyter'ın bu sorunu genellikle yaşamamasıdır (eğer normal bir ev veya ofis IP'niz varsa), ancak JupyterHub üzerinden bir barındırma sunucusunda veya bulut sağlayıcısının konteynerinde çalışmaya başladığınızda durum Colab'daki gibi olur. Bu nedenle, "proxy gerekli mi değil mi" sorusu bulut not defterleri için kesin bir şekilde yanıtlanır: bunlar olmadan scraping, ilk birkaç isteğin ötesine geçemez.
Bulut scraping için hangi proxy türü uygundur
Proxy türünün seçimi, neyi taradığınıza ve hedef sitenin koruma seviyesine bağlıdır. Colab ve Jupyter için bir başka önemli nokta: not defterinin oturumu zamanla sınırlıdır, bu nedenle uzun ömürlü sticky oturumları proxy için her zaman kritik değildir - genellikle bir çalıştırma süresi içinde bağlantının kararlılığı daha önemlidir.
| Proxy Türü | Colab/Jupyter'de Ne Zaman Kullanılmalı | Özellikler |
|---|---|---|
| Veri Merkezi Proxy'leri | Sert koruma olmayan sitelerin taranması, açık API'ler, statik sayfalar | Yüksek hız, düşük fiyat, ancak agresif sitelerde ASN üzerinden yasaklanabilirler |
| Konut Proxy'leri | Wildberries, Ozon, Avito, Google, anti-bot korumalı sosyal medya taraması | Gerçek kullanıcıların IP'leri, nadiren kara listeye alınır, daha yüksek gecikme |
| Mobil Proxy'ler | Mobil site sürümlerinin, TikTok, Instagram API üzerinden taranması | En yüksek güvenilirlik, ancak daha pahalı ve daha yavaş döngü |
Çoğu pazar yeri ve arama motoru scraping görevleri için Colab'dan en iyi denge, her istekte dönen konut proxy'leri ile bir kombinasyon olacaktır - bu, davranışsal model nedeniyle yasaklanma olasılığını azaltır, hatta istek Google bulut ortamından gerçekleştirildiğinde bile.
Requests ve urllib'de proxy ayarı
Colab'da proxy'nin temel ayarı, yerel Python ortamından farklı değildir. Tek fark, Colab'da kütüphanelerin genellikle !pip install ile yüklenmesi gerektiğidir, çünkü standart görüntü her zaman gerekli olan her şeyi içermez.
!pip install requests
import requests
proxy = {
"http": "http://login:[email protected]:9000",
"https": "http://login:[email protected]:9000"
}
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
}
response = requests.get(
"https://example.com/catalog",
proxies=proxy,
headers=headers,
timeout=15
)
print(response.status_code)
print(response.text[:500])
Önemli bir nokta: Colab'da kalıcı bir yapılandırma dosyası yoktur, bu nedenle proxy'nin kullanıcı adı ve şifresini ya kodda sabit yazmak zorundasınız (bu, not defterini yayınlarken güvenli değildir), ya da Colab'da google.colab.userdata aracılığıyla çevre değişkenlerinde saklamalısınız, ya da Colab Secrets ile bağlamalısınız. Bu, özellikle not defterini meslektaşlarınızla paylaşıyorsanız, şifreyi doğrudan kodda saklamaktan daha kullanışlıdır.
from google.colab import userdata
proxy_login = userdata.get('PROXY_LOGIN')
proxy_pass = userdata.get('PROXY_PASS')
proxy_url = f"http://{proxy_login}:{proxy_pass}@gate.proxycove.com:9000"
proxies = {"http": proxy_url, "https": proxy_url}
Colab'da Selenium ve headless Chrome ile proxy
Eğer site içeriği JavaScript aracılığıyla render ediliyorsa (Wildberries, Ozon, Avito için tipik bir durum), basit bir requests yeterli değildir - bir headless tarayıcıya ihtiyaç vardır. Colab'da bu genellikle Chromium ile Selenium'dur, çünkü temel görüntüde bulunmaz.
!apt-get update
!apt install chromium-chromedriver
!pip install selenium
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')
chrome_options.add_argument('--proxy-server=http://gate.proxycove.com:9000')
driver = webdriver.Chrome(options=chrome_options)
driver.get("https://example.com/catalog")
print(driver.page_source[:500])
driver.quit()
Sorun şu ki, --proxy-server bayrağı, doğrudan kullanıcı adı ve şifre ile kimlik doğrulamayı desteklemez. Selenium'da kimlik doğrulamalı proxy kullanmak için ya IP kimlik doğrulaması (not defterinin statik IP'sine beyaz listeleme, bu Colab'da kararsızdır çünkü makinenin IP'si her yeni çalıştırmada değişir) kullanmalısınız, ya da proxy kimlik bilgileri ile "anlık" olarak Chrome uzantısı oluşturmalısınız, ya da selenium-wire gibi bir kütüphane aracılığıyla kimlik doğrulamalı proxy tüneli kullanmalısınız; bu, kutudan çıktığında kimlik doğrulamalı proxy'leri destekler.
!pip install selenium-wire
from seleniumwire import webdriver
proxy_options = {
'proxy': {
'http': 'http://login:[email protected]:9000',
'https': 'http://login:[email protected]:9000',
}
}
driver = webdriver.Chrome(seleniumwire_options=proxy_options, options=chrome_options)
driver.get("https://example.com/catalog")
Jupyter Notebook: yerel vs bulut
Yerel makinede (Anaconda aracılığıyla veya doğrudan pip ile) çalıştırılan Jupyter Notebook, ev veya ofis IP adresinizi kullanır - bu durumda proxy'ler yalnızca maskeleme veya coğrafi kısıtlamaları aşmak için gereklidir, veri merkezi ASN yasaklarından kaçınmak için değil. Bu durumda ayar, normal bir Python betiği ile tamamen aynıdır: aynı requests, aynı Selenium, sürücü ve sistem paketleri yükleme kısıtlaması olmadan.
Durum, Jupyter'ı bir bulut hizmeti aracılığıyla kullanıyorsanız değişir: JupyterHub, VPS, Kaggle Notebooks, Deepnote, Binder veya kurumsal bulut kümesi. Bu durumlarda IP, yine sağlayıcının veri merkezine aittir ve Colab'daki tüm sorunlar birebir geçerlidir. Colab'dan en büyük fark, bu tür hizmetlerin genellikle oturum boyunca daha kararlı bir IP'ye sahip olmasıdır (her çekirdek yeniden başlatıldığında değişmez), bu da proxy sağlayıcınız destekliyorsa IP beyaz listeleme ayarını kolaylaştırır.
Pratik sonuç: scraping iş için kritikse (örneğin, pazar yerlerinde rakip fiyatlarının günlük izlenmesi), ücretsiz bulut not defterlerine üretim ortamı olarak bağlı kalmamak daha iyidir; bunları yalnızca betiği geliştirmek ve test etmek için kullanmalı, nihai scraper'ı sabit IP ve ayarlanmış proxy'lerle bir sunucuya taşımalısınız.
Scraping'i bozacak bulut not defteri sınırlamaları
Google Colab'ın IP itibarı sorunlarının yanı sıra, scraping'in kararlılığını doğrudan etkileyen bir dizi teknik sınırlaması vardır:
- Aktif olmayan zaman aşımı. Colab'ın ücretsiz sürümü, not defterini yaklaşık 90 dakika boyunca kullanılmadığında kapatır ve 12 saatlik kesintisiz çalışmadan sonra oturumu zorla sonlandırır - binlerce sayfanın uzun süreli scraping'i parçalar halinde yapılmalı veya ara sonuçlar Google Drive'a kaydedilmelidir.
- Her yeni çalıştırmada IP değişimi. Ortamı kapatıp yeniden bağladıysanız, sanal makinenin IP adresi değişir - bu, proxy hizmetinin tarafında IP beyaz listeleme ayarını bozar.
- Çıkan bağlantılara sınırlama. Google, bir sanal makineden aynı anda yapılabilecek ağ bağlantı sayısını sınırlar, bu nedenle onlarla birlikte çok sayıda paralel isteği içeren agresif çoklu iş parçacığı, site engellemesi yerine Colab'ın kendi limitlerine takılabilir.
- Disk montajı olmadan kalıcı depolama yoktur. Çerezler, tarayıcı oturumları ve proxy bağlantı önbellekleri her yeniden başlatmada kaybolur - kimlik doğrulamalı scraping için çerezlerin açıkça Google Drive'da bir dosyaya kaydedilmesi gerekir.
- Öngörülemeyen ağ gecikmeleri. Google'ın bulut altyapısı bazen gecikme dalgalanmaları yaratır, bu nedenle istek zaman aşımını daha fazla süreyle ayarlamak gerekir (standart 5-10 yerine 15-30 saniye).
Bu sınırlamalar, Colab'ı scraper mantığını geliştirmek ve hata ayıklamak için mükemmel bir araç haline getirirken, uzun süreli üretim görevleri için uygun değildir - bunlar için hazır betiği VPS veya kendi IP'si olan bir sunucuya taşımak daha iyidir.
Proxy döngüsü ve hata işleme
Scraping'in ilk engellemede çökmesini önlemek için, kodda proxy değişimi ile tekrar deneme mantığı olmalıdır. Aşağıda, Colab'da doğrudan çalıştırılabilecek basit bir döngü örneği verilmiştir.
import requests
import time
import random
proxy_pool = [
"http://login:[email protected]:9000",
"http://login:[email protected]:9001",
"http://login:[email protected]:9002",
]
def get_with_retry(url, max_retries=5):
for attempt in range(max_retries):
proxy_url = random.choice(proxy_pool)
proxies = {"http": proxy_url, "https": proxy_url}
try:
response = requests.get(url, proxies=proxies, timeout=20)
if response.status_code == 200:
return response
else:
print(f"Girişim {attempt+1}: durum {response.status_code}")
except requests.exceptions.RequestException as e:
print(f"Girişim {attempt+1}: hata {e}")
time.sleep(random.uniform(2, 5))
return None
result = get_with_retry("https://example.com/catalog")
if result:
print(result.status_code)
else:
print("Tüm girişimler tükendi")
Büyük katalogların (örneğin, Wildberries'deki binlerce ürün kartı) scraping'i için bu mantık, istekler arasında duraklamalar ve ara sonuçların Google Drive'da CSV veya veritabanına kaydedilmesi ile görev kuyruğuna eklenir, böylece Colab oturumu kesildiğinde ilerlemeyi kaybetmemek için.
Colab'da scraper'ı çalıştırmadan önce kontrol listesi
- Proxy'ler bağlanmış ve ana döngüden önce ayrı bir test isteği ile test edilmiştir
- Proxy'nin kullanıcı adı ve şifresi Colab Secrets'ta saklanmaktadır, açık kodda değil
- JS siteleri için Selenium, selenium-wire veya kimlik doğrulama uzantısı ile kullanılmaktadır
- Kodda hata 403/429 durumlarında proxy döngüsü ve tekrar deneme mantığı bulunmaktadır
- Ara sonuçlar her N kayıttan sonra Google Drive'a kaydedilmektedir
- Olası bulut ağ gecikmelerini dikkate alarak istek zaman aşımı artırılmıştır
- Colab'ın çıkış bağlantıları limitlerine takılmamak için isteklerin paralelliği sınırlıdır
- Üretim görevleri için betiğin ayrı bir sunucuya sabit IP ile taşınması planlanmıştır
Sonuç
Google Colab ve bulut Jupyter, scraping mantığını hızlı bir şekilde geliştirmek ve test etmek için mükemmel bir şekilde uygundur, ancak veri merkezi ortak IP'leri nedeniyle genellikle ilk adımlarda proxy gerektirir. Agresif koruması olmayan basit siteler için veri merkezi proxy'leri yeterli olacaktır, ancak pazar yerleri, arama motorları ve sosyal medya scraping'i için daha güvenilir olan konut ve mobil IP'ler, ASN filtrelerine daha az takılmaktadır.
Eğer Wildberries veya Ozon'daki fiyatları düzenli olarak Colab'dan izlemeyi planlıyorsanız, konut proxy'leri ile başlamanızı öneririz - bunlar sık yasaklamalar olmadan stabil erişim sağlar, tek seferlik test betikleri için ise daha bütçe dostu veri merkezi proxy'leri ile aynı şekilde requests veya Selenium üzerinden bağlanabilirsiniz.