Яндекс.Объявления - делаем парсер своими руками (JSON, GetTraffic, Mobile version)

  • Автор темы Автор темы Mikhail B.
  • Дата начала Дата начала

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 449
Реакции
5 477
Баллы
113
яндекс объявления лого2.jpg

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

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

2020-12-14_012324.jpg



Часть 1. Сбор информации с основной страницы.

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

Отключаем все запросы кроме основных двух доменов яндекса:
Политика содержимого:
Развернуть Свернуть Копировать
o.yandex.ru
yastatic.net

Нам повезло и страница работает корректно. Это радует, т.к. мы серьезно облегчили нагрузку на траффик и шаблон.

2020-12-14_012511.jpg
2020-12-14_012715.jpg



Далее нам нужно скроллить страницу, я подумал, что пора использовать свайп в этом деле. Но решил использовать эмулятор клавиатуры и клавишу END, благо на этой мобильной версии работает клавиша END. Почему я это сделал? END перемещает страницу сразу вниз, это быстрее и эффективнее. А супер эмуляция нам в данном случае не нужна, ведь мы просто собираем данные, тут важнее интервалы нежели поведенческие факторы))

Эмуляция клавиатуры:
Развернуть Свернуть Копировать
{END}{UP}{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

2020-12-14_022847.jpg

И так! В одном ответе от сервера мы получаем порядка 70 объявлений. Интервалы между скроллами установлены 0.5-0.7 сек + время на обработку. Получается достаточно внушительная скорость для однопотока!

Что бы посмотреть на распаршенные данные, то нужно кликнуть на JSON в переменных. Не малый объем информации, которая уже ждет пока ее спарсят =)

2020-12-14_021512.jpg


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

JSON:
Развернуть Свернуть Копировать
{-Json.data.homepage.listing.snippets[{-Variable.Count_1-}].address.region.name-}}

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

2020-12-14_025759.jpg



В целом основные моменты описаны. Сам проект прикреплен к статье и полностью актуален на момент ее выхода. Многопотока нету причине крайне малого кол-ва объявлений. Возможно в будущем оно будет расти, но с какой скоростью предугадать сейчас достаточно сложно, тем более такие гиганты как Авито и Юла никуда не денутся. Видимо сервис Яндекс объявления задумывался как перспектива на года вперед. Новые поколения возможно выберут яндекс, а пока что не суетимся, т.к. человек не склонен менять привычные ему вещи, а что может быть привычнее авито))


Часть 3. Парсим телефоны.

Телефон появляется после клика по надписи "Позвонить"

2020-12-14_135656.jpg


После клика появляется запрос, который собираем описанным ранее методом 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**"}}}

Далее в цикле проверяем все ссылки и записываем в таблицу.

По началу мне показалось, что в сервисе мало номеров. Но как оказалось они есть в достаточном количестве

2020-12-14_143107.jpg



Заключение

На сайте еще осталась информация которую мы не спарсили. Это "Открытая личка", "Защищеный телефон", "Дата публикации", "Кол-во просмотров" и т.д. Можно было бы и ее спарсить, только в чем тогда смысл статьи если не дать возможности читателям попрактиковаться. Дерзайте! ;-)

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

Вложения

Последнее редактирование:
Я бы сказал, что, все совсем наоборот. Мобильная версия + запросы = автомат Калашникова. У Яндекса, кстати, намного проще, чем на том же Авито все реализовано + можно использовать ipv6.
 
  • Спасибо
Реакции: DenisK
Я бы сказал, что, все совсем наоборот. Мобильная версия + запросы = автомат Калашникова. У Яндекса, кстати, намного проще, чем на том же Авито все реализовано + можно использовать ipv6.
Куки контейнер не работает для яндекс объявлений. А собирать куки вручную это тихий ужас + есть параметры которые не смог найти. Например i
Попробуй если тебе по "фану", мне нет))


