Верстакфорум практиков
рекламаiprazon: приватные серверные адреса IPv4 и SOCKS5, безлимитный трафик, бесплатный тест до 2 часов
ФорумСбор данных

Ежедневный сбор прайса поставщика: как построил прогон

Влад Терентьев
Влад Терентьев
Участник
сообщений 745
с авг
8 июня, 11:17первое сообщение

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

Как оно устроено сейчас:

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

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

cronjob
cronjob
Новичок
сообщений 205
с фев, второй сезон
15 ноября, 14:34#2

Первым делом поставьте замок на запуск, если ещё нет.

flock -n /var/lock/prays.lock /srv/progon/sbor.sh || exit 0

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

Полина Ждан
Полина Ждан
Новичок
сообщений 120
с мая, второй сезон
22 апреля, 17:51#3

а сырьё долго держите? у меня место кончилось на второй неделе

Влад Терентьев
Влад Терентьев
Участник
сообщений 745
с авг
1 сентября, 08:08#4
cronjob: они начнут топтать друг другу папку с сырьём

Замок поставил в тот же вечер, спасибо. Один раз у меня прогон шёл двадцать девять часов, обошлось чудом.

Полина, держу две недели, дальше складываю в архив и раз в месяц выношу. Сырьё сжимается раз в двадцать, места ест немного.

Юля Ким
Юля Ким
Знаток
сообщений 1240
с мая
8 февраля, 11:25#5

Предохранитель номер один: сверка объёма с прошлым разом до заливки в базу.

Считаете число строк и число заполненных полей цены и наличия. Расхождение больше десяти процентов означает стоп и письмо себе на почту. Каталог у поставщика живёт медленно, за сутки он на треть не худеет. Если похудел, значит вы поймали обрыв на середине обхода и в базу такое лить нельзя.

Заливку делайте в промежуточную таблицу, а переключение на боевую отдельным шагом. Тогда неудачный прогон просто остаётся в стороне.

batchrunner
batchrunner
Участник
сообщений 470
с окт
15 июля, 14:42#6

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

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

dobrynin_a
dobrynin_a
Знаток
сообщений 1690
с апр
22 декабря, 17:59#7

Раз пошёл разговор про предохранители, разложу, как это выглядит у меня после нескольких лет ежедневных прогонов.

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

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

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

Отдельно храню последнюю удачную выгрузку под именем latest. Если сегодняшний прогон не прошёл проверки, магазин работает на вчерашней, и никто ничего не замечает. Полностью пустая витрина стоит дороже суточной задержки данных.

Проверка перед заливкойЧто смотрюЧто делаю при отказе
число позицийрасхождение с прошлым разомстоп при разбеге выше десятой части
заполнение ценыдоля непустыхстоп ниже девяноста пяти процентов
заполнение наличиядоля непустыхпредупреждение и заливка
страницы с ошибкойсколько за прогонстоп выше двух процентов
Влад Терентьев
Влад Терентьев
Участник
сообщений 745
с авг
1 мая, 08:16#8

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

Максим Юрьев
Максим Юрьев
Знаток
сообщений 1720
с апр
8 октября, 11:33#9

Ещё сторона вопроса, про которую в теме пока не сказали: с какого адреса вы к поставщику ходите каждое утро.

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

Темп при этом всё равно ставлю спокойный, соединений двадцать с паузой. Задача тихо забрать каталог до открытия магазина. Выжимать поставщика за час смысла никакого.

Полина Ждан
Полина Ждан
Новичок
сообщений 120
с мая, второй сезон
15 марта, 14:50#10

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

Юля Ким
Юля Ким
Знаток
сообщений 1240
с мая
22 августа, 17:07#11

Полина, сто соединений по одному поставщику это перебор почти всегда. Считайте от времени: если у вас окно в четыре часа и сорок тысяч страниц, вам нужно меньше трёх страниц в секунду. При отклике в секунду хватает трёх десятков соединений.

batchrunner
batchrunner
Участник
сообщений 470
с окт
1 января, 08:24#12

Подпишусь. И храните сырьё сжатым сразу, gzip на лету стоит копейки по процессору.

Влад Терентьев
Влад Терентьев
Участник
сообщений 745
с авг
8 июня, 11:41#13

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

За семь дней предохранители сработали дважды. Один раз поставщик отдавал отказы сорок минут, добор вытянул всё в конце прогона. Второй раз разбор посыпался на новом разделе, заполнение цены упало до семидесяти процентов, заливка встала, магазин отработал день на вчерашней выгрузке. Раньше оба случая доехали бы до витрины.