Javascript

nodejs抓取数据

本文主要是介绍nodejs抓取数据,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

示例代码 



const axios = require('axios');
const fs = require('fs');
const request = require('request').defaults({
    //忽略证书安全
    rejectUnauthorized: false,
});
const path = require('path');
const md5 = require('md5-node');
const cheerio = require('cheerio');


const base_url = '需要抓取的域名';



var domain = '图片下载替换的域名';
//相对于public 的 目录
var img_dir = '/uploads/';
var data_dir = '保存数据的文件夹路径';
// var data_dir = '/uploads';

//创建图片目录
fs.mkdirSync(path.join(__dirname,img_dir),{ recursive: true });
#需要抓取的数据
let  arr = [
    '378723' 
];
#数据循环处理
for (let i = 0; i < arr.length; i++) {
    // var url = 'https://www.xxx.com/api/dam/editors/materials/'+arr[i]+'/info';

    var url = 'https://www.xxx.com/api/v2/materials/'+arr[i]+'/info';
    axios.get(url).then(data => {
        //格式化返回的数据
        //返回的数据
        let result_data = data.data;
        processEachPieceOfData(result_data)
    }).catch(error => {
        console.log('请求异常', error);
    })
}



//var pageData = JSON.parse(fs.readFileSync('test365.json').toString());

//processEachPageOfData(pageData);
//处理每页数据


//processEachPieceOfData(JSON.parse(fs.readFileSync('D:\\local\\design-itdiy\\public\\temp\\365\\20555\\20555_original.json').toString()))

//处理每条数据
function processEachPieceOfData(oneData,base_dir = path.join(__dirname,data_dir)) {

    let dir_path = path.join(base_dir,oneData.id+'');


    //读取id 属性 检查目录是否存在, 不存在则创建
    if( fs.existsSync(dir_path) === true ){
        //文件夹存在,直接返回

    }else{
        console.log(dir_path)
        if( !fs.mkdirSync(dir_path,{ recursive: true }) ){
            // return false;
        }
    }
    //写入原数据
    var data = {};
    data.preview = oneData.preview.url
    data.content = JSON.parse(oneData.content)
    data.title = oneData.title
    //下载图片到本地
    processingRich(data.preview,oneData.contain_materials,path.join(dir_path,'img') )
    //下载素材图片到本地
    processingRichText(data.content.layouts,path.join(dir_path,'img'));
    fs.writeFileSync(path.join(dir_path,oneData.id+'_original.json'), JSON.stringify(data));
    // fs.writeFileSync(path.join(dir_path,oneData.id+'_change.json'), JSON.stringify(data));
}
//处理每个富文本 下载内容图片
function processingRichText(layouts,base_dir) {
    if( !fs.mkdirSync(base_dir,{ recursive: true }) ){

    }

    let list = layouts[0].elements;
    //素材图片请求地址
    // https://www.xxx.com/api/v2/materials/48232568/info?ignore_status=1
    for (let i = 0; i < list.length; i++) {
            //格式化返回的数据
            //返回的数据
        if(list[i].type  != 'text' && list[i].url != undefined){
            if(getType(list[i].url)){
                let file_name = md5(list[i].url)+getType(list[i].url);
                let file_path = path.join(base_dir, file_name);
                let fileStream = fs.createWriteStream(file_path,{autoClose:true});
                request(list[i].url).pipe(fileStream);
            }
        }
    }
}


//处理每个富文本 下载图片和 返回替换后的富文本
function processingRich(preview,materials,base_dir) {
    if( !fs.mkdirSync(base_dir,{ recursive: true }) ){

    }
    let file_name = md5(preview)+getType(preview);
    let file_path = path.join(base_dir, file_name);
    let fileStream = fs.createWriteStream(file_path,{autoClose:true});
    console.log(preview,'preview')
    // console.log(fileStream,'fileStream')
    request(preview).pipe(fileStream);
}
//获取图片后缀
function getType(file){
    if(file.indexOf('.png') >= 0){
        return '.png';
    }else if(file.indexOf('.jpg') >= 0){
        return '.jpg';
    }else if(file.indexOf('.gif') >= 0){
        return '.gif';
    }else if(file.indexOf('.svg') >= 0){
        return '.svg';
    }else if(file.indexOf('.jpeg') >= 0){
        return '.jpeg';
    }else{
        return false;
    }
}

总结: 根据自己的需求调整代码

这篇关于nodejs抓取数据的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!