关注web技术发展
用心做好每一件事

记一次爬取网页内容,图片本地化(nodejs),存入mysql的过程

本篇文章包含的技术其实并没有多少,记录的只是本次实践的过程,其实很多时候,实现一个东西,往往并不是需要去造一个轮子,而且很多时候,往往一开始你并不知道你需要去造一个轮子,本篇文章记录的过程就是,我需要下图页面上的一些信息,写入数据库,如果一开始就知道需求,可能是一件很简单的事情,但是,我却走了一条很复杂的路。记一下
因为需求一直在变化,所以,一步一步记录吧,先上数据原图。

需求一:需要把上图的6)、7)两个参数表中的数据爬取到本地,开始打算是直接放到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图床吧。批量导入七牛后,才发现md,https收费。最后还是批量导入了微博图床。实际生产,这么做肯定是不合适的,但是,因为是自己练手的项目,所以先这样吧。

分享到: 更多 (0)

我要点评 抢沙发

评论前必须登录!