перейти к содержанию

Как создать масштабируемую систему отслеживания цен Wayfair с помощью Python

Динамическое ценообразование сегодня повсеместно распространено в электронной коммерции. Ритейлеры, такие как Wayfair, постоянно корректируют цены в зависимости от предложения, спроса, сезонности и действий конкурентов. Хотя это выгодно для продавцов, это создает трудности для потребителей, пытающихся найти лучшие предложения. Хороший трекер цен уравнивает правила игры.

В этом подробном руководстве вы узнаете, как создать собственную систему отслеживания цен для Wayfair с использованием Python. Мы рассмотрим:

  • Масштабный сбор списков продуктов Wayfair
  • Хранение и анализ данных о ценах
  • Визуализация истории цен и тенденций
  • Отправка интеллектуальных оповещений о снижении цен
  • Планирование регулярного сканирования в качестве фоновой службы
  • Развертывание и масштабирование трекера

К концу вы получите практическое представление о том, как отслеживать сайты электронной коммерции и принимать решения о покупках на основе данных.

Потребность в трекерах цен для электронной торговли

Во-первых, давайте посмотрим, почему трекеры цен так важны:

  • Динамическое ценообразование широко распространено – Более 50% интернет-торговцев сейчас используют динамические алгоритмы ценообразования, которые меняются день или час в зависимости от запасов и спроса.
  • Отсутствие прозрачности – Розничные торговцы не сообщают открыто об изменениях цен, вынуждая потребителей проверять вручную.
  • Сложность поиска предложений – Временные распродажи и акции легко пропустить, совершая покупки на нескольких сайтах.
  • Лучшие решения – Просмотр истории цен помогает потребителям определить, заключают ли они настоящую сделку или взвинчивают цены спот-продавцы.

При наличии сотен розничных продавцов, таких как Wayfair, контролировать все эти движущиеся части вручную невозможно. На помощь приходят скрапер-боты!

Веб-скрапинг: списки продуктов Wayfair

Первым шагом является получение списков продуктов Wayfair для извлечения ключевых данных. Чтобы парсить любой веб-сайт, мы рекомендуем использовать следующие инструменты: Запросы библиотека для загрузки страниц и КрасивыйСуп для анализа HTML:

import requests
from bs4 import BeautifulSoup

url = ‘https://www.wayfair.com/lighting/pdp/wade-logan-anthonyson-61-arched-floor-lamp-w007189762.html‘

response = requests.get(url)
soup = BeautifulSoup(response.text, ‘html.parser‘)

Запросы делает загрузку страниц тривиальной. Мы можем передать любой URL-адрес и получить полный HTML-контент.

КрасивыйСуп затем позволяет выполнять поиск по HTML с использованием селекторов CSS, таких как язык запросов. Например, чтобы извлечь название продукта:

title = soup.select_one(‘h1[data-testid="productTitle"]‘).text.strip()
print(title)
# Anthonyson 61" Arched Floor Lamp

Мы также можем извлечь информацию о ценах:

price = soup.find(‘span‘, {‘data-testid‘: ‘primaryPrice‘}).text
# $99.99

И URL изображения:

img_url = soup.find(‘img‘, {‘data-testid‘: ‘image‘})[‘src‘]
# https://secure.img1-fg.wfcdn.com/im/07181850/resize-h310-w310%5Ecompr-r85/1213/121389057/Anthonyson+61%2527%2527+Arched+Floor+Lamp.jpg

Имея небольшой опыт работы с CSS-селекторами, мы можем извлечь со страниц практически любые данные.

Далее давайте упакуем это в удобную функцию очистки:

import requests
from bs4 import BeautifulSoup

def scrape_product(url):

  response = requests.get(url)

  soup = BeautifulSoup(response.text, ‘html.parser‘)

  name = soup.find(‘h1‘, {‘data-testid‘: ‘productTitle‘}).text.strip()

  price = soup.find(‘span‘, {‘data-testid‘: ‘primaryPrice‘}).text

  img_url = soup.find(‘img‘, {‘data-testid‘: ‘image‘})[‘src‘]

  data = {
    ‘name‘: name,
    ‘price‘: price, 
    ‘img_url‘: img_url
  }

  return data

Теперь мы можем легко извлекать структурированные данные из URL-адреса любого продукта:

