1. HTTP Hata Kodları ile İlgili Sorunlar (404, 403 vb.)
Web scraping yaparken karşılaşılan ilk büyük engellerden biri, HTTP hata kodlarıdır. 404, 403 gibi hata kodları, istediğiniz veriye erişmeye çalışırken karşınıza çıkabilir. Örneğin, bir URL'ye istek gönderdiğinizde "404 Not Found" hatası alabilirsiniz. Bu, istenilen sayfanın mevcut olmadığı anlamına gelir. Diğer bir yaygın hata ise 403, yani "Forbidden" hatasıdır. Bu, web sitesinin sizin isteğinizi reddettiğini gösterir.
Çözüm: HTTP hata kodlarıyla karşılaştığınızda, ilk olarak URL'nin doğru olduğundan emin olun. Eğer doğruysa, 403 hatası için genellikle user-agent başlığı eklemek işe yarar. Python'da bunu yapmak için aşağıdaki gibi bir kod kullanabilirsiniz:
import requests
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'}
response = requests.get('https://example.com', headers=headers)
if response.status_code == 200:
print("Sayfa başarıyla alındı!")
else:
print(f"Hata kodu: {response.status_code}")
2. Çoklu İsteklerde Zaman Aşımı Hataları
Birden fazla istek gönderdiğinizde, web sitesi size sınırlamalar koyabilir ve bazı durumlarda zaman aşımına uğrayabilirsiniz. Bu, özellikle veri çekme işlemlerini hızlandırmaya çalışırken ortaya çıkar.
Çözüm: Zaman aşımını engellemek için `timeout` parametresi kullanabilirsiniz. Ayrıca, istekler arasında rastgele bir süre beklemek, web sitesinin sizi engellemesini engelleyebilir. Aşağıdaki gibi bir çözüm uygulayabilirsiniz:
import time
import random
for i in range(10):
response = requests.get('https://example.com', timeout=5)
if response.status_code == 200:
print(f"Veri başarıyla alındı: {i+1}")
time.sleep(random.uniform(1, 3)) # 1 ile 3 saniye arasında rastgele bekleme
3. HTML Parsing Hataları ve Yanlış Seçiciler
HTML parsing, web scraping projelerinin temel taşlarından biridir. Ancak bazen yanlış seçiciler (selectors) kullanmak, veri çekme işleminin başarısız olmasına yol açabilir. Örneğin, `
Çözüm: Her zaman doğru HTML yapısını incelemek ve doğru seçicileri kullanmak önemlidir. Bu durumda, `BeautifulSoup` gibi bir kütüphane kullanmak işleri kolaylaştırır. İşte örnek bir kullanım:
from bs4 import BeautifulSoup
import requests
response = requests.get('https://example.com')
soup = BeautifulSoup(response.text, 'html.parser')
# Doğru bir seçici ile veri çekme
product_name = soup.select_one('.product-name').get_text()
print(f"Ürün Adı: {product_name}")
4. Dinamik Sayfalarda Veri Çekme Sorunları
Web scraping projelerinin en zorlayıcı kısmı, dinamik sayfalarda veri çekmektir. Özellikle JavaScript ile yüklenen içerikleri almak, klasik HTML parsing yöntemleriyle mümkün olmayabilir. Dinamik içerikler, genellikle sayfa yüklendikten sonra başka bir işlemle yüklenir.
Çözüm: Bu tür sayfalarda Selenium gibi araçlar kullanmak, dinamik içeriklere ulaşmanızı sağlar. Selenium, tarayıcıyı kontrol ederek JavaScript tarafından yüklenen veriyi alabilir. İşte basit bir Selenium örneği:
from selenium import webdriver
driver = webdriver.Chrome(executable_path='/path/to/chromedriver')
driver.get('https://example.com')
# Sayfa tamamen yüklendikten sonra veri çekme
product_name = driver.find_element_by_class_name('product-name').text
print(f"Ürün Adı: {product_name}")
driver.quit()
5. Veri Çekme İşleminin Yavaşlaması ve Optimizasyon Yöntemleri
Web scraping projelerinde veri çekme işlemi zamanla yavaşlayabilir. Özellikle büyük veri kümelerinde bu durum oldukça yaygındır. Bu yavaşlamaların önüne geçmek için optimizasyon tekniklerini kullanmak gerekir.
Çözüm: Paralel işleme, veri çekme işlemini hızlandırabilir. `concurrent.futures` veya `multiprocessing` gibi Python modülleri, aynı anda birden fazla istek göndermenize yardımcı olabilir. İşte örnek bir paralel işlem çözümü:
import concurrent.futures
import requests
def fetch_data(url):
response = requests.get(url)
return response.text
urls = ['https://example.com/page1', 'https://example.com/page2', 'https://example.com/page3']
with concurrent.futures.ThreadPoolExecutor() as executor:
results = executor.map(fetch_data, urls)
for result in results:
print("Veri alındı!")