61 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			61 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
const fs = require('fs');
 | 
						||
const path = require('path');
 | 
						||
 | 
						||
const requestUtils = require('../utils/requestUtils');
 | 
						||
 | 
						||
const TEMP_MODULE_PATH = path.join(__dirname, 'temp');
 | 
						||
const DATA_PATH = path.join(__dirname, 'data');
 | 
						||
 | 
						||
/**
 | 
						||
 * 获取 html
 | 
						||
 */
 | 
						||
async function getHtml(url) {
 | 
						||
    // let html = fs.readFileSync("songlist");
 | 
						||
    let html = await requestUtils.getApiResult(url, {
 | 
						||
        gzip: true,
 | 
						||
    });
 | 
						||
    return html;
 | 
						||
}
 | 
						||
 | 
						||
/**
 | 
						||
 * 正则匹配出JSON
 | 
						||
 */
 | 
						||
function getData(html, index = 0) {
 | 
						||
    // 首先匹配出 window.__NUXT__
 | 
						||
    let script = /<script>window.__NUXT__=(.*?);<\/script>/.exec(html)[1];
 | 
						||
 | 
						||
    // 然后将该匿名函数作为模块引入,取得解析后的JSON
 | 
						||
    let tempModule = `${TEMP_MODULE_PATH}/temp_module_${index}.js`;
 | 
						||
    fs.writeFileSync(tempModule, `exports.data=${script};`);
 | 
						||
    try {
 | 
						||
        let data = require(tempModule);
 | 
						||
        // console.log(data);
 | 
						||
        // data 下有分类 和 歌单信息 这里只取歌单信息部分
 | 
						||
        return data.data.data[0].listData;
 | 
						||
    } catch (err) {
 | 
						||
        console.error(err);
 | 
						||
    } finally {
 | 
						||
        fs.rmSync(tempModule);
 | 
						||
    }
 | 
						||
}
 | 
						||
 | 
						||
async function main() {
 | 
						||
    let currentPage = 1;
 | 
						||
    let haveMore = true;
 | 
						||
    while (haveMore) {
 | 
						||
        let url = `https://music.91q.com/songlist?pageNo=${currentPage}`;
 | 
						||
        console.log(url);
 | 
						||
        let html = await getHtml(url);
 | 
						||
        fs.writeFileSync(`${DATA_PATH}/songlist-html-${currentPage}.html`, html);
 | 
						||
        console.log("get html done.");
 | 
						||
 | 
						||
        let data = getData(html, currentPage);
 | 
						||
        fs.writeFileSync(`${DATA_PATH}/songlist-data-${currentPage}.json`, JSON.stringify(data, null, 2));
 | 
						||
        console.log("get data done.");
 | 
						||
 | 
						||
        currentPage++;
 | 
						||
        haveMore = data.haveMore;
 | 
						||
    }
 | 
						||
}
 | 
						||
 | 
						||
main(); |