Реактивная доставка свежих объявлений

image

Актуальная проблема актуальности

Пожалуй каждый, кто искал что-то на досках объявлений, включая объявления по аренде жилья, сталкивался с тем, что товар по объявлению уже продан и не актуален.

Проблема актуальности объявления особенно заметна когда действия происходят в крупных городах как Москва или Питер.

Это понятно и объяснимо: у покупателя нет столько времени, чтобы непрерывно просматривать свежие предложения на рынке.

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

Работают они примерно так: представьте, что есть некая программа, которая запускается по расписанию и проверяет наличие свежих предложений, если такие предложения есть — пользователю отправляется письмо. Важно отметить, что обычно график уведомлений это 1-2 раза в сутки, например утром и вечером.

Это действительно просто и удобно. Однако, когда дело касается аренды жилья без посредников, то такие уведомления становятся зачастую бесполезными. «Вкусные» квартиры сдаются очень быстро, в том числе и по той причине, что риелторы непрерывно мониторят рынок при помощи своих инструментов.

Актуальное решение проблемы актуальности

У себя на сайте Трудом.РФ мы реализовали уведомления в реальном времени.

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

Для того чтобы получать свежие предложения, необходимо сделать 2 простых шага:

Выбрать нужные параметры поиска

Capture

Нажать кнопку «Подписаться» и указать свою электронную почту.

Capture2

Как только что-то появится по вашему запросу мы незамедлительно сообщим об этом Вам в письме.

Ниже приведен пример письма:

Capture3

Такой подход позволит Вам не пропустить нужное объявление, продолжая вести свой привычный образ жизни и не тратить кучу времени на поиск достойного варианта в ручную.
А когда нужный вариант будет найден, просто отпишитесь от рассылки.

Удачных поисков!
Команда Трудом.РФ

Снять квартиру и жить

1481589102195258575

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

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

Далее список самых главных нововведений:

1. Рейтинг объявления.

За время работы системы нам удалось собрать прилично статистики, которую мы применяем в подсчете рейтинга каждого объявления, говоря простым языком, рейтинг показывает «вкусность» (привлекательность) объявления. При его расчете учитывается полнота и достоверность описания, качество фотографий, отклонение от средней цены по рынку, история продавца, в общем всё то, что получится проанализировать, используя наши статистические данные.

1481759011124660869

Очевидно рейтинг полезен для того, кто ищет жилье, кроме того он не менее полезен и для тех, кто планирует жилье сдать. Дело в том, что все популярные доски объявлений действуют по принципу «кто последний, тот и в топе» (без учета премиум объявлений и всевозможных платных «поднятий»).

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

2. Размещение объявлений.

Из первого пункта плавно вытекает второй пункт, мы добавили возможность публиковать объявления у нас, в любой регион и населенный пункт России, без регистрации и естественно бесплатно (как впрочем и всё что у нас есть на сайте). Так что если у вас есть, что сдать и желание покорить нашу первую страницу выдачи — милости просим и будем рады помочь.

148175905017706991

3. Питер.

Да, мы наконец-то дошли до северной столицы нашей необъятной. Теперь система хотя и в тестовом режиме, но по большей части полноценно функционирует по Питеру и городам Ленинградской области.

1481759073160470059

4. Множество других, в основном технических нововведений

Включая распознавание похожих объявлений, информация о домах, работа с картой и проч.

1481759583113791608

Всё удобство поиска недвижимости без посредников на нашем сайте Трудом.РФ

P.S. Для нас очень важна обратная связь, напишите в комментариях (или нам в группу) как в вашем регионе обстоят дела с арендой недвижимости, и мы постараемся в ближайшее время настроить нашу систему на этот регион и облегчить вам поиск.

Мы в социальных сетях:

Удачных поисков!

Правила съема жилья: Метод Трудом.РФ

Друзья! На связи снова Трудом.РФ, сайт по распознаванию частных объявлений и выявлению посредников при аренде жилья. В этом посте я расскажу что у нашей системы под капотом.

146979500018261205

Мы ставим перед собой цель упростить процесс аренды для честных квартиросъемщиков и максимально защитить их от рисков и лишних переплат, как когда-то защитили себя и своих друзей, а всё что из этого получится зависит от Вас, друзья…

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

Раз: Снять квартиру без посредников своим трудом

Два: Как обманывают на досках объявлений

Поехали!

