Пошук житла без посередників в 21-му столітті

Думаю, всі ми одного разу шукали собі житло. Хтось-у власність, більшість, ймовірно, в оренду. Всі, хто хоч раз намагався знайти реальні пропозиції на дошках оголошень, знають — це нереально. Такої кількості спаму немає, мабуть, ні в одній іншій сфері. Після того, як зануришся в це пекло, зазвичай починають свербіти руки застосувати свою IT-шность на благо ближнього. Результатом став проект Sobnik, про який я і хочу розповісти.

Sobnik — це плагін для Chrome, який позначає посередників на дошках оголошень. Поки працює тільки з Avito.ru, в найближчому майбутньому я додам <a href=«irr.ru» title=«Дошка оголошень » З рук в руки">Irr.ru та інші великі дошки. Всіх, хто сидить на валізах і кому не терпиться спробувати, прошу Google Web Store. Під катом я розповім про технічну сторону проекту, про його перспективи і про моїх спостереженнях за противником посередниками. Любителі критикувати чужу JS-код також велкам, ісходник клієнтської частини плагіна доступний на github.


Для любителів точності уточнюю: формально, Sobnik це «розширення», а не плагін, але аж надто я до останнього терміну звик.

Навіщо все це?
«Користь суспільству», сподіваюся, очевидна, тому відразу перейду до питання «навіщо це особисто мені». Зіткнувшись в останній раз з пошуком житла, наплевавшись на спам, яким заповнений Інтернет, надивившись на винахідливих ріелторів, я відчув прямо таки укол совісті. Як ніяк кораблі вже борознять простори 21-го століття, невже ми, Програмісти, не здатні впоратися з жалюгідними спамерами?

Поміркувавши, я ризикнув припустити, що здатні. Перегляду декількох сотень оголошень було достатньо, щоб зрозуміти — посередників виявити легко. Або за змістом оголошення, надто підозрілою або очевидно агентською, або за наявності безлічі пропозицій з одним і тим же номером телефону. Залишалося вибрати технології, на основі яких цю ідею можна було перевірити — оголошення потрібно було розпарсити, куди зберегти, і проаналізувати. Як парсера я вибрав Google Chrome — для доступу до всієї потрібної інформації на дошках оголошень потрібен повноцінний браузерний движок з працюючим JavaScript-му. Для серверних справ вирішив спробувати Go і MongoDB. Всі три речі були для мене в новинку, так що це була відмінна можливість розширити горизонти і освоїти щось нове. В результаті вийшов Sobnik.

Як виявити агентів?
На перший погляд — досить просто. Доступним і достовірним індикатором служить номер телефону, на який дано безліч оголошень. Бо не стане ж агент купувати під кожне оголошення нову сім-карту! Крім того, деякі оголошення містять прямі згадки що автор ріелтор і хоче комісію. В теорії воно звичайно просто, на практиці довелося вирішувати безліч дрібних питань:
  1. Авіто і багато інших дошки публікують номер телефону у вигляді зображення, відповідно — номер доводиться розпізнавати.
  2. Агенти активно ховають свої реальні телефони. Телефон вказують в тексті оголошення, словами, літерами, спецсимволів. Всю цю маскування доводиться виявляти і розкривати.
  3. Деякі власники дають багато оголошень на одну і ту ж квартиру. Щоб не зарахувати їх у ріелтори, доводиться з'ясовувати, про різні об'єкти йде мова в різних оголошеннях, або про одне й те ж. Зв'язуватися з розпізнаванням адрес я не став, використовую готові географічні координати, доступні на багатьох дошках.
  4. Найбільш просунуті посередники малюють свої реальні номери телефонів на фотографіях квартир. Таких товаришів складніше виявити. Я не знайшов надійного і легкого у застосуванні OCR рішення, здатного розпізнавати номери на фотках. Довелося поміркувати і народити простий алгоритм, що визначає, чи є на фото будь-який текст, і такі оголошення вважати агентськими.
  5. текст оголошення часто є пряме згадка про те, що автор — агент. Однак, оскільки комп'ютери поки не навчилися розуміти мова, надійного методу для повноцінного використання цієї інформації я не придумав. Поки обійшовся виявленням деяких найбільш поширених і недвозначних фраз, благо цей критерій лише доповнює основний детектор за номерами телефонів.
Використання цих прийомів дозволяє автоматично виявляти більшу частину посередників. Ось так виглядає Авіто під час активності спамерів (червоні і зелені кружечки — результат роботи Sobnik-а):
image

Технічна сторона проекту
Плагін написаний на JavaScript, оскільки функціоналу API Хрому цілком достатньо для поставлених цілей. Єдина складність була з отриманням зображення номера телефону. Справа в тому, що Avito віддає його тільки для запитів з правильним Referer-му. У браузері підробити цей заголовок можливості немає, а отримати дані зображення, завантаженого сторінкою Avito, не дає Cross-Origin Policy. Виявилося, що цей захист легко обійти — я зберігаю сторінку в форматі MHTML через відповідний API, а потім з отриманого рядка вирізаю потрібний мені шматок, що містить зображення в base64-кодування. Таким же методом отримую доступ до фотографій квартир.

Далі, інформація відправляється на сервер, де працює програма на Go. Насправді дві програми — усі запити виконуються асинхронно, одна програма пише усі запити чергу, друга програма ці запити обробляє. В клієнтську частину вбудована логіка щодо уповільнення потоку звернень до сервера в разі, якщо той не встигає виконувати запити вчасно. Такий підхід дозволить згладити коливання навантаження (дуже сподіваюся, що сьогодні вони виникнуть). Дані зберігаються в MongoDB.

Все це господарство я розмістив на Amazon AWS (ще одна штука, яку хотів спробувати). Поки «Free Tier» цілком вистачає, так що за хостинг не плачу.

Серверний API доступний публічно, ніякої авторизації. Підозрюю, що знайдуться бажаючі погратися і напакостити, так що в найближчих планах — запровадити деяку захист. В кінцевому рахунку майже напевно прийду до реєстрації користувачів плагіна, але поки не хочу додавати зайвих бар'єрів для бажаючих спробувати.

Вихідний текст плагіна відкритий. По-перше, все одно його не приховаєш. По-друге, відразу видно яку саме інформацію збирає плагін, так що у розумних людей не буде питань щодо приватності. Ну і, нарешті, раптом одного разу з'являться ентузіасти, які бажають взяти участь у розробці.

Централізованого краулера для збору даних немає. По-перше, Авіто відрубує IP-шники, які відкривають порядку пари сотень сторінок на годину. По-друге, я сподіваюся, що коли користувачів стане багато, вийде розподілений краулер — кожен відкриє по парі оголошень, ось і наповнилася база. Однак, поки активних користувачів немає — база порожня. Основна користь від плагіна в тому, що не треба відкривати агентські оголошення, а якщо в базі порожньо — то доведеться відкривати всі підряд. Загалом, щоб надати системі хоч якесь прискорення, я зробив ще один плагін для внутрішнього використання, який тихенько, приблизно по сторінці в хвилину, сканує на Авіто пропозиції про здачу квартир в Москві. Встигати за спамерами в пікові години не виходить, але все ж у вас, шановний читачу, буде можливість оцінити як працює Sobnik: встановили, відкривайте на Авіто вищевказаний розділ і насолоджуйтеся. Буду радий пропозиціям про те, як налагодити сканування Авіто в більш серйозних масштабах. Бажаючим можу видати плагін для краулинга, якщо раптом хочете допомогти проекту або посканировать інше місто або розділ.

Спостереження за ріелторами
Запустивши сканування оренди в Москві, я зробив кілька корисних спостережень. Всі вони досить логічні і здаються очевидними, проте Sobnik дозволив їх наочно перевірити і підтвердити:
  1. В робочі дні близько 80% оголошень належать агентам. Авіто, до речі, активно баніт дуже багато оголошень, так що з 30 оголошень в хвилину через годину залишається від сили 10. Однак, з цих десяти все одно переважна більшість — посередники.
  2. Пізно ввечері (після 10-11 годин), і у вихідні — агентів майже немає. Відпочивають бачити від важких спамерських буднів.
  3. Платні оголошення (на Авіто вони виділені жовтим кольором) — майже завжди власники. Поки я бачив тільки одного агента, який побажав не сотню рублів на рекламу елітної квартири. Є ймовірність, що це був власник, який вирішив зробити вигляд, що він агент з ексклюзивом і зрубати зайвих грошей (бувають такі, судячи з чуток).
  4. Якщо в оголошенні всього одна або дві фотографії, це майже напевно агент. Три фотки — 50 на 50. Власники або пишуть взагалі без фото, або вже якщо напружилися — роблять хоча б п'ять.
  5. Якщо телефон вказаний на фотографії, або «зашифрований» в тексті оголошення — це майже напевно агент. Шифруватися подібним чином їх змушує Авіто, який вимагає грошей за розміщення великої кількості оголошень на один і той же номер телефону.

Цей список, в цілому, дозволяє очима відфільтрувати майже весь сміття, так що якщо вам лінь ставити Sobnik — користуйтеся.

Disclaimer: Я ні скільки не проти ріелторів. Для них на Авіто якщо спеціальна позначка, ставиш її — і всім одразу зрозуміло що ти — агент. І звичайно я в курсі, що в багатьох випадках агент просто необхідний. Sobnik бореться лише з тими, хто спам і намагається вас обдурити.

Перспективи
Розвивати проект я планую в двох напрямках:
  1. Додавати нові дошки (наступної, ймовірно, буде «З рук в руки»).
  2. Підвищувати точність і надійність детектора.
Теоретично, коли буде активно скануватися багато дощок, Sobnik зможе знаходити вихідне оголошення власника за його копіями, опублікованими агентами на інших дошках. Чи вдасться досягти цих висот покаже час, і звичайно ж ваші цінні коментарі.

Публікувати зібрану базу оголошень я не планую, надто вже нахабно було б красти і поширювати цю інформацію. Проте, раз вже фінансовий план Авіто не дозволяє їм самим фільтрувати спамерів, цим займеться Sobnik.

До ваших побажань і пропозицій буду дуже радий.

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.