У цьому посібнику ми покажемо як побудувати базовий парсер для скрапінгу даних товарів з 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.com!
Коментарі: 0