本文主要是介绍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抓取数据的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!