В этом руководстве мы покажем как построить базовый парсер для скрапинга данных товаров с Walmart при помощи библиотек Python, сосредоточив внимание на основных стратегиях и техниках. Скрапинг данных с Walmart позволит собирать информацию о товарах, их названия, цены и отзывы.
Для работы мы будем использовать библиотеку requests для отправки HTTP-запросов и библиотеку lxml для анализа HTML-контента.
Необходимые библиотеки можно установить с помощью pip:
pip install requests
pip install lxml
pip install urllib3
Далее произведем импорт необходимых библиотек:
import requests
from lxml import html
import csv
import random
import urllib3
import ssl
Скрапер будет перебирать список заранее внесенных URL-адресов товаров Walmart, извлекая информацию с каждой страницы.
product_urls = [
'Ссылка товара, с протоколом https',
'Ссылка товара, с протоколом https',
'Ссылка товара, с протоколом https'
]
Для успешного скрапинга критически важно использовать корректные заголовки, такие как 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)
Для получения необходимых элементов используем инструменты разработчика на веб-странице.
Название:
Цена:
Отзывы:
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 и прокси, а также разработки системы обработки ошибок.
Мы получили вашу заявку!
Ответ будет отправлен на почту в ближайшее время.
С уважением proxy-seller.ru!
Комментарии: 0