Скрапінг даних з торгових майданчиків за допомогою Python

Коментарі: 0

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

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

Написання скрипта для вилучення даних про товари

Перед початком процесу скрапінгу переконайтеся, що у вас встановлено необхідні бібліотеки Python:


pip install requests
pip install lxml

Далі ми детально розглянемо процес вилучення назв товарів, їхніх характеристик і брендів із конкретних сторінок товарів, використовуючи Python.

Крок 1. Розуміння структури HTML веб-сайту

Щоб витягти дані з будь-якого веб-сайту, вам необхідно зрозуміти структуру веб-сторінки. Відкрийте сторінку веб-сайту і за допомогою інструментів розробника досліджуйте елементи, які ви хочете скрапити, наприклад, назву товару, характеристики, бренд тощо.

Крок 2. Надсилання HTTP-запитів

Спочатку ми будемо використовувати бібліотеку requests для надсилання HTTP GET-запитів. Також ми налаштуємо заголовки, щоб імітувати запити реального браузера.


import requests

# Список URL-адрес товарів для скрапінгу
urls = [
    "https://www.costco.com/kirkland-signature-men's-sneaker.product.4000216649.html",
    "https://www.costco.com/adidas-ladies'-puremotion-shoe.product.4000177646.html"
]

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-US,en;q=0.9',
    'cache-control': 'no-cache',
    'dnt': '1',
    'pragma': 'no-cache',
    'sec-ch-ua': '"Not/A)Brand";v="99", "Google Chrome";v="91", "Chromium";v="91"',
    'sec-ch-ua-mobile': '?0',
    'sec-fetch-dest': 'document',
    'sec-fetch-mode': 'navigate',
    'sec-fetch-site': 'same-origin',
    'sec-fetch-user': '?1',
    'upgrade-insecure-requests': '1',
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
}

# Перебір кожного URL і надсилання GET-запиту
for url in urls:
    response = requests.get(url, headers=headers)
    if response.status_code == 200:
        html_content = response.text
        # Додаткове оброблення буде додано на наступних кроках
    else:
        print(f"Failed to retrieve {url}. Status code: {response.status_code}")

Крок 3. Витяг даних за допомогою XPath і lxml

Використовуючи бібліотеку lxml, ми витягнемо необхідні дані з результату парсингу HTML.


from lxml import html

# Список для зберігання витягнутих даних
scraped_data = []

# Цикл по кожному URL і надсилання GET-запиту
for url in urls:
    response = requests.get(url)
    if response.status_code == 200:
        html_content = response.content
        # Парсинг HTML-вмісту за допомогою lxml
        tree = html.fromstring(html_content)
        
        # Витяг даних з використанням XPath
        product_name = tree.xpath('//h1[@automation-id="productName"]/text()')[0].strip()
        product_feature = tree.xpath('//ul[@class="pdp-features"]//li//text()')
        product_brand = tree.xpath('//div[@itemprop="brand"]/text()')[0].strip()
        
        # Додавання витягнутих даних до списку
        scraped_data.append({'Product Name': product_name, 'Product Feature': product_feature, 'Brand': product_brand})
    else:
        print(f"Failed to retrieve {url}. Status code: {response.status_code}")

# Виведення витягнутих даних
for item in scraped_data:
    print(item)

Крок 4. Вирішення потенційних проблем

Веб-сайти часто використовують анти-бот системи, які призводять до появи CAPTCHA або блокування IP-адрес. Використання проксі та ротація User Agent може допомогти уникнути виявлення.

Використання проксі, у прикладі вказані проксі з авторизацією за IP-адресою:


proxies = {
    'http': 'http://your_proxy_ip:your_proxy_port',
    'https': 'https://your_proxy_ip:your_proxy_port'
}
response = requests.get(url, proxies=proxies)

Ротація User-Agent:


import random

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 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
    # Додайте більше user agents за необхідності
]

headers['user-agent'] = random.choice(user_agents)

response = requests.get(url, headers=headers)

Крок 5. Збереження даних у файл CSV

Нарешті, ми збережемо витягнуті дані у файл CSV для подальшого аналізу.


import csv

