Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 1, 2015 08:35:14

KsimMiloff
Зарегистрирован: 2013-10-11
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

парсер сайта закупок, помощь советы, спасибо :)

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

Причины возникновения задачи:
1 ресурс неудобен, всех необходимых данных нет в таблице, чтобы получить доп. данные необходимо проваливаться в глубь на две ссылки;
2 ресурс предоставляет API только по “открытым” лотам, а нам нужна информация по остальным (закрытые, отмененные и т.п.);
3 попросила жена , ее компания регулярно использует ресурс.

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

Я планировал собирать парсером данные и сохранять их в БД, а потом работать с ними и только при необходимости подгружать “свежие”, но возникли проблемы:

  • как отличить данные которые я уже собрал, от тех которых я еще не собирал? Вопрос не в том, чтобы отличить на уровне БД (у каждого лота есть уникальный id) , как предотвратить парсинг того, что уже есть? Усложняет то, что выборка кждый раз зависит от данных введенных в форму фильтрации. В первый раз пользователь может фильтравать по запросу “калоприемник”, во-второй “калоприемники” и выборка будет разной, в первом случае она включит в себя наименивание как во множественном, так и в единственном числе, а во втором - только множественные.
  • если я уже, по определенному запросу собрал данные, например вчера, то как мне по этому же запросу собрать данные сегодня? Этот вопрос связан с предыдущим, т.е. это скорее всего иная формулировка предыдущего вопроса, может так понятней.
  • есть ли способ преодолеть капчу? (recaptcha)

Я думал решить эти проблемы путем создания отдельной модели, которая хранит в себе:
1 словари с данными из формы фильтрации (предварительно из моей версии формы выпиливаются все ненужные моему заказчику поля),
2 снимок страницы, на момент последнего к ней обращения, под снимком я понимаю не HTML, а уже выбранные, холодные данные, без тегов и т.п.

В момент применения фильтрации, я проверяю был ли уже такоый запрос, если был, то сравниваю сснимок. Если снимок отличается от того, что есть то начинаю парсить, до первого встреченного существуеющего в моей БД лота, но тут проблема… вдруг мой парсер прервется по какой-либо причине, тогда при перезапуске, он не сможет найти место где остановился. Также можно изучать пагинацию, т.е. смотреть на кол-во страниц, и если мое кол-во отличается, то запускать по новой.

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

Спасибо!

P.S. Посоветуйте также инструменты, а то я использовал “BeautifulSoup”, а у вас тут о ней сказано как “… глючная тормозная библиотека …”

P.P.S могу дать ссылку на сайт, который я разбираю, если нужно

Отредактировано KsimMiloff (Июнь 1, 2015 08:41:18)

Офлайн

#2 Июнь 1, 2015 13:32:07

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

парсер сайта закупок, помощь советы, спасибо :)

KsimMiloff
Посоветуйте также инструменты
lxml
KsimMiloff
могу дать ссылку на сайт, который я разбираю, если нужно
давайте
KsimMiloff
есть ли способ преодолеть капчу? (recaptcha)
нет
KsimMiloff
как отличить данные которые я уже собрал, от тех которых я еще не собирал
в большинстве случаев у каждого товара должно быть что-то уникальное. или ссылка или ид или путь к изображению
KsimMiloff
сложняет то, что выборка кждый раз зависит от данных введенных в форму фильтрации. В первый раз пользователь может фильтравать по запросу “калоприемник”, во-второй “калоприемники” и выборка будет разной, в первом случае она включит в себя наименивание как во множественном, так и в единственном числе, а во втором - только множественные.

если я уже, по определенному запросу собрал данные, например вчера, то как мне по этому же запросу собрать данные сегодня? Этот вопрос связан с предыдущим, т.е. это скорее всего иная формулировка предыдущего вопроса, может так понятней.
сложно сказать не видя сайт
KsimMiloff
но тут проблема… вдруг мой парсер прервется по какой-либо причине, тогда при перезапуске, он не сможет найти место где остановился
а вы пока не дойдете до существуеющего в БД лота не записывайте в нее
например храните это в списке, а когда нашли уже существующий тогда записывайте
или прост не делайте commit до тех пор
KsimMiloff
снимок страницы, на момент последнего к ней обращения, под снимком я понимаю не HTML, а уже выбранные, холодные данные, без тегов и т.п.
а почему не сравнивать по первому лоту?
KsimMiloff
Также можно изучать пагинацию, т.е. смотреть на кол-во страниц, и если мое кол-во отличается, то запускать по новой.
плохая идея



————————————————
-*- Simple is better than complex -*-

Офлайн

#3 Июнь 1, 2015 14:11:41

KsimMiloff
Зарегистрирован: 2013-10-11
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

парсер сайта закупок, помощь советы, спасибо :)

вот этот ресурс.

