/** * Скрипт для парсинга значков Steam * @version 1.0.0 * @license Unlicense * @author Alexander Popov */ /** * Получает данные из элемента `div.badge_row` * @param {Array} value - div.badge_row * @returns {Object} */ function getData(value) { /* * Sctruct of Badge * id: int - steam app id * url: str - game url in store * card_url: str - card page url * name: str - steam app name * dropLeft: int - cards left drops */ // check left cards // для карточек, у которых нет параметра 'карточек выпадет' let cardsDropLeft = 0; if (value.getElementsByClassName('progress_info_bold').length > 0) { cardsDropsNumber = value.getElementsByClassName('progress_info_bold')[0].innerText.match(/\d/g); if (cardsDropsNumber !== null) { cardsDropLeft = [0]; } } let badgeItem = { id: parseInt(value.childNodes[1].href.split('/')[6]), url: `https://store.steampowered.com/app/${value.childNodes[1].href.split('/')[6]}/`, card_url: value.childNodes[1].href, name: value.getElementsByClassName('badge_title')[0].childNodes[0].textContent.replace(/[\r\n\t]/g, '').trim(), dropLeft: parseInt(cardsDropLeft), }; return badgeItem; } /** * Преобразовывает массив данных в JSON и возвращает к консоль * @param {Array} badgesArray - массив данных о значках */ function exportJson(badgesArray) { const byteSize = str => new Blob([str]).size; json = JSON.stringify(badgesArray); console.log(json); console.log(`Total records: ${badgesArray.length}.`); console.log(`Size: ${byteSize(json)} bytes.`) } /** * Функция main() */ function getBadges() { let badges = []; let currentPage = 1; // get total pages const [baseURI, totalPages] = (function(element) { return [ element[0].baseURI, element[element.length - 1].text ]; })(document.getElementsByClassName('pagelink')); while (currentPage <= totalPages) { fetch(`${baseURI}?p=${currentPage}`) .then((response) => { return response.text(); }) .then((html) => { let parser = new DOMParser(); let doc = parser.parseFromString(html, 'text/html'); const collection = doc.getElementsByClassName('badge_row'); for (const value of Object.entries(collection)) { badges.push(getData(value[1])); } }) .catch((err) => console.warn('Something went wrong.', err)); currentPage++; } setTimeout(() => { exportJson(badges); }, 10000); // FIX IT } getBadges();