Albert12/GreenBoard — pull request #10 by Albert12 (2013-04-02 15:00:44+00:00)
Title: avito parser added

Рассказываю логику решения. Испытал разные fuzzy компараторы текста и понял, что для этой задачи они не подходят. Так, разница в тексте в 1 символ дает результат, говорящий о том, что тексты почти идентичны. Если этот 1 символ - опечатка, то объявления можно считать одинаковыми, а если этот 1 символ - разные этажи в одном и том же доме - то это 2 разных уникальных объявления. Так, сейчас на irr есть куча объявлений о продаже квартир в новом доме, которые отличаются всего 1 цифрой - этажом. Также заявитель может умышленно искажать текст объявления, чтобы подать его еще раз и чтобы фильтр сайта допустил повторную подачу, что обычно запрещено. Таким образом, было принято решения определять уникальность текста по ключевым фразам. В нашем случае ключевые фразы - это цифры, отражающие площадь квартиры, этаж, этажность, номер дома и т.п. Причем заявитель может менять в тексте места расположения этих цифр для обхода фильтра сайта. В итоге я решил для каждого объявления выделять из текста все цифры, создавать из них массив, массив далее сортировать и сравнивать объявления, сравнивая такие массивы.
Далее, согласно требованиям, если текст свежеспарсенного объявления совпадает с имеющимся в базе, то проверяются контактные данные и цена. Если они различаются, то соответствующие поля в БД обновляются, а также обновляется поле, содержащее URL объявления, так как если контактные данные или цена различны, то объявление подал другой заявитель и у этого объявления разумеется другой URL. Если же текст и контактные данные с ценой совпадают с тем, что уже есть в базе, то я сравниваю еще и URL и обновляю его в случае различия, так как то же самое объявление может быть подано еще раз с небольшими изменениями в описательной части, и в итоге наша база будет содержать линк на самое свежее объявление из дублирующихся.
Телефоны с Avito не парсятся, мало того что телефон там это картинка, так ее местонахождение еще и хорошо спрятали. Если с картинкой еще можно поиграться с OCR гемами, то саму картинку добыть не представляю как, посмотри как они это реализовали, там похоже аякс и жуткий яваскрипт, а для генерации адреса они что-то еще от яндекса приплели, в общем неплохо постарались.
Также irr склонен глючить. Иногда при попытке открыть объявление открывается страница сайта вообще без объявления. Если ее обновить, то объявление скорее всего появится. Для таких случаев я предусмотрел 3 попытки загрузить страницу, и если они проваливаются, то объявление пропускается, о чем сообщается. Авито в подобном поведении замечен не был, но там я реализовал тот же механизм на всякий случай.