Как в первом приближении выглядит задача по определению частных объявлений – получаем с некоторой периодичностью новые объявления с ресурса, получение их номеров и сравнение с тем, что есть в базе. Кажется, что все довольно просто, однако, как обычно дьявол кроется в деталях. Возникает множество проблем и нюансов. Вот некоторые из них:

  1. Ресурсы ограничивают число запросов к ним. Если производить запрос слишком часто, Авито в первый раз банит на 15 минут, второй раз на час, и т.д.
  2. Объявлений очень много. Только с одного Авито по Москве в день публикуется более 4000 объявлений, с ЦИАН – более 3000 объявлений. Надо уметь их быстро обрабатывать.
  3. Для получения номера телефона, требуются дополнительные действия – сымитировать нажатие на кнопку/распознать картинку и т.п.
  4. Фильтрации только по номеру не хватает – мошенники и риелторы далеко не дураки и используют огромное количество симок и также специальные сервисы.
  5. Как правило, объявления, которые являются заведомо мошенническими, все равно появляются в выдаче, несмотря на модерацию. Однако, модератор может заблокировать объявление потом.
  6. Хорошие предложения уходят быстро, и их так же быстро надо удалять из своей базы.

С самого начала было понятно, что одним сервером ограничиться будет трудно – необходимо несколько серверов.

Во время учебы в институте, у нас как минимум раз в год, проводилась конференция компании Microsoft, на которой они рассказывали о своих новых технологиях (помню времена, когда они пиарили покойные ныне Silverlight и XNA). Тогда же давали доступ к программе DreamSpark. По данной программе студентам российских вузов предоставляется доступ к лицензионному ПО (в наше время это были Windows Server 2008R2, SQL Server 2008, Visual Studio 2010 Professional) при условии использования его в образовательных целях. Данная программа доступна абсолютно всем российским студентам. В некоторых ВУЗах (например в нашем МАИ) была доступна расширенная программа – MSDN Academic Alliance. В ней список ПО гораздо шире.

Всё в Ажуре!

Так сложилась, что в мир .NET нас затянули не эти конференции, а первые места работы. Да и в самих конференциях мы особо не участвовали. Когда встал вопрос о выборе стека и архитектуры, я вспомнил про еще одну программу Microsoft – BizSpark. Эта программа для стартапов и малого бизнеса. Требования к компании минимальны – даже не требуется юридической регистрации. В программы предоставляется доступ к огромному количеству лицензионного ПО, а также 5 подписок по 150$ на их облачный сервис Azure(в своей среде мы называем его просто ажур). Вообще, рассказ про программы тянет на отдельный пост. Мы подали заявку и в течение недели нам ее утвердили и предоставили все данные.

Таким образом, мы получаем 750$ (5 подписок по 150$) в месяц на хостинг. Программа действует 3 года, то есть в общей сумме Microsoft за все время участия в программе подсобит нам примерно 27 000$

1469795703110331074

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

1469795726166767713

Плюс у нас есть два не самых новых компа в качестве серверов в нашем маленьком ДЦ в квартире. Сейчас на них выполняются в основном служебные задачи.

Сервера по-домашнему и исходный кот проекта)

1469795774171697202

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

Общая структура

Система была разбита на несколько компонентов (сервисов):

1. Spider (паук) – краулер. Этот компнонент занимается тем, что получает страницу результатов поиска доски объявлений и из нее выделяет отдельные объявления. Он довольно простой – его задача просто получить ссылку на объявление и базовые данные – тип объявления (посуточная/длительная аренда), количество комнат, адрес. Получив ссылку, он отправляет ее дальше.

2. Scanner (сканер) – задача компонента открыть страницу одного объявления и вытащить максимум информации об объявлении – описание, фотографии, номер телефона, условия проживания, этаж и т.п.

3. OCR – веб-сервис, который распознает номер телефона с картинки и возвращает текст

4. Processor – центральный компонент. Сначала он получается данные от паука. Проверяет, публиковалось ли это объявление ранее или нет. Если объявление не публиковалось – он передает его сканеру, для получения полных данных. После того как сканер обработал объявления, проводится геокодирование (по адресу получает координаты дома), получаются ближайшие станции метро, анализируется цена объявления, проверяется есть ли у человека другие публикации, проверяется реальные ли данные указаны в информации о доме, проводится лексический анализ объявления. После выполнения всех действий, объявление добавляется в базу. И становится в очередь на периодическую проверку (пингования).

5. Pinger (пингер) — задача этого компонента проверять, доступно ли еще объявление. Он с некоторой периодичностью загружает страницу объявления и проводит анализ ответа. Если объявление было заблокировано модератором доски – перед нами мошенник и его номер идет в черный список. Если объявление было удалено, оно просто отмечается как удаленное в базе.

