Скрапінг даних Walmart з використанням Python

Коментарі: 0

У цьому посібнику ми покажемо як побудувати базовий парсер для скрапінгу даних товарів з Walmart за допомогою бібліотек Python, зосередивши увагу на основних стратегіях і техніках. Скрапінг даних з Walmart дозволить збирати інформацію про товари, їхні назви, ціни та відгуки.

Для роботи ми використовуватимемо бібліотеку requests для надсилання HTTP-запитів і бібліотеку lxml для аналізу HTML-контенту.

Налаштування робочого середовища для збору даних Walmart

Необхідні бібліотеки можна встановити за допомогою pip:

pip install requests
pip install  lxml
pip install urllib3

Далі зробимо імпорт необхідних бібліотек:

  • requests: виконання HTTP-запитів для отримання веб-сторінок;
  • lxml: для парсингу HTML-контенту;
  • csv: для запису витягнутих даних у файл CSV;
  • random: для вибору випадкових проксі та рядків User-Agent;
  • urllib3: додаткова бібліотека для роботи з HTTP запитами, що допомагає обходити проблеми з SSL;
  • ssl: модуль для роботи з SSL, який може використовуватися для створення захищених з'єднань.
import requests
from lxml import html
import csv
import random
import urllib3
import ssl

Визначення URL товарів

Скрапер перебиратиме список заздалегідь внесених URL-адрес товарів Walmart, витягуючи інформацію з кожної сторінки.

product_urls = [
    'Ссылка товара, с протоколом https',
    'Ссылка товара, с протоколом https',
    'Ссылка товара, с протоколом https'
]

Використання рядків User-Agent і налаштування проксі

Для успішного скрапінгу критично важливо використовувати коректні заголовки, такі як User-Agent. Використання заголовків дає змогу імітувати запити від пристроїв різних користувачів, збільшуючи шанси на успішне отримання даних, і уникаючи визначення системою захисту. Також важливо використовувати ротацію проксі-серверів для унікалізації кожного запиту, мінімізуючи ризик блокування і капчі від антибот-захисту. Нижче наведено приклади User-Agent рядків та інтеграція проксі з авторизацією за основним 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>',
]

Заголовки для запитів

Встановіть заголовки для імітації запитів браузера та уникнення виявлення.

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

Налаштування системи зберігання даних

Для організації даних, зібраних під час скрапінгу, створимо порожній список, у який зберігатимемо дані про товари:

product_details = []

Процес перебору URL сторінок виглядає наступним чином. Для кожної URL-сторінки відправляється GET-запит, використовуючи випадково обраний User-Agent і проксі. Після отримання HTML-відповіді проводимо її парсинг для вилучення назви товару, ціни та відгуків. Отримані дані зберігаємо у вигляді словника, який потім додаємо в раніше створений список.

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:
       # Надсилання HTTP GET запиту на 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}')

   # Парсинг HTML-контенту за допомогою lxml
   parser = html.fromstring(response.text)
   # Витяг назви продукту
   title = ''.join(parser.xpath('//h1[@id="main-title"]/text()'))
   # Витяг ціни продукту
   price = ''.join(parser.xpath('//span[@itemprop="price"]/text()'))
   # Витяг відгуків
   review_details = ''.join(parser.xpath('//div[@data-testid="reviews-and-ratings"]/div/span[@class="w_iUH7"]/text()'))

   # Збереження витягнутих даних у словник
   product_detail = {
       'title': title,
       'price': price,
       'review_details': review_details
   }
   # Додавання даних про товар до списку
   product_details.append(product_detail)

Для отримання необхідних елементів використовуємо інструменти розробника на веб-сторінці.

Назва:

1.png

Ціна:

2.png

Відгуки:

3.png

Збереження даних у форматі CSV

  1. Відкрийте новий файл CSV.
  2. Задайте назви полів, які будуть використовуватися як колонки у файлі CSV.
  3. Створіть об'єкт "csv.DictWriter", який дасть змогу записувати словники у файл CSV, забезпечуючи відповідність даних заголовкам.
  4. Запишіть заголовний рядок у файл CSV, щоб визначити структуру даних.
  5. Виконайте ітерацію за списком product_details, записуючи кожен словник із даними про товари в окремий рядок файлу 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)

Фінальний код:

Ось повний код із коментарями для кращого розуміння:

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()


# Список URL продуктів Walmart для скрапінгу
product_urls = [
   'link with https',
   'link with https',
   'link with https'
]

# Список User-Agent для анонімності
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
proxy = [
    '<ip>:<port>',
    '<ip>:<port>',
    '<ip>:<port>',
]


# Заголовки для імітації запитів браузера
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',
}

# Ініціалізація списку для зберігання даних про продукти
product_details = []

# Цикл за URL товарів
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:
       # Надсилання HTTP GET запиту
       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 контенту
   parser = html.fromstring(response.text)
   # Витяг назви товару
   title = ''.join(parser.xpath('//h1[@id="main-title"]/text()'))
   # Витяг ціни товару
   price = ''.join(parser.xpath('//span[@itemprop="price"]/text()'))
   # Витяг відгуків
   review_details = ''.join(parser.xpath('//div[@data-testid="reviews-and-ratings"]/div/span[@class="w_iUH7"]/text()'))

   # Збереження витягнутих даних у словнику
   product_detail = {
       'title': title,
       'price': price,
       'review_details': review_details
   }
   # Додавання даних про товар до списку
   product_details.append(product_detail)

# Запис витягнутих даних у файл 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)

Наш посібник показує, як можна використовувати бібліотеки Python для скрапінгу даних про товари Walmart і збереження цих даних у форматі CSV для подальшого аналізу. Цей скрипт є базовим і його можна доповнити й поліпшити для забезпечення ще ефективнішого процесу скрапінгу через запровадження випадкових затримок між запитами, налаштування ротації User-Agent і проксі, а також розроблення системи оброблення помилок.

Коментарії:

0 Коментаріїв