node.js 抓取网易云音乐信息

首先需要导入node.js

-node.js 下载地址:https://nodejs.org/en/

shell

npm install cnpm --save 导入cnpm安装市场 比node.js自带的npm市场下载速度要快
cnpm install nightmare --save 导入nightmare 模块 实现 模拟浏览器窗口访问
cnpm install cheerio --save 导入cheerio 模块 实现 访问 获取到的脚本数据

//导入fs 模块
const fs = require("fs")
//导入 安装的cheerio 模块
const cheerio = require("cheerio")
//导入 nightmare  模块
const Nightmare = require('nightmare')
//调出  nightmare 自带的控制台和模拟网页窗口
const nightmare = Nightmare({
    show: true,
    openDevTools: {
        mode: 'detach'
    }
})
//需要爬的地址   这里是网易云的示例页面
let home_url = "https://music.163.com/#/discover/artist/cat?id=1002"

nightmare
//开始访问链接
    .goto(home_url)
//利用代码模拟点击     nightmare自带的click方法  里面填selector   
//.m-cvrlst li:nth-child(16) a   选择我们需要的a标签里的内容
    .click(".m-cvrlst li:nth-child(16) a", () => {
        console.log("点击完了......")
//设置延时定时器    限制访问速度,两秒后开始执行
        setTimeout(() => {
            console.log("新界面....")
//这里访问点击后获取的新页面数据   
            nightmare.goto("https://music.163.com/#/artist?id=9548")
//evaluate    评价 评估       这里返回的数据   会传到下面then 的data里
                .evaluate(() => {
                    return document.querySelector(".g-iframe").contentWindow.document.querySelector("body").innerHTML
                })
                .then((data) => {
                    console.log("开始查询.,,....")
//因为抓取的innerHTML 里是利用脚本拼接的方式拼接到body里
//所以这里用到cheerio 模块  来执行  获取到的数据
                    let $ = cheerio.load(data)
//定义一个  空数组  来保存  获取到的歌曲信息
                    let songs = []
                    $(".m-table tr .txt a").each((i, item) => {
                        let song_id = $(item).attr("href")
                        let song_name = $(item).find("b").attr("title")
                        let tmp_dic = {
                            "song_id": song_id,
                            "song_name": song_name
                        }
                        songs.push(tmp_dic)
                    })
//将数组里的数据  通过JSON方式  转换字符串  
                    let songs_string = JSON.stringify(songs)
                    let file_name = "./test/" + $(".sname-max").text() + ".json"
                    fs.writeFile(file_name, songs_string, () => {

                    })
                })
        }, 2000);
    })
 .then(() => {

    })
//捕获错误
    .catch((err) => {
        console.log("访问错误", err)
    })

你可能感兴趣的:(node.js 抓取网易云音乐信息)