Advertisement
Guest User

Untitled

a guest
Apr 29th, 2022
407
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /* Парсер статей рубрики "Код" портала Skillbox Media (https://skillbox.ru/media/code/) */
  2.    // Записывает заголовки и ссылки на статьи в html-файл
  3.    // Написан на NodeJS с использованием модулей axios и jsdom
  4.  
  5. const axios = require('axios'); // Подключаем к NodeJS модуль 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 = 101; // Количество страниц со статьями на сайте журнала на текущий день. На каждой странице по 7 статей
  11. var page = 1; // Номер первой страницы для старта перехода по страницам с помощью пагинатора
  12. var parsingTimeout = 0; // Стартовое значение задержки следующего запроса (увеличивается с каждым запросом, чтобы не отправлять их слишком часто)
  13.  
  14. // Определяем стартовые параметры запроса (меняться будет только номер страницы)
  15. var params = new URLSearchParams();
  16.    params.append('params[SECTION_ID]', '10');
  17.    params.append('params[CODE_EXCLUDE]', 'news');
  18.    params.append('params[FIRST_IS_FULL]', 'Y');
  19.    params.append('params[COUNT]', '7');
  20.    params.append('params[PAGE_NUM]', '1');
  21.    params.append('params[FIELDS][]', 'PROPERTY_FAKE_COUNTER');
  22.    params.append('params[CACHE_TYPE]', 'A');
  23.    params.append('params[COMPONENT_TEMPLATE]', 'articles');
  24.  
  25. function paginator() {
  26.    function getArticles() {
  27.       console.log('Запрос статей со страницы ' + params.get('params[PAGE_NUM]')); // Уведомление о номере текущей страницы
  28.       // Запрос к странице сайта
  29.       axios.post('https://skillbox.ru/local/ajax/getArticlesIndex.php?', params)
  30.          .then(response => {
  31.             var currentPage = response.data; // Запись полученного результата
  32.             var jsonToHtml = currentPage.html; // Получаем из JSON-ответа только html-код
  33.             const dom = new JSDOM(jsonToHtml); // Инициализация библиотеки jsdom для разбора полученных html-данных как в браузере
  34.             // Парсинг закреплённой статьи
  35.                var pinnedHeaderSpaces = dom.window.document.getElementsByClassName('important-block__main-title')[0].innerHTML; // Получение заголовка закреплённой статьи с лишними пробелами
  36.                var pinnedHeader = pinnedHeaderSpaces.trim(); // Заголовок закреплённой статьи с удалёнными лишними пробелами
  37.                var pinnedLink = dom.window.document.getElementsByClassName('important-block__main-title')[0].getAttribute('href'); // Получение относительной ссылки на закреплённую статью
  38.                var pinnedArticle = '<a href="https://skillbox.ru' + pinnedLink + '">' + pinnedHeader + '</a><br>'+ '\n'; // Итоговая ссылка с заголовком закреплённой статьи
  39.                console.log('На странице найдена закреплённая статья: ' + pinnedArticle);
  40.                // Запись закреплённой статьи в файл
  41.                fs.appendFileSync('ПУТЬ/articles.html', pinnedArticle, (err) => {
  42.                   if (err) throw err;
  43.                });
  44.            
  45.             // Парсинг остальных 6-ти статей на странице
  46.             var articlesNumber = dom.window.document.getElementsByClassName('media-catalog__tile-title').length; // Определение количества ссылок на странице, потому что на последней странице их меньше. Эта цифра понадобится в цикле ниже
  47.             for (var art = 0; art < articlesNumber; art++) {
  48.                var articleHeaderSpaces = dom.window.document.getElementsByClassName('media-catalog__tile-title')[art].innerHTML; // Получение заголовка статьи с лишними пробелами
  49.                var articleHeader = articleHeaderSpaces.trim(); // Заголовок статьи с удалёнными лишними пробелами
  50.                var articleLink = dom.window.document.getElementsByClassName('media-catalog__tile')[art].getElementsByClassName('media-catalog__tile-title')[0].parentElement.getAttribute('href'); // Получение относительной ссылки на статью
  51.                var article = '<a href="https://skillbox.ru' + articleLink + '">' + articleHeader + '</a><br>'+ '\n'; // Итоговая ссылка с заголовком статьи
  52.                console.log('На странице найдена статья: ' + article);
  53.                // Запись статьи в файл
  54.                fs.appendFileSync('ПУТЬ/articles.html', article, (err) => {
  55.                   if (err) throw err;
  56.                });
  57.             };
  58.             if (page > pagesNumber) {
  59.                console.log('Парсинг завершён.'); // Уведомление об окончании работы парсера
  60.             };
  61.          });
  62.       page++; // Увеличение номера страницы для сбора данных, чтобы следующий запрос был на более старую страницу
  63.       params.set('params[PAGE_NUM]', page);
  64.       return;
  65.    };
  66.    for (var i = page; i <= pagesNumber; i++) {  
  67.          var getTimer = setTimeout(getArticles, parsingTimeout); // Запуск сбора статей на конкретной странице с задержкой
  68.          parsingTimeout += 10000; // Определение времени, через которое начнётся повторный запрос (к следующей по счёту странице)
  69.    };
  70.    return;
  71. };
  72. paginator(); // Запуск перехода по страницам и сбора статей
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement