Rekabet analizi, fiyat izleme ve pazar araştırması için e-ticaret web sitelerinden ürün verilerini kazımak önemlidir. Ürün sayfalarından verimli bir şekilde veri kazımak için Python kullanabilirsiniz. Bu kılavuzda, istek ve lxml kombinasyonunu kullanarak çevrimiçi mağazalardan ürün bilgilerinin nasıl kazınacağını göstereceğiz.
E-ticaret kazıma, çevrimiçi mağazalardan adlar, fiyatlar ve kimlikler gibi ürün ayrıntılarını çıkarmayı içerir. Python, çok yönlü kütüphaneleri ile bu görevi verimli ve basit hale getirir. Bu kılavuzda, Costco'nun web sitesinden ürün bilgilerini kazıyacağız.
Kazıma işlemine başlamadan önce, gerekli Python kütüphanelerinin kurulu olduğundan emin olun:
pip install requests
pip install lxml
Web sitesindeki belirli ürün sayfalarından ürün adlarını, ürün özelliklerini ve ürün markalarını çıkarmaya odaklanacağız.
Herhangi bir web sitesinden veri çekmek için web sayfasının yapısını anlamanız gerekir. Bir web sitesi sayfası açın ve kazımak istediğiniz öğeleri inceleyin (örneğin, ürün adı, marka özellikleri, vb.).
İlk olarak, ürün sayfalarına HTTP GET istekleri göndermek için requests kütüphanesini kullanacağız. Ayrıca istek başlıklarını gerçek bir tarayıcı isteğini taklit edecek şekilde ayarlayacağız.
import requests
# Kazınacak ürün URL'lerinin listesi
urls = [
"https://www.costco.com/kirkland-signature-men's-sneaker.product.4000216649.html",
"https://www.costco.com/adidas-ladies'-puremotion-shoe.product.4000177646.html"
]
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-US,en;q=0.9',
'cache-control': 'no-cache',
'dnt': '1',
'pragma': 'no-cache',
'sec-ch-ua': '"Not/A)Brand";v="99", "Google Chrome";v="91", "Chromium";v="91"',
'sec-ch-ua-mobile': '?0',
'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/91.0.4472.124 Safari/537.36',
}
# Her URL'de döngü oluşturun ve bir GET isteği gönderin
for url in urls:
response = requests.get(url, headers=headers)
if response.status_code == 200:
html_content = response.text
# Diğer işlemler sonraki adımlarda eklenecektir
else:
print(f"Failed to retrieve {url}. Status code: {response.status_code}")
lxml kullanarak, ayrıştırılmış HTML'den gerekli veri noktalarını çıkaracağız.
from lxml import html
# Kazınmış verileri depolamak için liste
scraped_data = []
# Her URL'de döngü oluşturun ve bir GET isteği gönderin
for url in urls:
response = requests.get(url)
if response.status_code == 200:
html_content = response.content
# HTML içeriğini lxml ile ayrıştırma
tree = html.fromstring(html_content)
# XPath kullanarak veri ayıklama
product_name = tree.xpath('//h1[@automation-id="productName"]/text()')[0].strip()
product_feature = tree.xpath('//ul[@class="pdp-features"]//li//text()')
product_brand = tree.xpath('//div[@itemprop="brand"]/text()')[0].strip()
# Çıkarılan verileri listeye ekleme
scraped_data.append({'Product Name': product_name, 'Product Feature': product_feature, 'Brand': product_brand})
else:
print(f"Failed to retrieve {url}. Status code: {response.status_code}")
# Kazınan verileri yazdırma
for item in scraped_data:
print(item)
Web siteleri genellikle anti-bot önlemleri uygular. Proxy kullanmak ve kullanıcı aracılarını döndürmek tespit edilmekten kaçınmaya yardımcı olabilir.
IP yetkilendirmesi ile proxy kullanma:
proxies = {
'http': 'http://your_proxy_ip:your_proxy_port',
'https': 'https://your_proxy_ip:your_proxy_port'
}
response = requests.get(url, proxies=proxies)
Dönen Kullanıcı Aracıları:
import random
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 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
# Gerektiğinde daha fazla kullanıcı aracısı ekleyin
]
headers['user-agent'] = random.choice(user_agents)
response = requests.get(url, headers=headers)
Son olarak, kazınan verileri daha fazla analiz için bir CSV dosyasına kaydedeceğiz.
import csv
csv_file = 'costco_products.csv'
fieldnames = ['Product Name', 'Product Feature', 'Brand']
# CSV dosyasına veri yazma
try:
with open(csv_file, mode='w', newline='', encoding='utf-8') as file:
writer = csv.DictWriter(file, fieldnames=fieldnames)
writer.writeheader()
for item in scraped_data:
writer.writerow(item)
print(f"Data saved to {csv_file}")
except IOError:
print(f"Error occurred while writing data to {csv_file}")
import requests
import urllib3
from lxml import html
import csv
import random
import ssl
ssl._create_default_https_context = ssl._create_stdlib_context
urllib3.disable_warnings()
# Kazınacak ürün URL'lerinin listesi
urls = [
"https://www.costco.com/kirkland-signature-men's-sneaker.product.4000216649.html",
"https://www.costco.com/adidas-ladies'-puremotion-shoe.product.4000177646.html"
]
# başlıklar
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-US,en;q=0.9',
'cache-control': 'no-cache',
'dnt': '1',
'pragma': 'no-cache',
'sec-ch-ua': '"Not/A)Brand";v="99", "Google Chrome";v="91", "Chromium";v="91"',
'sec-ch-ua-mobile': '?0',
'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/91.0.4472.124 Safari/537.36',
}
# Dönen istekler için kullanıcı aracılarının listesi
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 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
# Gerektiğinde daha fazla kullanıcı aracısı ekleyin
]
# Dönen talepler için vekillerin listesi
proxies = [
{'http': 'http://your_proxy_ip:your_proxy_port', 'https': 'https://your_proxy_ip:your_proxy_port'},
{'http': 'http://your_proxy_ip2:your_proxy_port2', 'https': 'https://your_proxy_ip2:your_proxy_port2'},
# Gerektiğinde daha fazla proxy ekleyin
]
# Kazınmış verileri depolamak için liste
scraped_data = []
# Her URL'de döngü oluşturun ve bir GET isteği gönderin
for url in urls:
# İstek üstbilgileri için rastgele bir kullanıcı aracısı seçin
headers['user-agent'] = random.choice(user_agents)
# İstek için rastgele bir proxy seçin
proxy = random.choice(proxies)
# URL'ye üstbilgiler ve proxy ile HTTP GET isteği gönderme
response = requests.get(url, headers=headers, proxies=proxy, verify=False)
if response.status_code == 200:
# Yanıttaki HTML içeriğini saklayın
html_content = response.content
# HTML içeriğini lxml ile ayrıştırma
tree = html.fromstring(html_content)
# XPath kullanarak veri ayıklama
product_name = tree.xpath('//h1[@automation-id="productName"]/text()')[0].strip()
product_feature = tree.xpath('//ul[@class="pdp-features"]//li//text()')
product_brand = tree.xpath('//div[@itemprop="brand"]/text()')[0].strip()
# Çıkarılan verileri listeye ekleme
scraped_data.append({'Product Name': product_name, 'Product Feature': product_feature, 'Brand': product_brand})
else:
# İstek başarısız olursa hata mesajı yazdır
print(f"Failed to retrieve {url}. Status code: {response.status_code}")
# CSV dosya kurulumu
csv_file = 'costco_products.csv'
fieldnames = ['Product Name', 'Product Feature', 'Brand']
# CSV dosyasına veri yazma
try:
with open(csv_file, mode='w', newline='', encoding='utf-8') as file:
writer = csv.DictWriter(file, fieldnames=fieldnames)
writer.writeheader()
for item in scraped_data:
writer.writerow(item)
print(f"Data saved to {csv_file}")
except IOError:
# Dosyaya yazma başarısız olursa hata mesajı yazdır
print(f"Error occurred while writing data to {csv_file}")
Costco gibi e-ticaret sitelerinden kazıma yapmak için Python kullanmak, ürün bilgilerini analiz etmek ve stratejik kararlar almak için toplamak için etkili bir yöntemdir. Lxml'nin yanı sıra Requests gibi kütüphanelerin doğru kullanımı, bir anti-bot API'sinin etkili bir şekilde uygulanmasını unutmadan HTML içeriklerini işleyebilen otomatik çıkarma işlemleriyle sonuçlanır. Etik kazıma protokollerine her zaman uyulması gerektiği unutulmamalıdır.
Yorumlar: 0