Cookie:
Развернуть Свернуть Копировать
Cookie: yandexuid=3172956191607906636; csrfmiddlewaretoken=692fccef15604068cc70e8c4964e3726342e8e2b639937bb; i=G7bZTXocuGOwaK/RdPsLLJ9Dn3fbKzS2Vg2uznvE5FafAy+WjHBS1703LDsPxPHROb6q4G54UfMZz70tEi9bQyXpgwI=; yuidss=3172956191607906636; ymex=1923266637.yrts.1607906637#1923266637.yrtsi.1607906637; gdpr=0; _ym_uid=1607906638893052966; _ym_d=1607906638; mda=0; _ym_isad=2; _ym_visorc_26812653=b; _ym_visorc_66976462=b; is_gdpr=0; is_gdpr_b=CLbaBhCDEg==
 
  • Спасибо
Реакции: Alexmd
Михаил, спалил тему! Ну за-а-аче-е-е-м!!! )))
 
  • Спасибо
Реакции: Mikhail B.
потестил - круто) но только по главной в регионе.

сейчас попытался спарсить выборку из категории и залип))
ajax/getHomepage там не прокатывает, как я понял, выдача там формируется из разных категорий + добавляется соль.
как вытягивать карточки пока не пойму))
69242
 
  • Спасибо
Реакции: Mikhail B.
как я понял, выдача там формируется из разных категорий + добавляется соль
Объявлений очень мало, и они так видимо решили схитрить))
Могу только предложить из списка удалять строки не соответствующие регулярным выражениям.
Либо тупо парсить все и потом в екселе сортировать, благо там объявлений не много.
 
  • Спасибо
Реакции: deukech
В целом - да. Именно этим сейчас шаб и занят.
Добавил паузу перед сбором данных - вообще безотказно работает

69246
 
  • Спасибо
Реакции: Mikhail B.
Отличная тема для парсинга яндекс обьявления. Давно искал наконец нашол.
 
Последнее редактирование:
  • Спасибо
Реакции: Gavrosh
Отлично. Будет больше трафа. Даже не знал про этот сервис
 
Последнее редактирование:
  • Спасибо
Реакции: Mikhail B.
Думал на днях замутить скапер, а тут уже кто-то все сделал вместо меня.
 
Последнее редактирование:
  • Спасибо
Реакции: Mikhail B.
мой голос за тебя тоже) спасибо за работу
 
  • Спасибо
Реакции: Mikhail B.
а какое направление после парсинга данных? Что делать с этой информацией, какие есть варианты?
 
Впаривать.

Никогда не понимал подобных вопросов клиентов. "А для чего продаете парсер?" Че сразу не спрашивают, слей пожалуйста кейс, а я куплю у тебя софт. А то эти наводящие вопросы))
 
Последнее редактирование:
  • Спасибо
Реакции: Gfoblin
А как узнать что именно по этому URL "https://o\.yandex\.ru/-/ajax/getOfferPhone/" будут передаваться нужные запросы, если мне нужно будет это использовать на других ресурсах, как мне получить похожий урл?
 
А как узнать что именно по этому URL "https://o\.yandex\.ru/-/ajax/getOfferPhone/" будут передаваться нужные запросы, если мне нужно будет это использовать на других ресурсах, как мне получить похожий урл?
Смотреть монитор трафика при скролле страницы.
 
  • Спасибо
Реакции: seregakot и Dmitriy Ka
а какое направление после парсинга данных? Что делать с этой информацией, какие есть варианты?
прочекайте на ватсап, вайбер не знаю и спамьте офферами)
 
  • Спасибо
Реакции: Mikhail B.
Да чисто теоретически, впаривается по холодным звонкам?
Не знаю. Я терпеть не могу холодные звонки, как и 90% людей. Не знаю что такого надо предложить, что бы стало интересно человеку
 
Да чисто теоретически, впаривается по холодным звонкам?
берешь звонобота, пишешь скрипт диалога и навлекаешь на себя потоки ненависти и фекалий)))
но конверт есть, говорят)
 
Не знаю. Я терпеть не могу холодные звонки, как и 90% людей. Не знаю что такого надо предложить, что бы стало интересно человеку
ну например:
объява - SEO продвижение и мне звонит девушка и говорит тексты пишу невъеб...е, интересно? Даааа...)
 
  • Спасибо
Реакции: Mikhail B.
а это никак не смущает?
73364
 

Кто просматривает тему: (Всего: 0, Пользователи: 0, Гости: 0)