Przewodnik po skrobaniu danych Walmart za pomocą Python

Komentarze: 0

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.

Konfiguracja środowiska

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:

  • requests: do wykonywania żądań HTTP w celu pobrania stron internetowych;
  • lxml: do analizowania zawartości HTML;
  • csv: do zapisywania wyodrębnionych danych do pliku CSV;
  • random: do wybierania losowych serwerów proxy i ciągów User-Agent.
import requests
from lxml import html
import csv
import random
import urllib3
import ssl

Definiowanie adresów URL produktów

Lista adresów URL produktów Walmart do zeskrobania.

product_urls = [
    'link with https',
    'link with https',
    'link with https'
]

Ciągi agenta użytkownika i serwery proxy

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>',
]

Nagłówki żądań

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',
}

Inicjalizacja magazynu danych

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ł:

1.png

Cena:

2.png

Szczegóły recenzji:

3.png

Zapisz dane do CSV

  1. Otwórz nowy plik CSV do zapisu.
  2. Zdefiniuj nazwy pól (kolumn) dla pliku CSV.
  3. Utworzenie obiektu csv.DictWriter do zapisu słowników do pliku CSV.
  4. Zapisanie wiersza nagłówka do pliku CSV.
  5. Przejrzyj listę product_details i zapisz każdy słownik produktu jako wiersz w 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)

Kompletny kod:

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 komentarze