Web kazıma, iş dünyasında analiz, araştırma ve istihbarat gibi farklı amaçlar için web sitelerinden veri çıkarmanın güçlü bir yoludur. Bu eğitim, temel stratejilere ve tekniklere odaklanarak Python'da Walmart ürün bilgilerini kazımanıza yardımcı olur. Walmart kazıma, Walmart siteleri altındaki çeşitli sayfalarda bulunan isim, fiyat veya yorumlar gibi ürünlerin ayrıntılarını çıkarabileceğimiz bir örnek sunar.
Bu kılavuz HTTP istekleri yapmak için requests kütüphanesini ve HTML içeriğini ayrıştırmak için lxml kütüphanesini kullanacaktır.
Başlamadan önce, makinenizde Python'un kurulu olduğundan emin olun. Gerekli kütüphaneleri pip kullanarak yükleyebilirsiniz:
pip install requests
pip install lxml
pip install urllib3
Daha sonra, gerekli kütüphaneleri içe aktaralım:
import requests
from lxml import html
import csv
import random
import urllib3
import ssl
Kazınacak Walmart ürün URL'lerinin listesi.
product_urls = [
'link with https',
'link with https',
'link with https'
]
Bir web sitesini kazımak için, gerçek bir tarayıcıdan gelen bir isteği taklit etmek amacıyla başta User-Agent başlığı olmak üzere doğru başlıkların kullanılması çok önemlidir. Dahası, döndürülebilir proxy sunucuları kullanarak site sahipleri tarafından uygulanan anti-bot önlemleri nedeniyle kısıtlanmaktan kaçınılabilir. Aşağıda, IP adresine dayalı yetkilendirme gerektiren proxy sunucularının nasıl entegre edileceğine ilişkin bir açıklama ile birlikte User-Agent dizelerinin örnekleri bulunmaktadır.
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'
]
proxy = [
'<ip>:<port>',
'<ip>:<port>',
'<ip>:<port>',
]
Tarayıcı isteklerini taklit etmek ve tespit edilmekten kaçınmak için başlıkları ayarlayın.
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',
'priority': 'u=0, i',
'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',
}
Ürün ayrıntılarını saklamak için boş bir liste oluşturun.
product_details = []
URL sayfaları için numaralandırma işlemi aşağıdaki gibi çalışır: Her URL sayfası için rastgele seçilen bir Kullanıcı Aracısı ve proxy kullanılarak bir GET isteği gönderilir. HTML yanıtı alındıktan sonra, ürün adı, fiyatı ve yorumları gibi ayrıntıları çıkarmak için ayrıştırılır. Çıkarılan veriler bir sözlük olarak saklanır ve daha sonra daha önce oluşturulan bir listeye eklenir.
for url in product_urls:
headers['user-agent'] = random.choice(user_agents)
proxies = {
'http': f'http://{random.choice(proxy)}',
'https': f'http://{random.choice(proxy)}',
}
try:
# URL'ye bir HTTP GET isteği gönderin
response = requests.get(url=url, headers=headers, proxies=proxies, verify=False)
print(response.status_code)
response.raise_for_status()
except requests.exceptions.RequestException as e:
print(f'Error fetching data: {e}')
# HTML içeriğini lxml kullanarak ayrıştırma
parser = html.fromstring(response.text)
# Ürün başlığını çıkar
title = ''.join(parser.xpath('//h1[@id="main-title"]/text()'))
# Ürün fiyatını çıkarın
price = ''.join(parser.xpath('//span[@itemprop="price"]/text()'))
# İnceleme ayrıntılarını çıkarın
review_details = ''.join(parser.xpath('//div[@data-testid="reviews-and-ratings"]/div/span[@class="w_iUH7"]/text()'))
# Çıkarılan ayrıntıları bir sözlükte saklayın
product_detail = {
'title': title,
'price': price,
'review_details': review_details
}
# Ürün ayrıntılarını listeye ekleme
product_details.append(product_detail)
Başlık:
Fiyat:
Ayrıntıları gözden geçirin:
with open('walmart_products.csv', 'w', newline='') as csvfile:
fieldnames = ['title', 'price', 'review_details']
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writeheader()
for product_detail in product_details:
writer.writerow(product_detail)
İşte daha iyi anlamanıza yardımcı olmak için yorumlarla birlikte kodun tamamı:
import requests
from lxml import html
import csv
import random
import urllib3
import ssl
ssl._create_default_https_context = ssl._create_stdlib_context
urllib3.disable_warnings()
# Kazınacak ürün URL'lerinin listesi
product_urls = [
'link with https',
'link with https',
'link with https'
]
# Anonimlik için rastgele Kullanıcı Aracısı dizeleri
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'
]
# IP rotasyonu için proxy listesi
proxy = [
'<ip>:<port>',
'<ip>:<port>',
'<ip>:<port>',
]
# Tarayıcı isteklerini taklit etmek için üstbilgiler
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',
'priority': 'u=0, i',
'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',
}
# Ürün ayrıntılarını saklamak için boş bir liste başlatma
product_details = []
# Her ürün URL'si arasında döngü
for url in product_urls:
headers['user-agent'] = random.choice(user_agents)
proxies = {
'http': f'http://{random.choice(proxy)}',
'https': f'http://{random.choice(proxy)}',
}
try:
# URL'ye bir HTTP GET isteği gönderin
response = requests.get(url=url, headers=headers, proxies=proxies, verify=False)
print(response.status_code)
response.raise_for_status()
except requests.exceptions.RequestException as e:
print(f'Error fetching data: {e}')
# HTML içeriğini lxml kullanarak ayrıştırma
parser = html.fromstring(response.text)
# Ürün başlığını çıkar
title = ''.join(parser.xpath('//h1[@id="main-title"]/text()'))
# Ürün fiyatını çıkarın
price = ''.join(parser.xpath('//span[@itemprop="price"]/text()'))
# İnceleme ayrıntılarını çıkarın
review_details = ''.join(parser.xpath('//div[@data-testid="reviews-and-ratings"]/div/span[@class="w_iUH7"]/text()'))
# Çıkarılan ayrıntıları bir sözlükte saklayın
product_detail = {
'title': title,
'price': price,
'review_details': review_details
}
# Ürün ayrıntılarını listeye ekleme
product_details.append(product_detail)
# Çıkarılan verileri bir CSV dosyasına yazın
with open('walmart_products.csv', 'w', newline='') as csvfile:
fieldnames = ['title', 'price', 'review_details']
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writeheader()
for product_detail in product_details:
writer.writerow(product_detail)
Eğitimimiz, Walmart'tan ürün verilerini kazımak ve daha sonra analiz etmek üzere CSV formatında kaydetmek için Python kütüphanelerinin nasıl kullanılacağını göstermektedir. Sağlanan komut dosyası temeldir ve kazıma işleminin verimliliğini artırmak için geliştirilebilecek bir temel sunar. Geliştirmeler arasında insan tarama modellerini taklit etmek için istekler arasında rastgele gecikmeler eklemek, tespit edilmekten kaçınmak için Kullanıcı Aracısı ve proxy rotasyonu uygulamak ve olası kazıma kesintilerini veya arızalarını yönetmek için sağlam bir hata işleme sistemi geliştirmek yer alabilir.
Yorumlar: 0