Amazon gibi e-ticaret devlerinin verilerine erişmek pazar analizi, fiyatlandırma stratejileri ve ürün araştırması için çok önemlidir. Bu veriler, web sitelerinden büyük miktarda bilgi çıkarmayı içeren bir yöntem olan web kazıma yoluyla toplanabilir. Ancak Amazon, verilerini titizlikle koruduğundan geleneksel kazıma teknikleri genellikle etkisiz kalmaktadır. Bu kapsamlı kılavuzda, Amazon'dan ürün verilerini toplama yöntemlerini inceleyecek ve platformun güçlü kazıma önleme sistemlerini atlatmaya yönelik stratejileri tartışacağız. Bu zorlukların üstesinden gelmeye ve işiniz veya araştırma amaçlarınız için gereken verileri verimli bir şekilde toplamaya yardımcı olabilecek Python, proxy'ler ve gelişmiş kazıma tekniklerinin kullanımını keşfedeceğiz.
Amazon'dan başarılı bir şekilde veri kazımak için aşağıda özetlenen yapılandırılmış algoritmayı takip edebilirsiniz. Bu yöntem, gerekli bilgileri verimli ve doğru bir şekilde almanızı sağlar.
Adım 1: Amazon ürün sayfalarına HTTP istekleri gönderme:
Adım 2: HTML içeriğini ayrıştırma:
Adım 3: Verilerin saklanması:
Amazon, kazıma çabalarını engellemek için bağlantı hızı sınırlamaları, CAPTCHA entegrasyonu ve IP engelleme dahil olmak üzere çeşitli önlemler alır. Kullanıcılar bu engelleri aşmak için yüksek kaliteli proxy'ler kullanmak gibi karşı önlemler alabilirler.
Kapsamlı kazıma faaliyetleri için, önemli miktarda ürün verisi toplamak üzere gelişmiş Python teknikleri kullanılabilir. Bu teknikler, tespitten kaçmaya ve başarılı veri çıkarımı sağlamaya yardımcı olan başlık doldurma ve TLS parmak izini içerir.
Bu adımlar, Python 3.12.2 kullanılarak pratik uygulamasını göreceğimiz makalenin ilerleyen bölümlerinde açıklanmaktadır
Bir web kazıma projesi başlatmak için, HTML ayrıştırma için lxml kütüphanesini ve Amazon web sunucusuna yönlendirilen HTTP isteklerini yönetmek için requests kütüphanesini kullanarak temel bir kazıyıcı kurarak başlayacağız.
Odak noktamız, Amazon ürün sayfalarından ürün adları, fiyatlar ve derecelendirmeler gibi temel bilgilerin çıkarılması olacaktır. Ayrıca, HTML'yi verimli bir şekilde ayrıştırmak ve istekleri yönetmek için teknikleri sergileyerek verilerin kesin ve düzenli bir şekilde çıkarılmasını sağlayacağız.
Proje bağımlılıklarını korumak ve çatışmalardan kaçınmak için, bu web kazıma çabası için ayrı bir sanal ortam oluşturulması tavsiye edilir. Sanal ortamlar kurmak için "venv" veya "pyenv" gibi araçların kullanılması önerilir.
Aşağıdaki üçüncü parti Python kütüphanelerine ihtiyacınız olacak:
HTTP istekleri göndermek ve web içeriğini almak için kullanılır. Genellikle web kazıma ve web API'leri ile etkileşim için kullanılır.
Kurulum:
pip install requests
XML ve HTML belgelerini ayrıştırmak ve işlemek için bir kütüphane. Web kazıma ve web sayfalarından yapılandırılmış verilerle çalışmak için sıklıkla kullanılır.
Kurulum:
pip install lxml
Burada kazıyıcımızın çalışması için gerekli kütüphaneleri içe aktarmamız gerekiyor. HTTP isteklerini işlemek için bir istek kütüphanesi, CSV dosya işlemini işlemek için CSV kütüphanesi, rastgele değerler oluşturmak ve rastgele seçimler yapmak için rastgele kütüphane, ham HTML içeriğini ayrıştırmak için lxml kütüphanesi ve tür ipucu için Dict ve List içerir.
import requests
import csv
import random
from lxml import html
from typing import Dict, List
Aşağıdaki kod parçacığı amazon_product_urls.csv adlı bir CSV dosyasını okur ve her satır bir Amazon ürün sayfasının URL'sini içerir. Kod, satırlar üzerinde yineleme yaparak her satırdan URL'leri çıkarır ve bunları URL adlı bir listeye ekler.
with open('amazon_product_urls.csv', 'r') as file:
reader = csv.DictReader(file)
for row in reader:
urls.append(row['url'])
İstek başlıkları HTTP isteklerinde önemli bir rol oynar, karmaşık istemci ve istek bilgilerini sağlar. Kazıma yaparken, tespit edilmekten kaçınmak ve istediğiniz bilgilere kolayca erişmek için yetkili kullanıcı başlıklarını kopyalamak önemlidir. Yaygın olarak kullanılan başlıkları taklit ederek, kazıyıcılar tespit tekniklerinden kaçınabilir ve etik standartları korurken verilerin tutarlı bir şekilde çıkarılmasını sağlayabilir.
Proxy'ler web kazıma işleminde aracı görevi görür ve kazıyıcının IP adresini maskeleyerek sunucunun tespit edilmesini ve engellenmesini önler. Dönen bir proxy, olası engellemeleri önlemek için her isteği yeni bir IP adresiyle göndermenize olanak tanır. Yerleşik veya mobil proxy'lerin kullanımı, gerçek ana bilgisayar ve sağlayıcı tespiti nedeniyle kazıma karşıtı önlemlere karşı dayanıklılığı güçlendirir.
İstek başlıklarını ve proxy sunucularını IP adresi yetkilendirmesi ile entegre etmek için kod:
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': '"Google Chrome";v="123", "Not:A-Brand";v="8", "Chromium";v="123"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"Windows"',
'sec-fetch-dest': 'document',
'sec-fetch-mode': 'navigate',
'sec-fetch-site': 'same-origin',
'sec-fetch-user': '?1',
'upgrade-insecure-requests': '1',
}
proxies = {'http': '', 'https': ''}
Burada, her istek için rastgele bir kullanıcı aracısının seçileceği bir kullanıcı aracısı koleksiyonları listesi oluşturacağız. Her istekten sonra Kullanıcı Aracısını döndürmek gibi bir başlık döndürme mekanizması uygulamak, bot algılama önlemlerini atlatmaya daha fazla yardımcı olabilir.
useragents = [
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4591.54 Safari/537.36",
"Mozilla/5.0 (Windows NT 7_0_2; Win64; x64) AppleWebKit/541.38 (KHTML, like Gecko) Chrome/105.0.1585 Safari/537.36",
"Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.7863.44 Safari/537.36"
]
headers['user-agent'] = random.choice(useragnets)
Özel üstbilgiler, 30 saniyelik bir zaman aşımı ve istek için belirtilen proxy'lerle belirtilen bir URL'ye HTTP GET isteği gönderir.
response = requests.get(url=url, headers=headers, proxies=proxies, timeout=30)
Gerekli veri noktaları: başlık, fiyat ve derecelendirmeler. Şimdi, ilgili veri noktalarıyla birlikte ekran görüntülerinde gösterilen öğeler için ilgili XPath'i inceleyelim ve tanımlayalım.
Aşağıdaki ekran görüntüsü, bir Amazon ürün sayfasından ürün başlığını çıkarmak için `//span[@id="productTitle"]/text()` XPath'ini bulmak için kullanılan Chrome DevTools "Inspect" özelliğini göstermektedir.
Aşağıdaki ekran görüntüsü, bir Amazon ürün sayfasından ürün fiyatını çıkarmak için `//div[@id="corePrice_feature_div"]/div/div/span/span/text()` XPath'ini bulmayı göstermektedir.
Ekran görüntüsü, bir Amazon ürün sayfasından ürün derecelendirmelerini çıkarmak için `//span[@id="acrPopover"]/@title'` XPath'ini bulmayı göstermektedir.
Bir web sayfasından belirli bilgileri ayıklamak için XPath ifadeleri sağlayan bir sözlük oluşturun: bir ürünün başlığı, derecelendirmeleri ve fiyatı.
xpath_queries = {'title': '//span[@id="productTitle"]/text()', 'ratings': '//span[@id="acrPopover"]/@title', 'price': '//span[@class="a-offscreen"]/text()'}
Aşağıdaki kod, Amazon sunucusuna yapılan GET isteğinden elde edilen HTML içeriğini yapılandırılmış ağaç benzeri bir biçime ayrıştırarak, öğelerinde ve niteliklerinde daha kolay gezinmeye ve bunları manipüle etmeye olanak tanır.
tree = html.fromstring(response.text)
Aşağıdaki kod parçacığı, bir XPath sorgusu kullanarak ayrıştırılmış HTML ağacından verileri ayıklar ve belirtilen anahtarla bir sözlüğe atar. strip(), varsa baştaki ve sondaki boşlukları kaldırmak için kullanılır. XPath sorgusunun ilk sonucunu alır ve bunu extracted_data sözlüğünde verilen anahtarın altında saklar.
data = tree.xpath(xpath_query)[0].strip()
extracted_data[key] = data
Aşağıdaki kod, extracted_data sözlüğündeki verileri product_data.csv adlı bir CSV dosyasına yazar. Başlık satırının yalnızca dosya boşsa yazıldığından emin olun. Dosya boş değilse, verileri CSV dosyasına ek bir satır olarak ekler. Bu işlev, CSV dosyasının mevcut metnin üzerine yazılmadan yeni çıkarılan verilerle sürekli olarak güncellenmesini sağlar.
csv_file_path = 'product_data.csv'
fieldnames = ['title', 'ratings', 'price']
with open(csv_file_path, 'a', newline='') as csvfile:
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
if csvfile.tell() == 0:
writer.writeheader()
writer.writerow(extracted_data)
Lütfen hızlı bir şekilde başlamanıza yardımcı olacak eksiksiz kodumuza bakın. Kod iyi yapılandırılmış ve belgelenmiştir, bu da onu yeni başlayan dostu yapar. Bu kodu çalıştırmak için, kullanıcının aynı dizinde "amazon_product_urls" adlı bir CSV dosyasına sahip olması gerekir. CSV dosyasının yapısı aşağıdadır:
import requests
import csv
import random
from lxml import html
from typing import Dict, List
def send_requests(
url: str, headers: Dict[str, str], proxies: Dict[str, str]
) -> List[Dict[str, str]]:
"""
Başlıklar ve proxy'ler ile birden fazla URL'ye HTTP GET istekleri gönderir.
Args:
urls (str): İsteklerin gönderileceği URL.
headers (Dict[str, str]): İstek başlıklarını içeren sözlük.
proxies (Dict[str, str]): Proxy ayarlarını içeren sözlük.
Returns:
Response: Her URL için yanıt verilerini içeren yanıt nesnesi.
"""
try:
response = requests.get(url, headers=headers, proxies=proxies, timeout=30)
# Yanıt doğrulama
if len(response.text)> 10000:
return response
return None
except Exception as e:
print(f"Error occurred while fetching URL {url}: {str(e)}")
def extract_data_from_html(
response, xpath_queries: Dict[str, str]
) -> Dict[str, List[str]]:
"""
XPath sorgularını kullanarak HTML içeriğinden veri çıkarır.
Args:
response (Response): Yanıt Nesnesi.
xpath_queries (Dict[str, str]): Veri çıkarma için XPath sorguları içeren sözlük.
Returns:
Dict[str, str]: Her XPath sorgusu için çıkarılan verileri içeren sözlük.
"""
extracted_data = {}
tree = html.fromstring(response.text)
for key, xpath_query in xpath_queries.items():
data = tree.xpath(xpath_query)[0].strip()
extracted_data[key] = data
return extracted_data
def save_to_csv(extracted_data: Dict[str, any]):
"""
DictWriter kullanarak bir sözlüğü CSV dosyasına satır olarak kaydeder.
Args:
extracted_data (Dict[str, any]): Bir veri satırını temsil eden sözlük.
"""
csv_file_path = "product_data.csv"
fieldnames = ["title", "ratings", "price"]
with open(csv_file_path, "a", newline="") as csvfile:
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
if csvfile.tell() == 0:
writer.writeheader() # Yalnızca dosya boşsa başlık yaz
writer.writerow(extracted_data)
def main():
# Bir CSV dosyasından URL'leri okuma
urls = []
with open("amazon_product_urls.csv", "r") as file:
reader = csv.DictReader(file)
for row in reader:
urls.append(row["url"])
# İstek başlıklarını tanımlama
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": '"Google Chrome";v="123", "Not:A-Brand";v="8", "Chromium";v="123"',
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": '"Windows"',
"sec-fetch-dest": "document",
"sec-fetch-mode": "navigate",
"sec-fetch-site": "same-origin",
"sec-fetch-user": "?1",
"upgrade-insecure-requests": "1",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36",
}
useragents = [
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4591.54 Safari/537.36",
"Mozilla/5.0 (Windows NT 7_0_2; Win64; x64) AppleWebKit/541.38 (KHTML, like Gecko) Chrome/105.0.1585 Safari/537.36",
"Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.7863.44 Safari/537.36"
]
# Proxy'leri tanımlama
proxies = {"http": "IP:Port", "https": "IP:Port"}
# URL'lere istek gönderme
for url in urls:
# Üstbilgilerde kullanıcı aracısı rotasyonu
headers["user-agent"] = random.choice(useragnets)
response = send_requests(url, headers, proxies)
if response:
# HTML içeriğinden veri çıkarma
xpath_queries = {
"title": '//span[@id="productTitle"]/text()',
"ratings": '//span[@id="acrPopover"]/@title',
"price": '//span[@class="a-offscreen"]/text()',
}
extracted_data = extract_data_from_html(response, xpath_queries)
# Çıkarılan verileri bir CSV dosyasına kaydetme
save_to_csv(extracted_data)
if __name__ == "__main__":
main()
Kesintisiz veri çıkarımı için Datacenter IPv4, dönen mobil, ISP ve konut proxy'leri dahil olmak üzere farklı proxy çözümleri mevcuttur. Gerçek kullanıcı davranışını simüle etmek için uygun rotasyon mantığı ve kullanıcı aracıları kullanılırken, özel proxy'ler dahili rotasyon ve kapsamlı IP havuzları ile büyük ölçekli kazıma işlemini destekler. Her bir proxy seçeneğinin artılarını ve eksilerini anlamak, kesintisiz veri çıkarımı için çok önemlidir.
Tip | Artıları | Eksileri |
---|---|---|
Veri Merkezi Proxyleri |
Yüksek hız ve performans. Uygun maliyetli. Büyük hacimli talepler için idealdir. |
Kolayca tespit edilebilir ve kara listeye alınabilir. Anti-scraping veya anti-bot sistemlerine karşı güvenilir değildir. |
Konut Vekaletnameleri |
Gerçek yerleşim IP'leri nedeniyle yüksek meşruiyet. Konuma özel veri kazıma için geniş küresel IP kullanılabilirliği. IP döndürme yetenekleri. |
Veri merkezi proxy'lerinden daha pahalıdır. |
Mobil Proxyler |
Son derece meşru IP'ler. Bloklardan ve doğrulama istemlerinden kaçınmak için etkilidir. |
Diğer proxy türlerine göre daha pahalıdır. Mobil ağa bağımlılık nedeniyle veri merkezi proxy'lerinden daha yavaş. |
İSS Proxyleri |
Son derece güvenilir IP'ler. Konut IP'lerinden daha hızlı. |
Sınırlı IP kullanılabilirliği. IP rotasyonu mevcut değil. |
Amazon'dan ürün verilerini kazımak, platformun kazıma önleme mekanizmalarında etkili bir şekilde gezinmek için titiz bir hazırlık gerektirir. Python ile birlikte proxy sunucularının kullanılması, verimli veri işleme ve gerekli bilgilerin hedefli bir şekilde çıkarılmasını sağlar. Web kazıma için proxy seçerken performans, maliyet, sunucu güvenilirliği ve projenizin özel gereksinimleri gibi faktörleri göz önünde bulundurmak çok önemlidir. Dinamik proxy'ler kullanmak ve güvenlik önlemlerine karşı stratejiler uygulamak, engellenme riskini en aza indirebilir ve kazıma sürecinin genel verimliliğini artırabilir.
Yorumlar: 0