- Регистрация
- 23.12.2014
- Сообщения
- 14 439
- Благодарностей
- 5 459
- Баллы
- 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/
И тут я столкнулся с проблемой номер два. Ответ от сайта был
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 летней давности. По факту на форуме есть практически все что нужно, что бы написать любой проект, главное правильно искать. На данной ноте предлагаю закруглится и благодарю всех за прочтение.
- Тема статьи
- Парсинг
- Номер конкурса статей
- Четырнадцатый конкурс статей
Вложения
-
38,3 КБ Просмотры: 294
Для запуска проектов требуется программа ZennoPoster или ZennoDroid.
Это основное приложение, предназначенное для выполнения автоматизированных шаблонов действий (ботов).
Подробнее...
Для того чтобы запустить шаблон, откройте нужную программу. Нажмите кнопку «Добавить», и выберите файл проекта, который хотите запустить.
Подробнее о том, где и как выполняется проект.
Последнее редактирование: