- Регистрация
- 23.12.2014
- Сообщения
- 14 449
- Реакции
- 5 477
- Баллы
- 113
Не так давно яндекс выкатил свой сервис объявлений, на сайте неплохая защита которую на запросах обойти достаточно сложно. Было решено использовать мобильную версию (веб). Но как оказалось и в ней не все так просто, про это я и хотел рассказать.
Сама работа яндекс объявлений похожа и не другие сервисы Юла и Авито. Скролл вниз подгружает новые объявления.
В авито в мобильной версии свайп вверх подгружает новые объявления, а вот в полной версии, все достаточно статично и удобно. По этому в авито я отдаю предпочтение полной версии для сбора ссылок. Яндекс же пошел другим путем и сделал подгрузку объявлений свайпом/скроллом в обоих версиях мобильной и декстопной. Естественно для работы я выбрал мобильную версию по скольку она легче.
Часть 1. Сбор информации с основной страницы.
Первое что необходимо сделать - это облегчить сайт от лишней инфы.
По этому мы отключаем картинки, рекламу, медиа. Некоторые еще отключают стили, но я считаю это может вызвать баги на странице. Далее смотрим в монитор траффика и видим много лишних запросов
Отключаем все запросы кроме основных двух доменов яндекса:
Политика содержимого:
o.yandex.ru
yastatic.net
Нам повезло и страница работает корректно. Это радует, т.к. мы серьезно облегчили нагрузку на траффик и шаблон.
Далее нам нужно скроллить страницу, я подумал, что пора использовать свайп в этом деле. Но решил использовать эмулятор клавиатуры и клавишу END, благо на этой мобильной версии работает клавиша END. Почему я это сделал? END перемещает страницу сразу вниз, это быстрее и эффективнее. А супер эмуляция нам в данном случае не нужна, ведь мы просто собираем данные, тут важнее интервалы нежели поведенческие факторы))
Эмуляция клавиатуры:
{END}{UP}{UP}{UP}{UP}{UP}{UP}
Далее начались проблемы которые с подвигли на написание данной статьи, хочу заметить что шаблон писал по фану и не было цели долбить его запросами и пытаться обойти защиты яндкса.
Первое с чем столкнулся - это отсутствие новых объявлений в
{-Page.Dom-} после скроллинга. Причем сами объявления видны на странице. Умные люди подсказали, что дело в AJAX, а точнее что инфа подгружается напрямую с запросов.
URL:
https://o.yandex.ru/-/ajax/getHomepage/
Поразмыслив пришел к выводу, что будем брать инфу сразу с запросов. Да и собственно и выбора то нету. Для получения информации из запросов есть замечательный инструмент GetTraffic Method
И тут я столкнулся с проблемой номер два. Ответ от сайта был
System.Byte[]. Что еще за систем и какой такой байт? В запросе такого нету...Оказалось, что ответ нужно было перевести в строковое значение. В итоге получилась вот такая конструкция:
C#:
var traffic = instance.ActiveTab.GetTraffic(new [] {@"https://o\.yandex\.ru/-/ajax/getHomepage"});
project.SendInfoToLog("Request by urls filter:");
foreach(TrafficItem t in traffic){
project.Variables["Body"].Value = Encoding.UTF8.GetString(t.ResponseBody, 0, t.ResponseBody.Length);
}
Часть 2: Работа с JSON
И так! В одном ответе от сервера мы получаем порядка 70 объявлений. Интервалы между скроллами установлены 0.5-0.7 сек + время на обработку. Получается достаточно внушительная скорость для однопотока!
Что бы посмотреть на распаршенные данные, то нужно кликнуть на JSON в переменных. Не малый объем информации, которая уже ждет пока ее спарсят =)
Номер в квадратных скобках означает номер объявления, отсчет идет с нуля при каждом новом запросе.
Соответственно, что бы получить всю информацию с запроса, то нам нужно в цикле с счетчиком собрать информацию. Имея опыт работы с JSON ранее (стоит признать что он не большой), заранее подготовимся к пустым значениям в некоторых переменных. Я обычно ставлю прочерк для таких значений.
JSON:
{-Json.data.homepage.listing.snippets[{-Variable.Count_1-}].address.region.name-}}
При записи в таблицу разделитель столбцов выбрал перенос строки. Таким образом мы сможем легко добавлять и убирать колонки. Вроде мелочь, выглядит приятно.
В целом основные моменты описаны. Сам проект прикреплен к статье и полностью актуален на момент ее выхода. Многопотока нету причине крайне малого кол-ва объявлений. Возможно в будущем оно будет расти, но с какой скоростью предугадать сейчас достаточно сложно, тем более такие гиганты как Авито и Юла никуда не денутся. Видимо сервис Яндекс объявления задумывался как перспектива на года вперед. Новые поколения возможно выберут яндекс, а пока что не суетимся, т.к. человек не склонен менять привычные ему вещи, а что может быть привычнее авито))
Часть 3. Парсим телефоны.
Телефон появляется после клика по надписи "Позвонить"
После клика появляется запрос, который собираем описанным ранее методом GetTraffic. Только в этот раз меняем URL.
C#:
var traffic = instance.ActiveTab.GetTraffic(new [] {@"https://o\.yandex\.ru/-/ajax/getOfferPhone/"});
project.SendInfoToLog("Request by urls filter:");
foreach(TrafficItem t in traffic){
project.Variables["Body"].Value = Encoding.UTF8.GetString(t.ResponseBody, 0, t.ResponseBody.Length);
}
Получаем такой ответ
AJAX:
{"card":{"contacts":{"phone":"+790362477**"}}}
Далее в цикле проверяем все ссылки и записываем в таблицу.
По началу мне показалось, что в сервисе мало номеров. Но как оказалось они есть в достаточном количестве
Заключение
На сайте еще осталась информация которую мы не спарсили. Это "Открытая личка", "Защищеный телефон", "Дата публикации", "Кол-во просмотров" и т.д. Можно было бы и ее спарсить, только в чем тогда смысл статьи если не дать возможности читателям попрактиковаться. Дерзайте!

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