csv_file = 'costco_products.csv'
fieldnames = ['Product Name', 'Product Feature', 'Brand']

# Запис даних у файл CSV
try:
    with open(csv_file, mode='w', newline='', encoding='utf-8') as file:
        writer = csv.DictWriter(file, fieldnames=fieldnames)
        writer.writeheader()
        for item in scraped_data:
            writer.writerow(item)
    print(f"Data saved to {csv_file}")
except IOError:
    print(f"Error occurred while writing data to {csv_file}")

Фінальна версія коду

import requests
import urllib3
from lxml import html
import csv
import random
import ssl

ssl._create_default_https_context = ssl._create_stdlib_context
urllib3.disable_warnings()

# Список URL-адрес товарів для скрапінгу
urls = [
   "Link with http",
   "Link with https"
]

# Заголовки
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-US,en;q=0.9',
   'cache-control': 'no-cache',
   'dnt': '1',
   'pragma': 'no-cache',
   'sec-ch-ua': '"Not/A)Brand";v="99", "Google Chrome";v="91", "Chromium";v="91"',
   'sec-ch-ua-mobile': '?0',
   'sec-fetch-dest': 'document',
   'sec-fetch-mode': 'navigate',
   'sec-fetch-site': 'same-origin',
   'sec-fetch-user': '?1',
   'upgrade-insecure-requests': '1',
   'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
}

# Список 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 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
   # Додайте більше user agents за необхідності
]


# Список проксі для ротації запитів
proxies = [
    {'http': 'http://your_proxy_ip:your_proxy_port', 'https': 'https://your_proxy_ip:your_proxy_port'},
    {'http': 'http://your_proxy_ip2:your_proxy_port2', 'https': 'https://your_proxy_ip2:your_proxy_port2'},
    # Додайте більше проксі за необхідності
]

# Список для зберігання витягнутих даних
scraped_data = []

# Цикл по кожному URL і надсилання GET-запиту
for url in urls:
   # Вибір випадкового user-agent для заголовків запиту
   headers['user-agent'] = random.choice(user_agents)
   # Вибір випадкового проксі для запиту
   proxy = random.choice(proxies)

   # Надсилання HTTP GET-запиту на URL із заголовками та проксі
   response = requests.get(url, headers=headers, proxies=proxy, verify=False)
   if response.status_code == 200:
       # Збереження HTML-вмісту з відповіді
       html_content = response.content
       # Парсинг HTML-вмісту за допомогою lxml
       tree = html.fromstring(html_content)

       # Витяг даних за допомогою XPath
       product_name = tree.xpath('//h1[@automation-id="productName"]/text()')[0].strip()
       product_feature = tree.xpath('//ul[@class="pdp-features"]//li//text()')
       product_brand = tree.xpath('//div[@itemprop="brand"]/text()')[0].strip()

       # Додавання витягнутих даних до списку
       scraped_data.append({'Product Name': product_name, 'Product Feature': product_feature, 'Brand': product_brand})
   else:
       # Виведення повідомлення про помилку, якщо запит не вдався
       print(f"Failed to retrieve {url}. Status code: {response.status_code}")

# Налаштування файлу CSV
csv_file = 'costco_products.csv'
fieldnames = ['Product Name', 'Product Feature', 'Brand']

# Запис даних у файл CSV
try:
   with open(csv_file, mode='w', newline='', encoding='utf-8') as file:
       writer = csv.DictWriter(file, fieldnames=fieldnames)
       writer.writeheader()
       for item in scraped_data:
           writer.writerow(item)
   print(f"Data saved to {csv_file}")
except IOError:
   # Виведення повідомлення про помилку, якщо під час запису у файл сталася помилка
   print(f"Error occurred while writing data to {csv_file}")

Використання Python для скрапінгу даних з веб-сайтів електронної торгівлі, демонструє його ефективність у зборі інформації про товари для аналізу та стратегічного планування. Завдяки бібліотекам, таким як Requests і Lxml, можливо автоматизувати й оптимізувати процеси вилучення даних, обробляючи HTML-контент і ефективно обходячи захист від ботів.

Коментарії:

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