data = scrape_product(‘https://www.wayfair.com/lighting/pdp/wade-logan-anthonyson-61-arched-floor-lamp-w007189762.html‘)

print(data[‘name‘]) # Anthonyson 61" Arched Floor Lamp 
print(data[‘price‘]) # $99.99
print(data[‘img_url‘]) # https://secure.img1-fg.wfcdn.com/im/07181850/resize-h310-w310%5Ecompr-r85/1213/121389057/Anthonyson+61%2527%2527+Arched+Floor+Lamp.jpg

Благодаря таким надежным функциям парсинга мы можем систематически получать данные с тысяч страниц со списком продуктов.

Хранение данных о ценах в Pandas DataFrames

Теперь, когда мы можем собирать данные о продуктах, нам нужен способ сохранить их для анализа. Панды предоставляет отличный набор инструментов для анализа данных Python.

Панды кадры данных позволяют хранить табличные данные в памяти или загружать их из CSV, баз данных и т. д.

Давайте инициализируем один из них для хранения очищенных данных Wayfair:

import pandas as pd

df = pd.DataFrame(columns=[‘name‘, ‘url‘, ‘price‘, ‘date‘])

Мы можем добавлять строки во время очистки:

data = scrape_product(‘https://www.wayfair.com/lighting/pdp/wade-logan-anthonyson-61-arched-floor-lamp-w007189762.html‘)

df = df.append({
  ‘name‘: data[‘name‘],
  ‘url‘: ‘https://www.wayfair.com/lighting/pdp/wade-logan-anthonyson-61-arched-floor-lamp-w007189762.html‘,
  ‘price‘: data[‘price‘],
  ‘date‘: ‘2023-03-01‘
}, ignore_index=True)

Прохождение ignore_index=True сбрасывает индексы, поэтому каждая строка имеет уникальный идентификатор.

Мы также можем легко загрузить данные из файла CSV:

df = pd.read_csv(‘wayfair-data.csv‘)

Это дает нам структурированный набор данных, оптимизированный для анализа и визуализации.

С помощью Pandas мы можем дополнительно анализировать распределение и тенденции предметов:

print(df.groupby(‘category‘)[‘price‘].median())
# Prints median price for each product category

df[‘price‘] = df[‘price‘].str.replace(‘$‘, ‘‘).astype(float)
print(df[‘price‘].nlargest(3)) 
# Prints top 3 highest prices

По мере того, как наш парсер накапливает больше истории, DataFrame становится ценным ресурсом для оптимизации цен.

Понимание тенденций ценообразования с течением времени имеет решающее значение. Python Матплотлиб библиотека упрощает построение графиков.

Например, мы можем визуализировать историю цен для данного продукта:

import matplotlib.pyplot as plt

product_df = df[df[‘name‘] == ‘Foosball Table‘]
plt.plot(product_df[‘date‘], product_df[‘price‘])

plt.xlabel(‘Date‘)
plt.ylabel(‘Price‘)
plt.title(‘Foosball Table Price History‘)

plt.show() 

История цен на футбол

Глядя на график, можно сразу понять структуру ценообразования.

Мы также можем построить график нескольких продуктов для сравнения:

for name, group in df.groupby(‘name‘):
  plt.plot(group[‘date‘], group[‘price‘], label=name)

plt.legend(loc=‘best‘)

plt.xlabel(‘Date‘)
plt.ylabel(‘Price‘)  
plt.title(‘Price History‘)

plt.show()

При этом все продукты отображаются на одном графике с легендой, разделяющей каждую линию.

Комбинированная история цен

Существуют безграничные возможности для пользовательских статистических диаграмм для извлечения ценной информации из данных о ценах.

Отправка оповещений об изменении цен

Одна из наиболее полезных функций трекера цен — получение уведомлений о ключевых изменениях. Стандартная библиотека Python упрощает отправку оповещений.

Например, мы можем использовать смтплиб чтобы отправить электронное письмо, когда произойдет снижение цен:

import smtplib

# Extract latest price 
current_price = get_current_price(‘wayfair-tracker-db‘) 

# Lookup old price
old_price = get_old_price(‘wayfair-tracker-db‘)

change = old_price - current_price

if change > 0:
  # Price dropped! 

  smtp = smtplib.SMTP(‘smtp.gmail.com‘, 587)

  message = f"Alert! Product X has dropped from {old_price} to {current_price}"

  smtp.sendmail(‘[email protected]‘, ‘[email protected]‘, message)

Мы можем настроить частоту и порог в зависимости от предпочтений пользователя.

Для мобильных уведомлений Слабый веб-API упрощает отправку сообщений:

from slack_sdk import WebClient
from slack_sdk.errors import SlackApiError 

slack_token = os.environ["SLACK_TOKEN"]

client = WebClient(token=slack_token)

try:
  response = client.chat_postMessage(
    channel=‘price-alerts‘, text=message)

except SlackApiError as e:
  print(f"Error posting message: {e}")

Подобные интеграции оповещений позволяют пользователям без труда оставаться в курсе данных о ценах.

Планирование регулярных проверок цен

Чтобы наш трекер обновлялся, нам нужно запускать его по расписанию. Модуль планирования Python — это один из вариантов основных запланированных заданий.

Мы можем настроить это так:

import sched
import time

def price_check():
  # Run scraper
  # Generate alerts
  # Update database

  print(‘Finished price check‘)

scheduler = sched.scheduler(time.time, time.sleep)  
scheduler.enter(3600, 1, price_check) # Run every hour

scheduler.run()

Для более надежных производственных конвейеров Воздушный поток Apache — отличный планировщик рабочих процессов для Python. Он имеет интеграцию с базами данных, хранилищами данных, S3 и очередями сообщений для запуска целых процессов ETL.

Настройка запланированных заданий гарантирует, что на наши информационные панели и системы оповещений будут поступать актуальные данные о ценах.

Хранение данных в базах данных SQLite

Для нашего небольшого прототипа Pandas DataFrame работает нормально. Но для более крупных производственных трекеров более целесообразна правильная база данных.

SQLite удобен для бессерверного локального хранения данных. Давайте настроим таблицу для хранения данных парсера Wayfair:

import sqlite3

conn = sqlite3.connect(‘wayfair.db‘)  

c = conn.cursor()
c.execute(‘‘‘
  CREATE TABLE products 
  (id INTEGER PRIMARY KEY, name TEXT, url TEXT, price TEXT, date TEXT)
‘‘‘)

# Insert sample row
c.execute("INSERT INTO products VALUES (1, ‘Foosball Table‘, ‘https://www.wayfair.com/xxxx‘, ‘$79.99‘, ‘2023-03-01‘)")

conn.commit()
conn.close() 

Мы можем обернуть операции с БД, такие как вставка строк, запросы и т. д., в отдельные функции для чистого кода:

def insert_price(name, url, price, date):
  # Insert new row into database

def get_price_history(product_name):
  # Query DB and return dict of dates:prices

Для масштабируемых парсеров в больших каталогах лучше подходит управляемая облачная база данных, такая как AWS RDS, чем SQLite. Интерфейс запроса остается практически идентичным при использовании SQLAlchemy.

Создание веб-приложения для отслеживания цен

Чтобы сделать наш трекер цен более доступным, мы можем обернуть его в веб-приложение, используя Колба or Django.

Приложение может предоставить:

  • Панели мониторинга, визуализирующие историю цен
  • Формы добавления новых товаров для отслеживания
  • Учетные записи пользователей и оповещения
  • Параметры конфигурации
  • Публичный доступ API к данным о ценах

Вот пример представления истории цен на продукт:

from flask import Flask
import matplotlib.pyplot as plt

app = Flask(__name__)

@app.route(‘/price-history/<product_id>‘)
def show_graph(product_id):

  # Lookup DB
  data = get_price_history(product_id) 

  # Plot image
  plt.plot(data[‘date‘], data[‘price‘])

  img_bytes = plt.savefig()

  # Embed image into HTML
  return f"<img src=‘data:image/png;base64,{img_bytes}‘>"

Структура Flask/Django упрощает создание веб-интерфейсов. Мы можем сохранить весь существующий код очистки и анализа в качестве вспомогательных модулей.

Развертывание системы отслеживания цен в производстве

Для реального использования нам необходимо развернуть наш трекер так, чтобы он работал круглосуточно и без выходных:

  • PythonAnywhere – Простота размещения небольших приложений Python и запланированных задач.
  • Heroku – Более надежный PaaS, можно развертывать приложения Django/Flask.
  • AWS Elastic Beanstalk – Развертывание полных веб-стеков Python на экземплярах EC2.
  • Служба приложений Azure – Управляемый хостинг приложений в Microsoft Azure.

Все эти службы обеспечивают управляемую балансировку нагрузки, автоматическое масштабирование, мониторинг и конвейеры развертывания.

Некоторые рекомендации по созданию надежных средств отслеживания производства:

  • Используйте рабочие очереди, например Сельдерей распределить нагрузку
  • Хранить данные в управляемые облачные базы данных
  • Настройте мониторинг с помощью Часовой or Datadog
  • Реализация повторных попыток и обработки ошибок
  • Включить частые автоматическое масштабирование на основе трафика

Инвестиции в готовность производства гарантируют надежную работу нашего скрепера круглосуточно и без выходных.

Улучшение трекера с помощью машинного обучения

Наш базовый трекер опирается на текущие и исторические данные о ценах. Чтобы сделать еще один шаг вперед, мы можем использовать алгоритмы машинного обучения чтобы получить дополнительную информацию:

  • Прогнозировать будущие цены в зависимости от сезона, праздников и тенденций
  • Классифицировать продукты по категориям и типам фильтров автоматически
  • Рекомендую выгодные покупки на основе истории покупок пользователя
  • Обнаружение ошибок ценообразования нравятся товары, цены на которые сильно занижены или завышены
  • Прогнозирование оптимальных цен для максимизации прибыли продавца

Такие библиотеки, как TensorFlow, scikit-learn и PyTorch, легко интегрируются с Python для создания возможностей машинного обучения.

Заключение

В этом руководстве мы создали надежный конвейер отслеживания цен Wayfair на Python, используя:

  • Веб-соскоб – Сбор данных о продукте
  • Анализ данных – Манипулировать, анализировать и визуализировать.
  • Предупреждение – Получать уведомления о ключевых изменениях
  • Планирование задач – Запуск в качестве фоновой службы
  • Облачное развертывание – Масштабирование и мониторинг в производстве

Та же структура распространяется на любой сайт электронной коммерции или источник веб-данных.

Благодаря демократизации инструментов обработки данных на Python создание собственных парсеров стало доступно как предприятиям, так и опытным покупателям. Тактики, описанные в этом руководстве, служат основой для получения ценовой информации. Дайте мне знать, если у вас есть еще вопросы!

Присоединяйтесь к беседе

Ваш электронный адрес не будет опубликован. Обязательные поля помечены * *