Следи за сайтами как хищник: цены, остатки, появление товара — всё под контролем

Бывает, нужно постоянно следить за сайтом — например, где-то появляются редкие или дешёвые товары, которые быстро разбирают. Или важны любые изменения: цены, остатки, наличие, и вы не хотите их пропустить.

🔧 Вместо того чтобы сидеть и обновлять страницу вручную, можно за 15 минут собрать автоматический скрипт на Python с помощью OpenAI (ChatGPT) — и он будет всё делать сам:

  • Проверять сайт 24/7
  • Отслеживать изменения в таблицах или карточках товаров
  • Уведомлять вас через Telegram и на рабочем столе
  • Сохранять логи в Excel

⚠ Оговорка: это только пример

Скрипт написан так, чтобы его легко можно было переиспользовать под любой сайт — с любыми данными, тегами, таблицами, блоками, карточками и т.д. Пример ниже показывает сайт с HTML-таблицей, но точно так же можно мониторить:

  • API-данные
  • Карточки товаров
  • Надписи типа "в наличии / нет"
  • Кнопки "купить"
  • Тексты, цены, статусы и всё что угодно

🧠 Что делает скрипт?

  • 🔄 Заходит на сайт с заданной периодичностью (по умолчанию — каждые 5 секунд)
  • 🔍 Считывает таблицу с товарами и сравнивает с предыдущим состоянием
  • 📬 При изменении количества или появлении новых позиций: Отправляет уведомление в Telegram Показывает всплывающее уведомление на рабочем столе Открывает отдельное окно в браузере (с миганием!)
  • 📊 Все изменения записывает в Excel-отчёт

📲 Как выглядят уведомления?

Telegram:

arduinoКопироватьРедактироватьУведомление с сайта https://example.com: Изменение: Подписчики — Кол-во изменилось с 100 на 80

На рабочем столе:

Изменение на сайте: Подписчики — с 100 до 80

В браузере: Открывается окно с сообщением и мигает 3 раза — чтобы точно не пропустить.

📊 Как выглядит отчёт?

Скрипт автоматически создаёт Excel-файл, например monitoring_report_20250329_153023.xlsx. Внутри:

Время проверкиТоварБылоСталоИзменения2025-03-29 15:30:23Подписчики10080Изменено2025-03-29 15:30:23Лайки500500Без изменений

⚙ Настройки и критерии — любые под ваши задачи

Один из главных плюсов — гибкость. Вы сами задаёте, что отслеживать, как реагировать, и куда сохранять. Скрипт легко адаптируется под любые цели.

🎯 Что отслеживать:

  • Название товара
  • Остаток, цена, наличие
  • Появление или исчезновение кнопок
  • Тексты (“в наличии”, “распродажа”, “скоро в продаже”)
  • Ключевые слова или значения на странице
  • Любой HTML-блок или атрибут

⏱ Интервал проверки:

Проверка может быть:

  • Каждые 5 секунд
  • Каждые 10 минут
  • 1 раз в час

Просто меняется параметр:

pythonКопироватьРедактироватьmonitor_website(interval_seconds=300) # Проверка раз в 5 минут

📬 Уведомления:

  • Telegram (нужно только токен и chat_id)
  • Рабочий стол (всплывающее уведомление через plyer)
  • Окно браузера (автоматически открывается и мигает)

Можно легко добавить:

  • Email
  • Discord
  • Webhook
  • SMS или Push

📁 Формат логирования:

По умолчанию — Excel, но можно сделать:

  • CSV
  • TXT
  • JSON
  • Google Sheets
  • Базу данных (SQLite, PostgreSQL и др.)

📌 Условия уведомлений:

Вы можете настроить:

  • Уведомление только если товар появился
  • Только если количество стало меньше 10
  • Только если цена опустилась ниже 100₽
  • Только по конкретным названиям товаров
  • Или вообще — только один раз в сутки

💡 Технологии:

Используемые библиотеки:

