本篇文章包含的技术其实并没有多少,记录的只是本次实践的过程,其实很多时候,实现一个东西,往往并不是需要去造一个轮子,而且很多时候,往往一开始你并不知道你需要去造一个轮子,本篇文章记录的过程就是,我需要下图页面上的一些信息,写入数据库,如果一开始就知道需求,可能是一件很简单的事情,但是,我却走了一条很复杂的路。记一下 因为需求一直在变化,所以,一步一步记录吧,先上数据原图。
爬取页面两个参数表中的数据爬取到本地
开始打算是直接放到json文件的,所以,想了想,浏览器F12,写了下面的脚本,数据顺利到手
let arr3 = []
$($(.help-table)[4]).find('tbody tr').each((key,item)=>{
let obj = {}
obj['model_id'] = $($(item).find('td')[0]).html()
obj['name']= $($(item).find('td')[1]).html()
obj['imgUrl']= 'http://open.youtu.qq.com' + $($($(item).find('td')[2]).find('img')).attr('src')
arr3.push(obj)
})
console.log(JSON.stringify(arr3))
本来到这里就结束了,但是,想了一下,这些格式并不一定是我之后想要的格式,而且好几个接口中应该要用到,所以想了一下,还是存入mysql吧,到这里,我还是没考虑去写个脚本(nodejs
)去,因为只是导点数据,平时用可视化的navicat直接一键导入json了。导入完成后,顺手添加了几个字段。 ### 需求二:导入数据库,开始写小程序接口,存入数据库的图片地址全是http的,而小程序要求所有请求必须为https,所以只能改,怎么办,图片本地化呗。
因为我的服务器搭建好了https环境(后面会另起一篇,记录一下https环境的搭建)。图片本地化,对于一个程序员来说,去一张一张打开去存储,我是拒绝的,还是写个脚本吧。还是熟悉的nodejs。因为接口已经写好了,所以,不用再去抓网页了。其实如果这段代码作为工具的话,应该加入cheerio(服务端的jquery),把上面爬取页面数据的代码整理进来,数据从网页抓取,因为时间关系,我就不整理了,直接放图片本地化的代码。
const url = 'http://127.0.0.1:8086/rs/model'
const fs = require(fs);
const path = require('path');
const async = require(async);
const request = require('request');
let index = 1;
//发送请求
request(url, function(error, response, body) {
if(!error && response.statusCode == 200) {
let imageLinks = JSON.parse(response.body).rows
async.mapSeries(imageLinks, function(list, callback) {
console.log(list);
setTimeout(function() {
let item = list.imgUrl
var destImage = path.resolve(./images/, item.split(/)[item.split(/).length -1]);
downloadImage(item, destImage, function(err, data){
console.log([+ index++ +]: + data);
});
callback(null, item);
}, 100);
}, function(err, results) {});
}
});
var downloadImage = function(src, dest, callback) {
request.head(src, function(err, res, body) {
// console.log('content-type:', res.headers['content-type']);
// console.log('content-length:', res.headers['content-length']);
if (src) {
request(src).pipe(fs.createWriteStream(dest)).on('close', function() {
callback(null, dest);
});
}
});
};
ps:开始做的做法是拿到列表直接去循环下载的,并发太高,最后选择async库控制并发。图片顺利存入本地。想了一下,放入我的服务器,小水管加载,估计太慢了,还是放入了某cdn图床吧。