Руководство по скрапингу данных 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 комментариев