6. SMMTracker – маленький сервис который обеспечивает интеграцию с социальными сетями. У нас есть такая фишка на сайте – доступ за репост во Вконтакте. Т.е. человек, который не знает кодового слова, может просто поделиться записью из нашей группы, и он сможет использовать ссылку на свой профиль в качестве кодового слова. Задача этого компонента отследить новые репосты и добавить кодовое слово в базу.

Как видите, у нас много компонентов, и их надо как-то связать. Мы используем два способа связи – очереди и веб-сервисы. OCR-сервис является веб-сервисом, остальные компоненты общаются через очереди.

“В очередь, сукины дети, в очередь!”.

1469795936181078584

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

  1. Spider получает список документов и добавляет их в очередь «documents»
  2. Scanner читает очередь «scan-request», получает подробный документ и отправляет результат в «scan-result»
  3. Pinger читает из очереди «ping-request», результат добавляет в «ping-result».
  4. Processor читает очереди «documents», «scan-result», «ping-result»:
    1. В очереди «documents» находятся документы от паука. Если документ надо отправить на сканирование – добавляет его в очередь «scan-request».
    2. В очереди «scan-result» находятся результаты сканирования
    3. В очереди «ping-result» находятся результаты проверки существования документа. Если документ все еще существует, он добавляется снова в «ping-request»

Как же обеспечиваются отказоустойчивость и распределенность?

1. Мы используем сервис очередей, который предоставляет Azure. Это сервис достаточно дешевый, но при этом очень надежный – данные в очереди несколько раз резервируются и хранятся одновременно в различных дата-центрах.

2. Каждый сервис запущен в нескольких экземплярах (как минимум в двух), на разных серверах. Если один сервер выходит из строя – нагрузка ложится на остальные. Такая же ситуация, если сервер начинают банить.

3. Мы можем довольно просто регулировать нагрузку – если в очередях скапливается много документов, мы просто устанавливаем копию еще одного сервиса (это все равно, что открыть дополнительные кассы в магазине)

4. У нас настроено централизованное логирование, и мы быстро узнаем, когда что-то идет не так.

Технологии, которые мы используем.

Все сервисы у нас сделаны в виде служб Windows.

В качестве основного хранилища мы используем ElasticSearch. Выбор на такое решение пал по нескольким причинам – отказоусточивость, масштабируемость, распеределенность и скорость. Именно в это хранилище пишутся все найденные объявления. Также там хранится сопутствующая информация – станции метро, статистика цен и прочее. К сожалению, ничего не бывает бесплатно, и у ElasticSearch есть свои ограничения – например, при добавлении объявления, в поиске оно появляется не сразу, а через некоторое время (10-300мс), дорогие операции обновления документа. Поэтому, для некоторых утилитарных задач мы используем MongoDB.

Для сайта мы используем ASP.NET MVC и React. Если ASP.NET MVC – это уже стандарт в мире .NET, то React только-только завоевывает сердца .NET разработчиков. Выбор на React пал во многом из-за возможности Server-Side рендеринга (грубо говоря на сервере как Razor, только React) и скорости работы.

Для централизированного логирования, мы используем ELK (ElasticSearch, Logstash, Kibana) стек. Это довольно стандартное решение для таких задач. Мы можем быстро отслеживать ошибки и важные информационные сообщения.

Автоматизация обновлений.

1469796227186222082

Самое сложное в такой распределенной системе – это развертывание новых версий. Согласитесь, довольно неудобно вручную обновлять хотя бы один сервис на трех-четырех серверах. А обновлять сервисы иногда приходится довольно часто. В мире Linux есть Ansible, Docker и много других систем, позволяющих осуществлять автоматическое развертывание на многих серверах. Для .NET вариантов совсем мало. Но мы пока остановились на бесплатной версии Octopus-Deploy. Эта штука решила всю головную боль с развертыванием – теперь чтобы обновить версию, достаточно нажать буквально пару кнопок.

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

Удачных поисков!

Как обманывают на досках объявлений

1468964849197421289

В первой части был рассказан общий принцип работы недобросовестных риелторов и мошенников на досках объявлений.

В этой части речь пойдет о реальных методиках, которые применяются для того, чтобы сбить честного квартиросъемщика с толку, и как мы с такими «трюками» боремся, дабы выявить честных собственников из общей массы посредников.

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

Если не знать одно «но»: в случае с мошенниками и агентами, оформляет объявление, как правило, специальный робот, по заранее подготовленному шаблону.

Именно поэтому простейший текстовый анализ выявляет сильную схожесть описаний объявлений у казалось бы совершенно разных квартир и продавцов.

Однако было бы слишком наивно выявлять собственников только лишь по тому, как оформлено объявление, поэтому в нашей системе применяется комплексный подход, в котором мы анализируем:

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

