Advertisement
Guest User

Parser JJ

a guest
Apr 29th, 2022
2,576
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /* Парсер статей журнала "Журналист" (https://jrnlst.ru) */
  2.    // Записывает заголовки и ссылки на статьи в html-файл
  3.    // Написан на NodeJS с использованием модулей axios и jsdom
  4.  
  5. const axios = require('axios'); // Подключение модуля axios для скачивания страницы
  6. const fs = require('fs'); // Подключение встроенного в NodeJS модуля fs для работы с файловой системой
  7. const jsdom = require("jsdom"); // Подключение модуля jsdom для работы с DOM-деревом (1)
  8. const { JSDOM } = jsdom; // Подключение модуля jsdom для работы с DOM-деревом (2)
  9.  
  10. const pagesNumber = 162; // Количество страниц со статьями на сайте журнала на текущий день. На каждой странице до 18-ти статей
  11. const baseLink = 'https://jrnlst.ru/?page='; // Типовая ссылка на страницу со статьями (без номера в конце)
  12. var page = 0; // Номер первой страницы для старта перехода по страницам с помощью пагинатора
  13. var parsingTimeout = 0; // Стартовое значение задержки следующего запроса (увеличивается с каждым запросом, чтобы не отправлять их слишком часто)
  14.  
  15. function paginator() {
  16.    function getArticles() {
  17.          var link = baseLink + page; // Конструктор ссылки на страницу со статьями для запроса по ней
  18.          console.log('Запрос статей по ссылке: ' + link); // Уведомление о получившейся ссылке
  19.          // Запрос к странице сайта
  20.          axios.get(link)
  21.             .then(response => {
  22.                var currentPage = response.data; // Запись полученного результата
  23.                const dom = new JSDOM(currentPage); // Инициализация библиотеки jsdom для разбора полученных html-данных как в браузере
  24.                // Определение количества ссылок на странице, потому что оно у них не всегда фиксированное. Эта цифра понадобится в цикле ниже
  25.                var linksLength = dom.window.document.getElementById('block-views-articles-latest-on-front-block').getElementsByClassName('view-content')[0].getElementsByClassName('flex-teaser-square').length;
  26.                // Перебор и запись всех статей на выбранной странице
  27.                for (i = 0; i < linksLength; i++) {
  28.                   // Получение относительных ссылок на статьи (так в оригинале)
  29.                   var relLink = dom.window.document.getElementById('block-views-articles-latest-on-front-block').getElementsByClassName('view-content')[0].getElementsByClassName('flex-teaser-square')[i].getElementsByClassName('views-field views-field-title')[0].getElementsByTagName('a')[0].outerHTML;
  30.                   // Превращение ссылок в абсолютные              
  31.                   var article = relLink.replace('/', 'https://jrnlst.ru/') + '<br>' + '\n';
  32.                   // Уведомление о найденных статьях
  33.                   console.log('На странице ' + 'найдена статья: ' + article);      
  34.                   // Запись результата в файл
  35.                   fs.appendFileSync('ПУТЬ/articles.html', article, (err) => {
  36.                      if (err) throw err;
  37.                   });
  38.                };
  39.                if (page > pagesNumber) {
  40.                   console.log('Парсинг завершён.')}; // Уведомление об окончании работы парсера
  41.             });
  42.          page++; // Увеличение номера страницы для сбора данных, чтобы следующий запрос был на более старую страницу
  43.    };
  44.    for (var i = page; i <= pagesNumber; i++) {  
  45.          var getTimer = setTimeout(getArticles, parsingTimeout); // Запуск сбора статей на конкретной странице с задержкой
  46.          parsingTimeout += 5000; // Определение времени, через которое начнётся повторный запрос (к следующей по счёту странице)
  47.    };
  48.    return; // Завершение работы функции
  49. };
  50. paginator(); // Запуск перехода по страницам и сбора статей
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement