Пишу парсер сайта закупок, есть опыт парсинга, но если раньше была задача пробежаться по сайту один раз, собрать данные и забыть о написаном коде, то в текущей ситуации, все не так, парсер должен срабатывать регулярно.
Причины возникновения задачи:
1 ресурс неудобен, всех необходимых данных нет в таблице, чтобы получить доп. данные необходимо проваливаться в глубь на две ссылки;
2 ресурс предоставляет API только по “открытым” лотам, а нам нужна информация по остальным (закрытые, отмененные и т.п.);
3 попросила жена , ее компания регулярно использует ресурс.
Думал, что задача тривиальная, а оказалось, что нет . Структура сайта простая: форма-фильтр, таблица с результатами и пагинация. На каждую страницу в таблицу выводится по 50 строк, на каждую строку приходится по три ссылки, по которым нужно перейти и спарсить страницы находящиеся за ними. Все это усложняется психованной капчой, вылетающей на каждый десятый переход по ссылке.
Я планировал собирать парсером данные и сохранять их в БД, а потом работать с ними и только при необходимости подгружать “свежие”, но возникли проблемы:
- как отличить данные которые я уже собрал, от тех которых я еще не собирал? Вопрос не в том, чтобы отличить на уровне БД (у каждого лота есть уникальный id) , как предотвратить парсинг того, что уже есть? Усложняет то, что выборка кждый раз зависит от данных введенных в форму фильтрации. В первый раз пользователь может фильтравать по запросу “калоприемник”, во-второй “калоприемники” и выборка будет разной, в первом случае она включит в себя наименивание как во множественном, так и в единственном числе, а во втором - только множественные.
- если я уже, по определенному запросу собрал данные, например вчера, то как мне по этому же запросу собрать данные сегодня? Этот вопрос связан с предыдущим, т.е. это скорее всего иная формулировка предыдущего вопроса, может так понятней.
- есть ли способ преодолеть капчу? (recaptcha)
Я думал решить эти проблемы путем создания отдельной модели, которая хранит в себе:
1 словари с данными из формы фильтрации (предварительно из моей версии формы выпиливаются все ненужные моему заказчику поля),
2 снимок страницы, на момент последнего к ней обращения, под снимком я понимаю не HTML, а уже выбранные, холодные данные, без тегов и т.п.
В момент применения фильтрации, я проверяю был ли уже такоый запрос, если был, то сравниваю сснимок. Если снимок отличается от того, что есть то начинаю парсить, до первого встреченного существуеющего в моей БД лота, но тут проблема… вдруг мой парсер прервется по какой-либо причине, тогда при перезапуске, он не сможет найти место где остановился. Также можно изучать пагинацию, т.е. смотреть на кол-во страниц, и если мое кол-во отличается, то запускать по новой.
Буду рад любым советам, извините, что столько нагородил , думал, что вопрос будет коротким, но когда начал писать это вылилось в то, во что вылилось . Сам не знал, что у меня столько вопросов и мыслей
Спасибо!
P.S. Посоветуйте также инструменты, а то я использовал “BeautifulSoup”, а у вас тут о ней сказано как “… глючная тормозная библиотека …”
P.P.S могу дать ссылку на сайт, который я разбираю, если нужно