Эти простые советы позволят вам без каких-либо технических средств «отсекать» большое число посредников и мошенников при поиске жилья.

1. «Идеальное объявление».

Трюк стар как мир, основан на том, что каждый человек верит в чудо(или халяву, кому как удобно). Верит в то, что сегодня реально снять квартиру в центре столицы с идеальным ремонтом меньше чем за 25 000 рублей, без комиссии, без залога(без смс, без регистрации, ага).

Вот один из наглядных примеров с известной доски объявлений.

1468983095156945745

Как правило, такой трюк рассчитан на недавно приехавших в Москву людей, иностранцев, туристов, которые еще не успели понять что к чему, опытный человек на такое не поведется.

Мы в свою очередь для того чтобы выявить такое объявление используем накопленные статистические данные.

Простым языком, наша система знает некоторую “среднюю цену”(медиану) аренды жилья с конкретными параметрами в том или ином районе города в данный момент, а также использует (пока еще небольшую) историю изменения этой “средней цены”.

2. «Как в кино!».

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

Разница лишь в том, что фотографии объявления просто тупо «левые» картинки из интернета. Кроме этого любят вставлять картинки отрендеренной(отрисованной) 3D модели с каких-нибудь зарубежных сайтов интерьеров и прочее.

«Фотографии» объявления получаются яркие, красочные, как в кино!

146898317917808402

Простой поиск по этой картинке в google

146898321917269808

Если видите что-то похожее — попробуйте выполнить поиск по картинке в любом из поисковиков.

3. «Собственник, агентам не звонить!!».

Что удивительно, в последнее время частенько вот прямо так (с двумя восклицательными знаками в конце) стали писать в описании, якобы собственники.

Трюк основан на том, чтобы замаскировать агентское объявление под объявление собственника: публикуется объявление в разделе «частные», пишется, что без комиссии(иногда даже и без залога) заезжай и живи!

Однако, позвонив по такому объявлению оказывается, что продавец это агент(или брат, сват, тесть, дядь=)) и квартиру «вот только что уже сняли, но есть другая квартира, такая же хорошая».

У нас был комичный случай, когда наша программка обнаружила такое вот объявление спустя 10 секунд после его фактической публикации на известной доске объявлений. Агент от неожиданности не очень складно рассказывал нам свою историю про «вот-вот только что перед вами звонили и сняли», и недоговорив, просто бросил трубку.

Обнаружить такое объявление в ручную довольно муторное занятие. Для этого необходимо проверить был ли номер продавца использован где-то ранее и где используется сейчас.

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

Бывают конечно случаи когда собственник сдает сразу несколько своих квартир в Москве, но мы с такими мажорами не водимся (шутка, мы обрабатываем и этот случай тоже).

4. «Меченные объявления».

Легче всего объяснить, что это за зверь картинкой(часть номера скрыта специально):

1468983536150556824

Такие объявления, якобы защищены от копирования (к тому же телефон на картинке бросается в глаза). Однако зачастую на картинках указан номер уже «раскрытого» агента, а в графе номер продавца указан подставной/левый новый номер.

Это очень интересный случай. Дело в том, что на известном сайте объявлений регистрация происходит по номеру телефона. Такие вот агенты/мошенники применяют специальные программы, смысл которых создавать каждое новое объявление с новым(подставным) номером и соответственно с новым продавцом, при этом на картинке такие программы указывают реальный номер агента. Стоит добавить, что схема интересна еще и тем, что даже позвонив по подставному номеру вы попадете все равно к агенту — достигается это правильной настройкой перенаправления звонка.

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

Это тот самый случай когда ручная обработка проще автоматической. В своей системе для выявления таких случаев мы используем оптическое распознавание текста на картинках (OpenCV модуль с обученным фильтром Neumann — Matas + Tesseract).

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

5. «Новые номера».

Это тоже самое что 4 случай, только без меченных картинок, просто новый «левый» номер, который перенаправляет вас на агента/мошенника.

Пожалуй это самый неприятный случай из описанных. Он тяжело распознаваем, как в ручном режиме так и в автоматическом.

Как мы это реализовали у себя, с вашего позволения оставлю в тайне.


Все эти и многие другие трюки распознаются нашей системой Трудом.РФ в автоматическом режиме. Безусловно находятся «умельцы»,  прорывающиеся через наши фильтры. Тогда в бой вступает надежный дедовский способ — ручная модерация.

В конце хотелось бы сказать, самый надежный фильтр это собственная бдительность. Будьте аккуратны, НИКОГДА не переводите деньги ДО заключения договора найма.

Удачных поисков!

Команда Трудом.РФ