Создание JS парсеров. Получение результатов от стандартного парсера

Пример получения результатов от готового парсера внутри JS парсера

  1. Support Юра
    Трудно представить себе универсальный парсер, который подходил бы под решения любых, сколько угодно сложных задач. Такого решения нет, и быть не может. Каждая задача по своему уникальная и требует индивидуального подхода. По этому вопрос надо ставить по другому. Есть ли инструмент, который может решать разноплановые задачи благодаря широкому набору инструментов и гибкости настройки? Попробуем дать ответ на этот вопрос.

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

    Рассмотрим пошаговый пример создания парсера средствами JavaScript. Поставим себе задание: создать парсер, который будет обращаться к стандартному парсеру, получать от него данные и будет делать поиск по полученным результатам нужной нам информации, а после выводить результат в удобном виде.

    Согласно документации, определим структуру парсера.

    В конструкторе класса "class Parser" => "constructor()" - задаем параметры по умолчанию. Здесь определяем:
    version — версию нашего парсера;
    results — определяем переменные и массивы с возможными результатами, которые будем получать в результате работы парсера. В нашем случае определим:
    • переменную flat:[['count', 'Count']] — количество результатов;
    • массив arrays: {serp: ['List', [['link', 'Link']]]} — массив ссылок;
    Далее определим значение, которые будем выводить по умолчанию:
    • results_format: "Количество результатов: $count\\n$serp.format('$link\\n')" — значение которые будут выводится по умолчанию;
    • SE_Bing_preset: 'default' — пресет который будет стоять по умолчанию;
    • this.editableConf = [ ['SE_Bing_preset', ['combobox', 'SE::Bing']],] - параметры, значение которых можно выбирать через интерфейс и передавать в парсер.
    Полностью конструктор будет иметь такой вид:
    Код:
        constructor() {
            this.defaultConf = {
                version: '0.1.198',
                results: {
                    flat: [
                        ['count', 'Count']
                    ],
                    arrays: {
                        serp: ['List', [['link', 'Link']]]
                    }
                },
                results_format: "Количество результатов: $count\\n$serp.format('$link\\n')",
                SE_Bing_preset: 'default'
            };
    
            this.editableConf = [['SE_Bing_preset', ['combobox', 'SE::Bing']]];
        }
    
    
    Все действия происходят в функции «Parse», который представляет собой генератор, и на любую блокирующую операцию должен возвращать yield (это основное и единственное отличие от обычной функции). Особенность метода:
    • Метод вызывается для каждого запроса поступившего в обработку;
    • Передается set (хэш с запросом и его параметрами) и results (пустая заготовка для результатов);
    • Необходимо обязательно вернуть заполненный results, предварительно выставив флаг success
    Для получения результатов от другого, стандартного парсера воспользуемся yield this.parser.request. В качестве аргументов указываем название парсера, название пресета, запрос:
    Код:
    let response = yield this.parser.request('SE::Bing', this.conf.SE_Bing_preset, set.query);
    Далее обрабатываем полученный массив результатов:
    1. if(response.info.success == true) — проверяем ответ сервера
    2. Забираем анкоры с массива «response.serp» и проверяем на вхождение в анкор запроса «set.query». После проверки, помещаем значение в массив с результатами «results.serp.push(response.serp)». В переменную «results.count», помещаем количество найденных совпадений. Полный код будет выглядит так:
    Код:
    if(response.info.success==true) {
            results.count = 0;
            for(let i=1; i<response.serp.length; i+=3){
                   if(response.serp[i].match(set.query)){
                       if(results.serp !== undefined)
                          results.serp.push(response.serp[i]);
                          results.count++;
                   }
                }
            }
    
    3. Обязательно заполняем флаг success, чтобы сообщать A-Parser об "успешной" обработки запроса:
    Код:
    results.success = response.info.success
    После запуска парсера получаем результат:
    [​IMG]
    Полный код парсера можно посмотреть в каталоге.

    В данной статье мы рассмотрели пример создания парсера, средствами языка программирования JavaScript. В примере мы увидели как можно получать результаты от готового парсера и манипулируя параметрами, обрабатывать полученные данные. Используя данный набор инструментов можно получать данные с разных стандартных парсеров которые есть в A-Parser. Возможность манипулирования полученными данными и представление результатов в какой угодно форме, показывает всю ширину возможностей которые получает пользователь используя этот функционал.
    zbest нравится это.