В данной статье рассмотрим возможность получение результатов в парсере, созданному с помощью языка программирования JavaScript, без использования готовых парсеров. В парсере предусмотрим проход по страницам и отбор нужных данных. Для решения такой задачи, в A-Parser предусмотрена функция this.request работу которой попробуем раскрыть дальше на примере создания парсера для сайта https://habrahabr.ru/all/.
Разработку парсера начнем с определения конструктора результатов, в котором укажем необходимые сущности:
Полный код конструктора будет выглядеть так:
- version — версия парсера;
- results: {arrays: {serp: ['List', [['link', 'Link'], ['name', 'Name']]]}} — структура массива с результатами, в который будем помещать полученные результаты
- results_format: "$serp.format('$link - $name\\n')" — определим вывод результатов по умолчанию
- page_count: '5' — зададим по умолчанию значение переменной. Это значение можно будет менять через пользовательский интерфейс
- 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']]]] — значение, которое можно устанавливать через пользовательский интерфейс. Имеет вид выпадающего списка со значениями (в данном случаи количество страниц которое нужно пользователю)
После создания конструктора, переходим в основную функцию parse. Согласно документации, для получение HTTP ответа по запросу нужно использовать функцию yield this.request. В качестве аргументов нужно указать:Код:constructor() { this.defaultConf = { version: '0.1.3', results: { arrays: { serp: ['List', [['link', 'Link'], ['name', 'Name']]] } }, results_format: "$serp.format('$link - $name\\n')", parsecodes: { 200: 1, }, page_count: '5' }; 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']]] ]; }
В нашем случаи, нужно ещё предусмотреть проход по страницам. Поэтому создаем следующие переменные:
- method
- url
- хэш с query параметрами
- хэш с опциями запроса
После определения переменных, строим логику работы:
- i — рабочая переменная в которой будет хранится значение текущей страницы;
- link — переменная в которой будет хранится ссылка (url);
- set.query — переменная с запросом (по умолчанию у нас запрос на сайт «https://habrahabr.ru/all/»);
- response — переменная в которую будет помещен результат с ответом от сервера
Проверяем успешность ответа от сервера:
- for(let i = 1; i<=this.conf.page_count; i++) - используем цикл для прохода по страницам;
- let link = set.query + 'page' + i; - формируем url;
- let response = yield this.request('GET', link, {}, {decode: 'utf8',}) - получаем ответ по запросу в переменную "response". Здесь упущены дополнительные параметры для запроса, но указана опция "decode" - которая определяет кодировку в которой приходит страница. Опций можно указывать больше чем одну, разделяя их запятыми.
В случаи неудачи, выводим сообщение в лог «Error open page». Если ответ успешный, продолжаем работу.Код:if(!response.success) { this.logger.put('Error open page'); success = 0; break; }
Проверяем полученный массив результатов:
Если массива не существует, выбираем с помощью регулярных выражений интересующие нас данные с переменной «response.data» и заполняем наш массив:Код:«if(results.serp !== undefined)»
На этом создание парсера завершено. В результат мы получаем массив «serp» - в котором собраны данные в виде "ссылка — название статьи", значения "$link - $name" которые мы указали в конструкторе.Код:let regexp = /<h2 class="post__title">\n\s+<a href="(.+?)"\sclass="post__title_link">(.+?)<\/a>/g; let res; while (res = regexp.exec(response.data)) { results.serp.push(res[1], res[2]); }
Полный код парсера можно посмотреть в каталоге.
В данном обзоре была рассмотрена очередная возможность, которая доступна средствами JavaScript в A-Parser. Используя конструкцию "yield this.request", можно получать HTTP ответ по запросу.
-
Вступайте в наш Telegram чат: https://t.me/a_parser Нас уже 2600+ и мы растем!Скрыть объявление
Создание JS парсеров. Парсинг сайта с проходом по страницах
Рассмотрен пример парсинга сайта по запросу с переходом по страницах