【NodeJs】爬取逆战所有武器

发布时间 2024-01-11 17:21:39作者: demo_you

Start

pnpm init
pnpm install cheerio exceljs

Code

import Excel from "exceljs";
import cheerio from 'cheerio'
import https from 'https'
import vm from "vm";

const httpsPromise = (options, postData) => {
    return new Promise((resolve, reject) => {
        const req = https.request(options, (res) => {
            let body = '';
            res.on('data', (result) => {
                body += result;
            });
            res.on('end', () => {
                resolve(body)
            });
        });

        req.on('error', (e) => {
            reject(e)
        });

        req.write(postData);
        req.end();
    })
}


const start = async () => {
    const options = {
        hostname: 'mwegame.qq.com',
        port: 443,
        path: '/nz/weapon/weapon_compare/101168',
        method: 'GET',
        headers: {
            'Referer': 'https://mwegame.qq.com/nz/weapon/weapon_compare/101168',
            'Origin': 'https://mwegame.qq.com',
            'Sec-Fetch-Dest': 'document',
            'Sec-Fetch-Mode': 'navigate',
            'Sec-Fetch-Site': 'none',
            'Sec-Fetch-User': '?1'
        }
    }

    const data = await httpsPromise(options, '')

    const $ = cheerio.load(data)

    const code = $('body > script:last-child').text().replace('Compare.iGunId = "101168";\n' +
        '        Compare.addLoadingDom();\n' +
        '        Compare.init();\n' +
        '        comFun.getStatic("nz", "", 1, "");\n' +
        '        comFun.reportEvent(10, 10228, \'\', "nz", Compare.params.uin, Compare.params);\n' +
        '    });', '').replace('seajs.use("bbcdn/nz/weapon/js/compare", function (Compare) {', 'var Compare = {}')

    const script = new vm.Script(code)
    const sandbox = {}
    script.runInNewContext(sandbox)
    const {Compare: {all, cache}} = sandbox

    const result =  all.sort((a, b) => a - b)
    const workbook = new Excel.stream.xlsx.WorkbookWriter({
        filename: './weapon.xlsx',
        useStyles: true,
        useSharedStrings: true
    })

    const worksheet = workbook.addWorksheet('sheet1');

    for (const item of result) {
        worksheet.addRow([
            item.szGunName, // 名称
            item.iGunId, // id
            item.szArmsCate, // 类型
            item.szShelf,
            item.szGpirce, // 价格
            (new Date(item.szShelfTime * 1000)).toLocaleString(), // 上架时间
            item.szImgCover ? `https://shp.qpic.cn/tgos/${item.szImgCover.replace(".","/")}/0` : '',
            item.szGunDesc // 描述
        ])
    }

    worksheet.commit()
    await workbook.commit()
}

start()

Usage

node ./上面的js文件