terabayt
в большинстве случаев у каждого товара должно быть что-то уникальное. или ссылка или ид или путь к изображению
я по этому писал, под id, я имел в виду id взятый с сайта
KsimMiloff
Вопрос не в том, чтобы отличить на уровне БД (у каждого лота есть уникальный id)
terabayt
а вы пока не дойдете до существуеющего в БД лота не записывайте в нее
вот спасибо, аж стыдно, что сам не подумал . Только мне кажется, что нужно не до первого существуещего искать, а до такой страницы, где все данные будут существующими.
terabayt
а почему не сравнивать по первому лоту?
да потому что первый лот - не гарантия. Я говорил, что могут запросить как “калоприемник”, так и “калоприемники”. Если первым запросили второй вариант и получили, например, 10 новых лотов, то при запросе по первому варианту, лотов может быть 30, но первый лот для обеих выборок может быть одинаковым, в этом случае парсер решит, что он уже все собрал. Эта проблема одна из сложнейших, т.к. поиск сайта позволяет искать в LIKE стиле, например “*применики”.

Офлайн

#4 Июнь 1, 2015 14:48:13

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

парсер сайта закупок, помощь советы, спасибо :)

KsimMiloff
да потому что первый лот - не гарантия. Я говорил, что могут запросить как “калоприемник”, так и “калоприемники”.
я о
KsimMiloff
если я уже, по определенному запросу собрал данные, например вчера, то как мне по этому же запросу собрать данные сегодня?
KsimMiloff
Я думал решить эти проблемы путем создания отдельной модели, которая хранит в себе:
1 словари с данными из формы фильтрации (предварительно из моей версии формы выпиливаются все ненужные моему заказчику поля),
2 снимок страницы, на момент последнего к ней обращения, под снимком я понимаю не HTML, а уже выбранные, холодные данные, без тегов и т.п.
там же фильтрация по дате
или “Дата начала/окончания приема заявок” это что-то друго? если да, то можно только по ид, зачем вам все данные хранить?
KsimMiloff
как отличить данные которые я уже собрал, от тех которых я еще не собирал? Вопрос не в том, чтобы отличить на уровне БД (у каждого лота есть уникальный id) , как предотвратить парсинг того, что уже есть? Усложняет то, что выборка кждый раз зависит от данных введенных в форму фильтрации. В первый раз пользователь может фильтравать по запросу “калоприемник”, во-второй “калоприемники” и выборка будет разной, в первом случае она включит в себя наименивание как во множественном, так и в единственном числе, а во втором - только множественные.
KsimMiloff
Я думал решить эти проблемы путем создания отдельной модели, которая хранит в себе
думаю этот вариант будет неплох
а о снимке я писал выше
и еще лучше снимок проверять поэлементно
например в бд вы храните
“калоприемник” и все ид
когда следующий раз обращаетесь к “калоприемник” то циклом смотрите , если хоть один не совпал сразу начинайте парсить именно этот лот



————————————————
-*- Simple is better than complex -*-

Офлайн

#5 Июнь 1, 2015 15:17:54

KsimMiloff
Зарегистрирован: 2013-10-11
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

парсер сайта закупок, помощь советы, спасибо :)

terabayt
зачем вам все данные хранить?
согласен, я усложняю себе жизнь
terabayt
“калоприемник” и все ид
значит ли это, что этот id может принадлежать двум записям, например (таблица snapshot):
id____snapshoted_params___________snapshoted_ids
1____{lot_name='калоприемник'}______[1, 2, 3, 4, 5, 6, 7]
2____{lot_name='калоприемники'}_____[ 6, 7, 8, 9, 10]

Я вас правильно понял?

Отредактировано KsimMiloff (Июнь 1, 2015 15:22:03)

Офлайн

#6 Июнь 1, 2015 15:31:02

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

парсер сайта закупок, помощь советы, спасибо :)

KsimMiloff
значит ли это, что этот id может принадлежать двум записям, например (таблица snapshot):
ну да, а почему бы и нет?!
лотов там мало
это если бы было миллионы записей и 80% с них повторяются, тогда нужно было бы думать что-то нестандартное, а так…
а так намного проще как для вас так и для машины
а для того чтобы бд сильно не разросталась можно запускать раз в месяц-три скрипт который будет удалять старые записи, для этого нужно еще в записях хранить дату создания



————————————————
-*- Simple is better than complex -*-

Офлайн

#7 Июнь 1, 2015 16:08:35

KsimMiloff
Зарегистрирован: 2013-10-11
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

парсер сайта закупок, помощь советы, спасибо :)

terabayt
ну да, а почему бы и нет?!
да ничего, все отлично. Спасибо

Офлайн

#8 Июнь 1, 2015 18:50:21

ajib6ept
От: От: От: От: От: От: От: От:
Зарегистрирован: 2013-08-04
Сообщения: 297
Репутация: +  26  -
Профиль   Отправить e-mail  

парсер сайта закупок, помощь советы, спасибо :)

есть ли способ преодолеть капчу? (recaptcha)

Буквы распознать? antigate.com поможет или во второй версии что-то поменялось?



_________________________
Python golden rule: Do not PEP 8 unto others; only PEP 8 thy self.
Don't let PEP 8 make you insanely intolerant of other people's code.

Офлайн

#9 Июнь 1, 2015 18:58:17

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

парсер сайта закупок, помощь советы, спасибо :)

ajib6ept
antigate.com
8,5% с Украины О_О
за 0.7USD за 1000 изображений
ajib6ept
или во второй версии что-то поменялось?
reCAPTCHA: Easy on Humans, Hard on Bots



————————————————
-*- Simple is better than complex -*-

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version