1. Вступайте в наш Telegram чат: https://t.me/a_parser Нас уже 800+ и мы растем!
    Скрыть объявление

Парсинг lite выдачи Яндекса

Анализ парсинга lite выдачи Яндекса и сравнение со стандартной

Метки:
  1. Support Юра
    В данной статье рассмотрен пример создание парсера, для сбора информации с lite версии поисковика Яндекс.

    Не так давно, один из ключевых разработчиков и руководителей Яндекса Виталий Харисов, в своей лекции под названием «10к» рассказал о лёгкой версии поиска для медленных соединений и способы оптимизации кода, позволяющие уложиться в 10 килобайт. Суть сводилась к тому, что на основании доклада под названием «10к», который был составлен компанией Microsoft возникла идея создания версии сайта, для устройств на которых по разным причинам используется медленное соединение сети интернет.
    Код HTML, который получает пользователь, согласно условиям, должен составлять, порядка 14 Кб. Это максимальный лимит, установленный для легкой версии. Для просмотра lite версии, в адресную строку браузера нужно добавить параметр lite. Подробности здесь.

    Учитывая вышесказанное, появилась идея протестировать данную версию сайта с помощью нашего парсера. Для этого мы напишем JS парсер lite выдачи и сравним его производительность со стандартным. Для облегчения задачи и исключения влияния сторонних сервисов мы не будем использовать антигейт.

    Написание парсера

    Для написания парсера проведем анализ выдачи lite версии Яндекс. Переходим по ссылке https://yandex.ua/search/?text=тест&lite=1. Мы видим обычную выдачу яндекса, только параметр lite в строке браузера говорит нам про то, что мы попали на «легкую» версию. Для просмотра дополнительных параметров воспользуемся «расширенным поиском».
    [​IMG]
    Здесь мы видим дополнительные параметры, которые можно задавать для поиска, для нас важно, что все они передаются через указание в строке запросов браузера. Выберем для себя следующие:
    • Указание региона для поиска (установим, как Region);
    • Язык поиска (установим, как Language);
    • Количество результатов вывода на страницу (установим, как Links per page);
    • Количество страниц поиска (установим, как PageCount);
    Также добавим возможность выбора домена для поиска, дополнительно установив параметр «Yandex domain».
    Код:
    this.editableConf = [
             ['page_count', ['combobox', 'PageCount', ['1', '1'], ['2', '2'], ['3', '3'], ['4', '4'], ['5', '5'], ['6', '6'], ['7', '7'], ['8', '8'], ['9', '9'], ['10', '10']]],
             ['str', ['combobox', 'Region'].concat([['', 'Based on IP']], tools.data.YandexWordStatRegions.map(
                    (el) => [el[1], el[0]]
                ))],
             ['linksperpage',
                    ['combobox', 'Links per page',
                        [10, '10'],
                        [20, '20'],
                        [30, '30'],
                        [50, '50'],
                    ],
                ],
                ['lang',
                    ['combobox', 'Language',
                        ['', 'Any'],
                        ['ru', 'Russian'],
                        ['en', 'English'],
                        ['be', 'Belorussian'],
                        ['fr', 'French'],
                        ['de', 'German'],
                        ['id', 'Indonesian'],
                        ['kk', 'Kazakh'],
                        ['tt', 'Tatar'],
                        ['tr', 'Turkish'],
                        ['uk', 'Ukrainian'],
                    ],
                ],
             ['domain',
                    ['combobox', 'Yandex domain',
                        ['yandex.ru', 'yandex.ru'],
                        ['yandex.ua', 'yandex.ua'],
                        ['yandex.by', 'yandex.by'],
                        ['yandex.kz', 'yandex.kz'],
                        ['yandex.com.tr', 'yandex.com.tr'],
                        ['yandex.com', 'yandex.com'],
                    ],
                ],
            ];
    
    С параметрами, пожалуй, достаточно, определим набор переменных, которые будем выводить в результаты парсинга. Сделаем вывод максимально приближенным к стандартному Яндекс парсеру. Определим следующие параметры:
    • Массив «Results array» который будет содержать набор анкоров, линков и сниппетов (установим, как $serp);
    • Массив «Releted array» который будет содержать список ключевых слов поиска (установим, как $ reletead);
    • Сделаем вывод общего количества результатов «TotalCount» (установим, как $ totalcount);
    Код:
    results: {
                    flat: [
                        ['totalcount', 'TotalCount']
                    ],
                    arrays: {
                        serp: ['Results array', [['anchor', 'Anchor'], ['link', 'Link'], ['snippet', 'Snippet']]],
                        releted: ['Releted array', [['releted', 'Releted']]],
                    }
                }
    
    Используя возможности JS в парсере, пишем код для получения необходимых данных.
    Код:
    let link = 'https://' + this.conf.domain + '/search/?&text=' + set.query + '&lite=1&p=' + i +'&lr=143&numdoc=' + this.conf.linksperpage +'&lang=' + this.conf.lang + '&rstr=-' + this.conf.str;
    Формируем ссылку для GET-запроса
    Код:
           let response = yield this.request('GET', link, {}, {
                          decode: 'auto-html',
                      });
    Запрос
    Код:
      let totalcountMatchContainer = response.data.match(/<div class="serp-adv__found.+?>(.+?)<\/div>/i);
            if (totalcountMatchContainer) {
                        let totalcountMatch = /(\d+)(?!.*\d).(млн|тыс|тис|million|thousand|milyon|bin)?/.exec(totalcountMatchContainer);
                        if (totalcountMatch) {
                            let mult = 1;
                            switch (totalcountMatch[2]) {
                                case 'млн':
                                case 'million':
                                case 'milyon':
                                    mult = 1000 * 1000;
                                    break;
                                case 'тыс':
                                case 'тис':
                                case 'thousand':
                                case 'bin':
                                    mult = 1000;
                                    break;
                            }
    
                            results.totalcount = parseInt(totalcountMatch[1]) * mult;
                        }
                    }
    Получаем значение общего количества результатов
    Код:
      let regexp = /class="link serp-item__title-link".+?tabindex=2>(.+?)<\/a><\/h2>.+?href="(.+?)".+?<div class=serp-item__text>(.+?)<\/div>/g;
            let match;
            while (match = regexp.exec(response.data)) {
               results.serp.push(match[1], match[2], match[3]);
            }
    Получаем значение в массив serp (линки, анкоры, сниппеты)
    Код:
    let regreleted = /a class=link href="\/search.+?">(.+?)<\/a><\/div>/g;
            let releted;
            results.releted = [];
                while ( releted = regreleted.exec(response.data)) {
                    results.releted.push(releted[1]);
                }
           }
    
    Получаем значение в массив связанных ключевых слов $releted
    В результате получаем готовое решение, которое будет иметь следующий интерфейс:
    [​IMG]
    Парсер доступен для загрузки в каталоге на нашем сайте: https://a-parser.com/resources/225/

    Анализ
    Протестировав созданный парсер со стандартным Яндекс, следует отметить следующие моменты:
    1. По скорости работы парсеры показали приблизительно равное время. Следовательно, в независимости от выдачи время парсинга не уменьшилось.
    2. Результаты выдачи, практически не отличаются друг от друга. Вся информация, которая есть в стандартном парсере присутствует и в lite версии.
    3. Важно отметить, что при тестировании парсера, в связи с тем, что не было реализовано возможность обхода капч на lite версии, довольно часто результат получить на удавалось.
    [​IMG]
    Было предположение, что капчи на этой версии не будут появляться так часто, как в стандартной версии Яндекса – увы предположение не подтвердилось.

    Итог
    Проанализировав и протестировав на реальных примерах выдачу lite версии можно уверено сказать, что она практически не отличается от стандартной выдачи. В то же время lite версия не имеет преимуществ по скорости работы и так, как и стандартная версия имеет защиту от парсинга в виде капч, которые появляются примерно с такой же регулярностью, как и в стандартной версии.
    Учитывая полученные результаты, можно сделать вывод, что обе выдачи Яндекса имеют примерно одинаковые характеристики, поэтому lite выдача будет полезна исключительно для пользователей с медленным инетом.
    d4k нравится это.