Web scraping to potężny sposób na wyodrębnianie danych ze stron internetowych do różnych celów, takich jak analiza, badania i inteligencja w biznesie. Ten samouczek pomaga skrobać informacje o produktach Walmart w Pythonie, koncentrując się na kluczowych strategiach i technikach. Skrobanie Walmart przedstawia przykład, w którym możemy wydobywać szczegóły produktów, takie jak nazwa, cena lub recenzje znalezione na różnych stronach w witrynach Walmart.
Ten przewodnik będzie wykorzystywał bibliotekę requests do wykonywania żądań HTTP i bibliotekę lxml do analizowania zawartości HTML.
Zanim zaczniemy, upewnij się, że masz zainstalowany Python na swoim komputerze. Wymagane biblioteki można zainstalować za pomocą pip:
pip install requests
pip install lxml
pip install urllib3
Następnie zaimportujmy niezbędne biblioteki:
import requests
from lxml import html
import csv
import random
import urllib3
import ssl
Lista adresów URL produktów Walmart do zeskrobania.
product_urls = [
'link with https',
'link with https',
'link with https'
]
Aby zeskrobać stronę internetową, bardzo ważne jest, aby użyć odpowiednich nagłówków, w szczególności nagłówka User-Agent, aby imitować żądanie z rzeczywistej przeglądarki. Co więcej, można uniknąć ograniczeń ze względu na środki antybotowe wprowadzone przez właścicieli witryn przy użyciu rotacyjnych serwerów proxy. Poniżej znajdują się przykłady ciągów User-Agent wraz z opisem sposobu integracji serwerów proxy, które wymagają autoryzacji na podstawie adresu IP.
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>',
]
Ustaw nagłówki, aby naśladować żądania przeglądarki i uniknąć wykrycia.
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',
}
Utwórz pustą listę do przechowywania szczegółów produktu.
product_details = []
Proces wyliczania stron URL działa w następujący sposób: Dla każdej strony URL wysyłane jest żądanie GET przy użyciu losowo wybranego User-Agent i proxy. Po otrzymaniu odpowiedzi HTML jest ona analizowana w celu wyodrębnienia szczegółów, takich jak nazwa produktu, cena i recenzje. Wyodrębnione dane są przechowywane jako słownik, który jest następnie dołączany do utworzonej wcześniej listy.
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:
# Wyślij żądanie HTTP GET do adresu URL
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}')
# Parsowanie zawartości HTML przy użyciu lxml
parser = html.fromstring(response.text)
# Wyodrębnij tytuł produktu
title = ''.join(parser.xpath('//h1[@id="main-title"]/text()'))
# Wyodrębnij cenę produktu
price = ''.join(parser.xpath('//span[@itemprop="price"]/text()'))
# Szczegóły przeglądu wyciągu
review_details = ''.join(parser.xpath('//div[@data-testid="reviews-and-ratings"]/div/span[@class="w_iUH7"]/text()'))
# Przechowywanie wyodrębnionych szczegółów w słowniku
product_detail = {
'title': title,
'price': price,
'review_details': review_details
}
# Dołącz szczegóły produktu do listy
product_details.append(product_detail)
Tytuł:
Cena:
Szczegóły recenzji:
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)
Oto kompletny kod z komentarzami, które pomogą ci lepiej go zrozumieć:
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()
# Lista adresów URL produktów do zeskrobania
product_urls = [
'link with https',
'link with https',
'link with https'
]
# Losowe ciągi User-Agent zapewniające anonimowość
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'
]
# Lista proxy dla rotacji adresów IP
proxy = [
'<ip>:<port>',
'<ip>:<port>',
'<ip>:<port>',
]
# Nagłówki naśladujące żądania przeglądarki
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',
}
# Zainicjuj pustą listę do przechowywania szczegółów produktu
product_details = []
# Pętla przez każdy adres URL produktu
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:
# Wyślij żądanie HTTP GET do adresu URL
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}')
# Parsowanie zawartości HTML przy użyciu lxml
parser = html.fromstring(response.text)
# Wyodrębnij tytuł produktu
title = ''.join(parser.xpath('//h1[@id="main-title"]/text()'))
# Wyodrębnij cenę produktu
price = ''.join(parser.xpath('//span[@itemprop="price"]/text()'))
# Szczegóły przeglądu wyciągu
review_details = ''.join(parser.xpath('//div[@data-testid="reviews-and-ratings"]/div/span[@class="w_iUH7"]/text()'))
# Przechowywanie wyodrębnionych szczegółów w słowniku
product_detail = {
'title': title,
'price': price,
'review_details': review_details
}
# Dołącz szczegóły produktu do listy
product_details.append(product_detail)
# Zapis wyodrębnionych danych do pliku CSV
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)
Nasz samouczek pokazuje, jak wykorzystać biblioteki Pythona do skrobania danych produktów z Walmart i zapisywania ich w formacie CSV w celu późniejszej analizy. Dostarczony skrypt jest podstawowy i stanowi podstawę, którą można ulepszyć w celu zwiększenia wydajności procesu skrobania. Ulepszenia mogą obejmować wprowadzenie losowych opóźnień między żądaniami w celu naśladowania ludzkich wzorców przeglądania, wdrożenie rotacji User-Agent i proxy w celu uniknięcia wykrycia oraz opracowanie solidnego systemu obsługi błędów w celu zarządzania potencjalnymi przerwami lub awariami skrobania.
Komentarze: 0