简易node爬虫爬取天气数据

最近公司里的师兄天天都烦躁不安,一打听才知道是工作上遇见了一些难题,怎么说呢?他最近在做一个温度预测的神经网络,但缺乏训练数据,每次都去网站上看效率太低也不便收集。恰好我最近在研究爬虫,于是便顺手试着帮他解决这一难题。

什么是爬虫?

这里指的是网络爬虫、网络蜘蛛,用于在茫茫互联网世界中抓取特定数据,常见的例子就是搜索引擎。

这次的目标

搜索引擎的爬虫当然高端大气上档次,但这次只是需要定向的抓取一些数据,只需要一些简单的操作便能够实现,这次的目标是** 定向抓取天气预报网站的数据,每隔五分钟抓取一次 **

准备工作

本次所用的是nodejs来编写爬虫程序,所以得先安装node和npm工具,一切准备就绪还需安装如下依赖包

//核心依赖
"http": "latest",
"cheerio": "latest",  //类jquery,用于解析网页
"request": "latest"

核心代码

主要的工作其实很多前辈已经做过了,像http请求模拟,解析网页等等,这里只需要对爬下来的网页内容进行数据提取就OK了,代码如下:

//抓取当前数据
function fetchData(url) {
    http.get(url, function(res) {
        var html = '';
        res.on('data', function(chunk) {
            html += chunk;
        });
        res.on('end', function() {
            var $ = cheerio.load(html);

            try {
                //时间格式化
                var DateTime = $('#air>i>div:last-child').text();
                var date = DateTime.split(' ');
                var strDate = new Date().getFullYear() + '年' + date[0];
                var fmDate = strDate.replace(/(\d{4}).(\d{1,2}).(\d{1,2}).+/mg, '$1-$2-$3');
                var fetchTime = fmDate + ' ' + date[1];

                //取得露点
                var dewP = $('#day-part').children('p');
                let dew = dewP[2].childNodes[1].data;
                //地区、温度、湿度
                let local = $('#current>h2>a').text();
                let temp = $('#current>div:first-child>a>b').text();
                let hum = $('.hum>p').text();
                //风速,风向
                let windP = $('.wind>p>span').children();
                let wind = windP[1].prev.data.trim();
                let windArr = wind.split(' ');
                let wind_speed = windArr[1] + windArr[2];
                let wind_direc = windArr[0];
                //体感温度
                let realFeel = $('.rfeel>b').text();
                //保存为数组是因为对接下来存储到数据库方便
                let meteoData = [fetchTime, local, temp, hum, dew, wind_speed, wind_direc, realFeel];
                insertSql(meteoData);
            } catch (error) {
                console.error(error);
            }

        })
    })
}

后续操作

可以看到,爬数据并不难,上面的代码已经把数据解析好了,接下来的工作主要是存储到数据库和添加定时任务:
1.存储到数据库


简易node爬虫爬取天气数据_第1张图片
实时数据表
//这里需要引入mysql模块
npm install mysql --save

//核心代码如下
function insertSql(data) {
    var insertStr = 'insert into real_meteorological(date_time,' +
        'local,temp,hum,dew,wind_speed,wind_direction,real_feel)' +
        ' values(?,?,?,?,?,?,?,?)';
    connection.query(insertStr, data, function(err, results) {
        if (err) {
            console.error(err);
        } else {
            console.info('success')
        }
    });
}

2.定时任务
定时任务采用setInterval(),代码如下

function loopCatch() {
    setInterval(function() {
        fetchData(url);
    }, 5 * 60 * 1000);
}

最后

想要做到数据抓取并不是很难,前人已经做了太多的工具可以用,我们需要的只不过是合理利用这些工具来组合成我们需要的工具。
顺便说一句:这里测试用的url我并没有给出来,但做法是差不多的

你可能感兴趣的:(简易node爬虫爬取天气数据)