bashКопироватьРедактироватьpip install pandas openpyxl selenium bs4 plyer webdriver-manager

  • pandas и openpyxl — работа с Excel
  • selenium + BeautifulSoup — для парсинга HTML
  • requests — Telegram-бот
  • plyer — уведомления
  • threading — параллельность
  • logging — для логов
  • ChromeDriverManager — автоматическая установка драйвера

🧑‍💻 Как запустить?

  1. Положите в папку файл config.txt со следующим содержимым:

php-templateКопироватьРедактировать<ваш_бот_токен> <ваш_chat_id>

  1. Укажите сайт, который хотите мониторить, в переменной SITE_URL
  2. Запустите скрипт — и всё работает. Вы в курсе всех изменений.

КОД

import threading import requests import os import logging import pandas as pd import socket import time from datetime import datetime from openpyxl import Workbook from bs4 import BeautifulSoup from plyer import notification from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.chrome.options import Options from webdriver_manager.chrome import ChromeDriverManager # Настройки логирования logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') # URL сайта для мониторинга SITE_URL = 'https://nakrutka.rents.ac/' # Чтение Telegram bot token и chatID из файла config.txt with open('config.txt', 'r') as f: config = f.read().splitlines() bot_token = config[0] # Токен бота chat_id = config[1] # chat_id получателя # Функция для отправки сообщения в Telegram с указанием сайта def send_message_to_telegram(text): message = f"Уведомление с сайта {SITE_URL}:\n\n{text}" send_text = f'https://api.telegram.org/bot{bot_token}/sendMessage?chat_id={chat_id}&parse_mode=Markdown&text={message}' response = requests.get(send_text) if response.status_code == 200: logging.info("Сообщение успешно отправлено в Telegram") else: logging.error(f"Ошибка при отправке сообщения в Telegram: {response.status_code}") logging.error(f"Ответ от сервера: {response.json()}") # Функция для закрытия всех окон Chrome def close_all_chrome_windows(): os.system("taskkill /f /im chromedriver.exe /T") os.system("taskkill /f /im chrome.exe /T") # Функция для отправки десктопного уведомления def send_desktop_notification(title, message): try: notification.notify( title=title, message=message, timeout=10 ) time.sleep(1) except Exception as e: logging.error(f"Ошибка при отправке уведомления: {e}") # Функция для открытия уведомления в браузере def open_browser_notification(message): try: chrome_options = Options() chrome_options.add_argument("--disable-gpu") chrome_options.add_argument("--no-sandbox") chrome_options.add_argument("--disable-dev-shm-usage") chrome_options.add_argument("--disable-extensions") chrome_options.add_argument("--disable-infobars") chrome_options.add_argument("--remote-debugging-port=9223") chrome_options.add_argument("--window-size=300,300") chrome_options.add_argument("--window-position=100,100") service = Service(ChromeDriverManager().install()) driver = webdriver.Chrome(service=service, options=chrome_options) html_message = f""" <html> <head><title>Изменение на сайте</title></head> <body> <h3>Изменение на сайте:</h3> <p>{message}</p> </body> </html> """ with open("notification.html", "w", encoding="utf-8") as file: file.write(html_message) driver.get(f"file://{os.path.abspath('notification.html')}") for _ in range(3): # Мигать окном 3 раза driver.minimize_window() time.sleep(0.5) driver.maximize_window() time.sleep(0.5) except Exception as e: logging.error(f"Ошибка при открытии браузерного уведомления: {e}") # Функция проверки интернет-соединения def check_internet_connection(host="8.8.8.8", port=53, timeout=3): try: socket.setdefaulttimeout(timeout) socket.socket(socket.AF_INET, socket.SOCK_STREAM).connect((host, port)) return True except socket.error as ex: logging.warning(f"Нет соединения с интернетом: {str(ex)}") return False # Функция получения данных с сайта def get_site_data(): driver = None try: chrome_options = Options() chrome_options.add_argument("--headless") chrome_options.add_argument("--disable-gpu") chrome_options.add_argument("--no-sandbox") chrome_options.add_argument("--disable-dev-shm-usage") chrome_options.add_argument("--disable-extensions") chrome_options.add_argument("--disable-software-rasterizer") chrome_options.add_argument("--disable-infobars") chrome_options.add_argument("--remote-debugging-port=9222") service = Service(ChromeDriverManager().install()) driver = webdriver.Chrome(service=service, options=chrome_options) logging.info(f"Открываем сайт: {SITE_URL}") driver.get(SITE_URL) wait = WebDriverWait(driver, 10) table = wait.until(EC.presence_of_element_located((By.TAG_NAME, "table"))) html = driver.page_source soup = BeautifulSoup(html, 'html.parser') table = soup.find('table') if not table: logging.error("Таблица не найдена!") return [] items = [] for row in table.find_all('tr')[1:]: cols = row.find_all('td') if len(cols) < 3: continue product_name = cols[0].text.strip() quantity = cols[1].text.strip() price = cols[2].text.strip() try: quantity = int(quantity) except ValueError: logging.warning(f"Неверное количество: {quantity}") continue items.append((product_name, quantity, price)) logging.info(f"Найдено {len(items)} товаров.") return items except Exception as e: logging.error(f"Ошибка при получении данных: {str(e)}") return [] finally: if driver: driver.quit() # Функция для фоновой отправки уведомлений def notify_in_background(title, message): threading.Thread(target=send_desktop_notification, args=(title, message)).start() threading.Thread(target=open_browser_notification, args=(message,)).start() threading.Thread(target=send_message_to_telegram, args=(message,)).start() # Функция проверки обновлений на сайте def check_for_updates(last_items, excel_file): current_items = get_site_data() timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S") if not current_items: return last_items data_for_excel = [] for new_item in current_items: found = False for old_item in last_items: if new_item[0] == old_item[0]: found = True if new_item[1] != old_item[1]: message = (f"Изменение: {new_item[0]} - " f"Количество изменилось с {old_item[1]} на {new_item[1]}") logging.info(message) notify_in_background("Изменение на сайте", message) data_for_excel.append([timestamp, new_item[0], old_item[1], new_item[1], "Изменено"]) else: data_for_excel.append([timestamp, new_item[0], new_item[1], new_item[1], "Без изменений"]) break if not found: data_for_excel.append([timestamp, new_item[0], new_item[1], new_item[1], "Новый товар"]) df = pd.DataFrame(data_for_excel, columns=["Время проверки", "Товар", "Старое количество", "Новое количество", "Изменения"]) with pd.ExcelWriter(excel_file, mode='a', if_sheet_exists='overlay', engine='openpyxl') as writer: df.to_excel(writer, sheet_name='Отчет', index=False, startrow=writer.sheets['Отчет'].max_row) return current_items # Основная функция для мониторинга сайта с созданием уникального файла отчета def monitor_website(interval_seconds=5): now = datetime.now() excel_file = f"monitoring_report_{now.strftime('%Y%m%d_%H%M%S')}.xlsx" last_items = [] df_init = pd.DataFrame(columns=["Время проверки", "Товар", "Старое количество", "Новое количество", "Изменения"]) df_init.to_excel(excel_file, sheet_name='Отчет', index=False) while True: if check_internet_connection(): last_items = check_for_updates(last_items, excel_file) else: logging.warning("Нет интернет-соединения. Ожидание 30 секунд перед повторной проверкой.") time.sleep(30) logging.info(f"Ожидание {interval_seconds} секунд до следующей проверки...") time.sleep(interval_seconds) if __name__ == "__main__": try: close_all_chrome_windows() monitor_website(interval_seconds=5) except KeyboardInterrupt: logging.info("Мониторинг остановлен пользователем.")
Следи за сайтами как хищник: цены, остатки, появление товара — всё под контролем

💬 Если будут вопросы или появятся идеи — просто напиши. Всегда рад обсудить.

Начать дискуссию