VPS для бота-парсера: сбор данных 24/7
Парсер собирает цены, объявления, курсы или новости по расписанию — и делает это надёжнее всего с сервера, который всегда онлайн. Разберём деплой бота-парсера на VPS: запуск по cron, работа с прокси, обход блокировок и хранение результатов.
Содержание
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →Почему парсер держат на VPS
Парсинг — это регулярность. Собирать цены раз в час имеет смысл только если сборщик работает без пропусков, а домашний компьютер выключается на ночь и зависит от вашего интернета. Пропущенный запуск — дыра в данных, которую потом не восстановить.
VPS даёт круглосуточную работу и, что важнее для парсинга, отдельный внешний IP. С серверного IP парсер не мешает вашему домашнему браузингу, а при необходимости IP можно менять через прокси, не трогая основную сеть. Плюс сервер обычно имеет широкий канал — скачивание тысяч страниц идёт быстро.
- Запуск по расписанию — cron не пропустит время сбора.
- Отдельный IP — не пересекается с личным трафиком.
- Широкий канал — массовая загрузка страниц идёт быстро.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США и РФ. Оплата картой РФ и по СБП.
Арендовать VPS для бота-парсераУстановка окружения
Ставим Python и типовой стек парсинга: requests для HTTP, BeautifulSoup или lxml для разбора HTML. Для JS-сайтов может понадобиться Playwright, но это тяжелее по ресурсам.
sudo apt update && sudo apt install -y python3 python3-venv git
sudo useradd -r -m -s /bin/bash parser
sudo -u parser bash -c 'cd ~ && python3 -m venv venv && venv/bin/pip install requests beautifulsoup4 lxml'
Простой сборщик, который тянет страницу и достаёт заголовки:
import requests
from bs4 import BeautifulSoup
headers = {'User-Agent': 'Mozilla/5.0'}
r = requests.get('https://example.com', headers=headers, timeout=15)
soup = BeautifulSoup(r.text, 'lxml')
for h in soup.select('h2'):
print(h.get_text(strip=True))
Запуск по расписанию через cron
Для периодического парсинга проще всего cron. Он запускает скрипт по времени, а не держит процесс постоянно — экономит ресурсы, если сбор нужен раз в час или в день.
sudo -u parser crontab -e
# собирать каждый час в 5 минут:
5 * * * * /home/parser/venv/bin/python /home/parser/scrape.py >> /home/parser/scrape.log 2>&1
Перенаправление в лог с 2>&1 сохранит и ошибки — без этого упавший запуск пройдёт незамеченным. Если же парсер должен мониторить события в реальном времени, а не по расписанию, оформляйте его как systemd-сервис с Restart=always.
Прокси и обход блокировок
Сайты защищаются от парсинга по частоте запросов с одного IP. Если данных много, нужна ротация прокси и разумные паузы между запросами. requests поддерживает прокси через параметр proxies.
proxies = {'http': 'http://user:pass@proxy:8080',
'https': 'http://user:pass@proxy:8080'}
r = requests.get(url, headers=headers, proxies=proxies, timeout=15)
Главное правило вежливого парсинга — уважать сайт: ставьте задержки (time.sleep), читайте robots.txt, не создавайте нагрузку, эквивалентную DDoS. Соблюдайте условия использования сайтов и законодательство — парсинг персональных данных и защищённого контента может быть незаконным.
import time, random
time.sleep(random.uniform(1.5, 4.0)) # человекоподобная пауза
Хранение результатов
Собранные данные надо где-то держать. Для небольших объёмов хватает SQLite или CSV прямо на сервере, для крупных — PostgreSQL. NVMe-диск важен здесь: тысячи операций записи в базу идут заметно быстрее, чем на обычном SATA.
import sqlite3
db = sqlite3.connect('/home/parser/data.db')
db.execute('CREATE TABLE IF NOT EXISTS prices(ts INTEGER, item TEXT, price REAL)')
db.execute('INSERT INTO prices VALUES (?,?,?)', (int(time.time()), 'item1', 199.0))
db.commit()
Ежедневные бэкапы VPS защитят накопленную базу — потерять месяц собранных данных из-за сбоя диска обидно.
Сервер и частые ошибки
Парсеру важны быстрый диск (запись данных), широкий канал и стабильный аптайм. На тарифах MAATRIX это AMD EPYC + NVMe и локации UK/США/РФ — с зарубежного IP многие сайты отдают контент без региональных ограничений. Ежедневные бэкапы сохранят базу, а оплата картой РФ, СБП, криптой или MAAT удобна из России. От $8/мес.
- Нет таймаута у requests — зависший запрос вешает весь скрипт.
- Нет пауз между запросами — сайт банит IP за флуд.
- Логи не пишутся — упавший cron-запуск проходит незамеченным.
- Парсинг без учёта robots.txt и закона — юридические риски.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США и РФ. Оплата картой РФ и по СБП.
Арендовать VPS для бота-парсераОбсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →Частые вопросы
cron или systemd для парсера?
cron — для сбора по расписанию (раз в час/день). systemd с Restart=always — для парсеров, что мониторят события в реальном времени постоянным процессом.
Нужны ли прокси для парсинга?
При небольших объёмах хватает пауз между запросами. Прокси и ротация IP нужны, когда сайт блокирует по частоте обращений с одного адреса.
Законно ли парсить сайты?
Зависит от данных и условий сайта. Публичная информация обычно допустима, но парсинг персональных данных или защищённого контента может нарушать закон и ToS — проверяйте юридическую сторону.