Bir web sitesinden veri toplamak, içeriğini toplamaktan çok daha fazlasıdır; işin içinde çok şey vardır. Sınırları, boşlukları ve diğer karmaşık engelleri aşmak için Python veri kazıma gibi çok sayıda ek yöntem kullanılmalıdır.
Bu makalede, Python kazıma işleminin ne olduğunu tanımlayacak ve neden bu görev için en uygun araç olduğunu gerekçelendireceğiz. Ayrıca Python veri kazıma yeteneklerinden yararlanan taktiklerin ana hatlarını çizeceğiz. Tüm bunlar, en güvenli sitelerden bile bilgi alınmasına yardımcı olacaktır.
Bu araç, web sitelerinden veri toplamak için mükemmel bir kaynak olarak hizmet etmek üzere özel olarak tasarlanmıştır. Kullanılabilirliğinin yanı sıra, Python'un Scrapy, Selenium ve BeautifulSoup gibi kütüphaneleri oldukça güçlüdür. Bunun dışında, komut dosyaları geliştirmeye devam eden ve yeni kullanıcılara destek sağlayan aktif bir yeni topluluk var. Bu yüzden Python günümüzde web kazıma için kullanılıyor. Öyleyse, şu anda mevcut olan ana stratejileri vurgulayalım.
Bu blok, kullanıcıya Python'da yerleşik olarak bulunan daha karmaşık teknikleri kullanarak karmaşık web sitelerinin nasıl kazınacağını gösterecektir. Kullanıcı nasıl yapılacağını öğrenecek:
Bu yaklaşımlar, Python veri kazımayı etkili hale getirirken, sunucudan engellenme veya erişimin reddedilmesi olasılığını en aza indirmeye yardımcı olacaktır.
Şimdi, Python'da kazıma işleminin etkili bir şekilde nasıl yapılacağına dair taktiklere geçelim.
Çok sayıda web sitesi CAPTCHA güvenlik sistemlerini, bilgilerini Python'dan kasıtlı olarak veri kazınmasına karşı korumak için sağlam bir savunma hattı olarak uygulamaktadır. Bu tür sistemler, 2Captcha veya Anti-Captcha gibi otomatik tanıma hizmetleri kullanarak veya görüntüleri bilişsel olarak tanımlamak için makine öğrenimini kullanarak birçok yolla yenilebilir. Bir başka olasılık da sorgu miktarını mahkemenin Bilgi toplama beklentisiyle ilişkilendirmeyeceği bir düzeye indirmektir.
Sorguları daha az düşmanca hale getirmek için kullanıcıların normal davranışa daha yakın bir şekilde hareket etmesi gerekir. Eylemler arasında rastgele zamanlama ekleyin, Kullanıcı Aracısını değiştirin, sayfayı kaydırın, fare işaretçisini hareket ettirin, yazı yazmayı simüle edin ve hatta daha fazlasını yapın. Python kazıma araçları olarak Selenium veya Playwright kullanımı, otomasyona çok daha fazla insan benzeri özellikler kazandırır, böylece bloklardan kaçınılabilir.
import random
import requests
url = 'https://google.com'
user_agents = [
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
]
headers = {
'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
'accept-language': 'en-IN,en;q=0.9',
'dnt': '1',
'sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"Linux"',
'sec-fetch-dest': 'document',
'sec-fetch-mode': 'navigate',
'sec-fetch-site': 'none',
'sec-fetch-user': '?1',
'upgrade-insecure-requests': '1',
}
headers['user-agent'] = random.choice(user_agents)
response = requests.get(url=url, headers=headers)
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
options = webdriver.ChromeOptions()
options.add_argument("--headless") # Tarayıcıyı grafik arayüz olmadan çalıştırma
driver = webdriver.Chrome(options=options)
driver.get("https://google.com")
# XPath ile bir öğe bulma
element = driver.find_element(By.XPATH, "//button[text()=Confirm]")
# İmleci hareket ettirmek için ActionChains kullanın
actions = ActionChains(driver)
actions.move_to_element(element).perform()
# Tarayıcıyı kapatın
driver.quit()
Bazı web siteleri normal kullanıcılar için tasarlanmış ve görünmez olan ek unsurlar yerleştirir, ancak bir bot bunları yanlışlıkla tetikleyebilir. Bu unsurlar arasında gizli formlar yer alır, bunlara tıklamak ve göndermek sitenin botun erişimini engellemesine neden olur. Veri toplamadan önce, CSS stillerini ve display: none veya opacity: 0 gibi öznitelikleri kullanın ve bu stilleri devreye sokmaktan kaçının.
İstekler doğru çerezler veya oturum yapılandırması olmadan yapılırsa, bazı siteler çok basit olduğu düşünülen tekrarlanan istekleri engelleyecektir. Bu sorunu aşmak için requests.Session() işlevini kullanın, kaydedilmiş çerezleri kullanın ve gerçek bir kullanıcı gibi davranın. User-Agent başlıklarının değiştirilmesi de gereklidir çünkü bot bunlar tarafından tanınacaktır.
Sunucunun yanıt vermemesi veya geçici olarak bir hata döndürmesi durumunda, komutu tekrarlamak için başka girişimlerde bulunmadan önce duraklayın. Üstel geri alma daha çok tercih edilir - her başarısız denemenin ardından bekleme süresinin artırılması anlamına gelir. Örneğin, 1 saniye, 2 saniye, sonra 4 saniye vb. artırılabilir. Bu, engellenme olasılığını azaltırken web sitesi sınırlamalarını en aza indirir ve Python ile veri kazıma iş yükünü azaltır.
import time
import requests
def fetch_with_backoff(url, max_retries=5):
retries = 0
wait_time = 1 # 1 saniyelik gecikme
while retries < max_retries:
try:
response = requests.get(url)
# İstek başarılı olursa, sonucu döndürün
if response.status_code == 200:
return response.text
print(f"Error {response.status_code}. Retrying in {wait_time} sec.")
except requests.exceptions.RequestException as e:
print(f"Connection error: {e}. Retrying in {wait_time} sec.")
# Yeniden denemeden önce bekleyin
time.sleep(wait_time)
# Gecikmeyi artırın
wait_time *= 2
retries += 1
return None
url = "https://google.com"
html = fetch_with_backoff(url)
Bazı web siteleri içeriği aşamalı olarak yükleyebilir veya yalnızca kullanıcıdan bazı girdiler aldıktan sonra çalışabilir. Bu gibi durumlarda BeautifulSoup gibi kütüphanelerin yardımcı olması pek olası değildir. Bu durumda, Selenium, Puppeteer ve Playwright ile web kazıma yardımcı olacaktır. Bu araçlar, sayfaları normal bir kullanıcı gibi açmanıza olanak tanır; yani kullanıcı düğmelere tıklayabilir, metin yazabilir ve sayfadaki öğelerle etkileşime geçebilir.
Kullanıcı web sayfasına erişene kadar veri göstermek için JavaScript kullanmayan bazı web sayfaları vardır. Bununla birlikte, standart bir HTTP isteği gerekli tüm bilgileri getirmeyecektir. Bu tür bilgileri toplamak için Selenium kullanılabilir veya tarayıcı DevTools kullanılarak ağ istekleri incelenebilir. Bu, daha sonra en az güçlükle bilgi almak için kullanılabilecek gizli API uç noktalarının tespit edilmesine yardımcı olur.
Web sitelerinin büyük çoğunluğu otomatik istekleri daha fazla işlem için sunucuya iletir. Bazı web sitelerinin otomatik istekleri ayırt etmenin bir yolu olarak TLS parmak izlerini doğruladığı iyi bilinmektedir. Bu, sunucunun teknoloji, şifreler ve diğer sofistike bağlantıları kullanarak TLS/SSL dikkati gibi çeşitli bağlantı özelliklerini incelediği anlamına gelir. Bunu başarmak, özel başlıklar ve proxy'ler kullanan isteklerde bağlantı özniteliklerini karıştırarak yapılabilir.
import requests
url = 'username:password@your-proxy'
proxy = 'your-proxy'
proxies = {
"http": f"http://{proxy}",
"https": f"https://{proxy}",
}
response = requests.get(url=url, proxies=proxies)
Bir web sitesi herkese açık bir API sunuyorsa, kazıma yöntemine başvurmak yerine bunu kullanmanız önerilir. Bu yaklaşım daha hızlı, daha güvenilir ve engellenme olasılığı daha düşüktür. Bir API uç noktası bulmak için iyi bir başlangıç noktası, DevTools'ta görülebilen web sitesinin yaptığı istekleri kontrol etmektir. API olmaması durumunda HTML kodu ile çalışmanız gerekecektir.
Web siteleri kodlarını değiştirebilir ve bu da kazıma işlemini geciktirebilir. Bir sayaç olarak aşağıdakileri göz önünde bulundurun:
Bazı durumlarda, web sitelerinden Python ile web kazıma, kullanım koşullarını ihlal edebilir ve hatta bazı yargı bölgelerinde yasa dışı olarak kabul edilebilir. Veri kazımadan önce site politikasının yanı sıra hem robots.txt hem de hizmet şartlarını incelemek zorunludur. Ayrıca, mevcutsa genel bir API kullanmak en iyisidir. Ayrıca, sunucu üzerindeki yükü en aza indirmek için istek sayılarına sınırlar koyun.
Python ile gelişmiş web kazıma kendi avantajlarıyla birlikte gelir, ancak bunu doğru şekilde yapmak da aynı derecede önemlidir. CAPTCHA'yı atlama, kullanıcı eylemlerini simüle etme, çerezleri ve oturumları yönetme, honeypot'larla başa çıkma ve eşzamansız web uygulamalarında verileri inceleme ile ilgili böyle bir sürecin önemli yönlerini tartıştık.
Ayrıca, kullanılan sitenin ahlaki yönünü ve ilgili sözleşmesini de aklınızda bulundurun. Kullanılabilir olduğunda API uç noktalarını kullanın ve HTML ayrıştırma kaçınılmazsa, engellenme ve yasal sorunlarla karşılaşma olasılığını azaltmak için tüm yönergeleri izleyin.
Python ile bu web kazıma eğitim yöntemlerinin kullanılmasıyla, risk potansiyeli büyük ölçüde azaltılabilirken, etkinlik maksimum düzeyde artırılabilir.
Yorumlar: 0