最近公司里的师兄天天都烦躁不安,一打听才知道是工作上遇见了一些难题,怎么说呢?他最近在做一个温度预测的神经网络,但缺乏训练数据,每次都去网站上看效率太低也不便收集。恰好我最近在研究爬虫,于是便顺手试着帮他解决这一难题。
什么是爬虫?
这里指的是网络爬虫、网络蜘蛛,用于在茫茫互联网世界中抓取特定数据,常见的例子就是搜索引擎。
这次的目标
搜索引擎的爬虫当然高端大气上档次,但这次只是需要定向的抓取一些数据,只需要一些简单的操作便能够实现,这次的目标是** 定向抓取天气预报网站的数据,每隔五分钟抓取一次 **
准备工作
本次所用的是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.存储到数据库
//这里需要引入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我并没有给出来,但做法是差不多的