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

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 418
Благодарностей
5 454
Баллы
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 летней давности. По факту на форуме есть практически все что нужно, что бы написать любой проект, главное правильно искать. На данной ноте предлагаю закруглится и благодарю всех за прочтение.
 
Тема статьи
Парсинг
Номер конкурса статей
Четырнадцатый конкурс статей

Вложения

Для запуска проектов требуется программа ZennoPoster или ZennoDroid.
Это основное приложение, предназначенное для выполнения автоматизированных шаблонов действий (ботов).
Подробнее...

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

Последнее редактирование:

Alexmd

Client
Регистрация
10.12.2018
Сообщения
1 022
Благодарностей
1 424
Баллы
113
Я бы сказал, что, все совсем наоборот. Мобильная версия + запросы = автомат Калашникова. У Яндекса, кстати, намного проще, чем на том же Авито все реализовано + можно использовать ipv6.
 
  • Спасибо
Реакции: DenisK

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 418
Благодарностей
5 454
Баллы
113
Я бы сказал, что, все совсем наоборот. Мобильная версия + запросы = автомат Калашникова. У Яндекса, кстати, намного проще, чем на том же Авито все реализовано + можно использовать 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

one

Client
Регистрация
22.09.2015
Сообщения
6 833
Благодарностей
1 275
Баллы
113
Михаил, спалил тему! Ну за-а-аче-е-е-м!!! )))
 
  • Спасибо
Реакции: Mikhail B.

Kedr

Client
Регистрация
31.08.2016
Сообщения
42
Благодарностей
27
Баллы
18

deukech

Client
Регистрация
11.09.2014
Сообщения
136
Благодарностей
62
Баллы
28
однозначно, лайк!
 
  • Спасибо
Реакции: Mikhail B.

deukech

Client
Регистрация
11.09.2014
Сообщения
136
Благодарностей
62
Баллы
28
потестил - круто) но только по главной в регионе.

сейчас попытался спарсить выборку из категории и залип))
ajax/getHomepage там не прокатывает, как я понял, выдача там формируется из разных категорий + добавляется соль.
как вытягивать карточки пока не пойму))
69242
 
  • Спасибо
Реакции: Mikhail B.

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 418
Благодарностей
5 454
Баллы
113
как я понял, выдача там формируется из разных категорий + добавляется соль
Объявлений очень мало, и они так видимо решили схитрить))
Могу только предложить из списка удалять строки не соответствующие регулярным выражениям.
Либо тупо парсить все и потом в екселе сортировать, благо там объявлений не много.
 
  • Спасибо
Реакции: deukech

deukech

Client
Регистрация
11.09.2014
Сообщения
136
Благодарностей
62
Баллы
28

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 418
Благодарностей
5 454
Баллы
113

deukech

Client
Регистрация
11.09.2014
Сообщения
136
Благодарностей
62
Баллы
28
В целом - да. Именно этим сейчас шаб и занят.
Добавил паузу перед сбором данных - вообще безотказно работает

69246
 
  • Спасибо
Реакции: Mikhail B.

Zennovods

Client
Регистрация
11.02.2019
Сообщения
212
Благодарностей
126
Баллы
43
лайк, голос!
 
  • Спасибо
Реакции: Mikhail B.

taxiars

Client
Регистрация
03.09.2014
Сообщения
12
Благодарностей
24
Баллы
18
Отличная тема для парсинга яндекс обьявления. Давно искал наконец нашол.
 
Последнее редактирование:
  • Спасибо
Реакции: Gavrosh

Gavrosh

Client
Регистрация
08.10.2016
Сообщения
65
Благодарностей
21
Баллы
8
Регистрация
01.10.2018
Сообщения
2
Благодарностей
2
Баллы
3
Отлично. Будет больше трафа. Даже не знал про этот сервис
 
Последнее редактирование:
  • Спасибо
Реакции: Mikhail B.

andrewsoft

Client
Регистрация
21.07.2016
Сообщения
13
Благодарностей
3
Баллы
3
Думал на днях замутить скапер, а тут уже кто-то все сделал вместо меня.
 
Последнее редактирование:
  • Спасибо
Реакции: Mikhail B.

OlegR

Client
Регистрация
11.06.2015
Сообщения
240
Благодарностей
250
Баллы
63
мой голос за тебя тоже) спасибо за работу
 
  • Спасибо
Реакции: Mikhail B.

mrstorm

Client
Регистрация
16.04.2015
Сообщения
205
Благодарностей
14
Баллы
18
а какое направление после парсинга данных? Что делать с этой информацией, какие есть варианты?
 

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 418
Благодарностей
5 454
Баллы
113
  • Спасибо
Реакции: mrstorm

Gfoblin

Client
Регистрация
30.05.2013
Сообщения
4 596
Благодарностей
1 014
Баллы
113

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 418
Благодарностей
5 454
Баллы
113
Впаривать.

Никогда не понимал подобных вопросов клиентов. "А для чего продаете парсер?" Че сразу не спрашивают, слей пожалуйста кейс, а я куплю у тебя софт. А то эти наводящие вопросы))
 
Последнее редактирование:
  • Спасибо
Реакции: Gfoblin

Dmitriy Ka

Client
Регистрация
03.05.2016
Сообщения
734
Благодарностей
485
Баллы
63
А как узнать что именно по этому URL "https://o\.yandex\.ru/-/ajax/getOfferPhone/" будут передаваться нужные запросы, если мне нужно будет это использовать на других ресурсах, как мне получить похожий урл?
 

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 418
Благодарностей
5 454
Баллы
113
А как узнать что именно по этому URL "https://o\.yandex\.ru/-/ajax/getOfferPhone/" будут передаваться нужные запросы, если мне нужно будет это использовать на других ресурсах, как мне получить похожий урл?
Смотреть монитор трафика при скролле страницы.
 
  • Спасибо
Реакции: seregakot и Dmitriy Ka

Zennovods

Client
Регистрация
11.02.2019
Сообщения
212
Благодарностей
126
Баллы
43
  • Спасибо
Реакции: Mikhail B.

Gfoblin

Client
Регистрация
30.05.2013
Сообщения
4 596
Благодарностей
1 014
Баллы
113

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 418
Благодарностей
5 454
Баллы
113
Да чисто теоретически, впаривается по холодным звонкам?
Не знаю. Я терпеть не могу холодные звонки, как и 90% людей. Не знаю что такого надо предложить, что бы стало интересно человеку
 

deukech

Client
Регистрация
11.09.2014
Сообщения
136
Благодарностей
62
Баллы
28
Да чисто теоретически, впаривается по холодным звонкам?
берешь звонобота, пишешь скрипт диалога и навлекаешь на себя потоки ненависти и фекалий)))
но конверт есть, говорят)
 

Zennovods

Client
Регистрация
11.02.2019
Сообщения
212
Благодарностей
126
Баллы
43
Не знаю. Я терпеть не могу холодные звонки, как и 90% людей. Не знаю что такого надо предложить, что бы стало интересно человеку
ну например:
объява - SEO продвижение и мне звонит девушка и говорит тексты пишу невъеб...е, интересно? Даааа...)
 
  • Спасибо
Реакции: Mikhail B.

Gfoblin

Client
Регистрация
30.05.2013
Сообщения
4 596
Благодарностей
1 014
Баллы
113

serg1208

Client
Регистрация
17.04.2018
Сообщения
331
Благодарностей
15
Баллы
18
а это никак не смущает?
73364
 

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