使用纯javascript 爬取双色球历史数据
一、前言
本人需要一个双色球历史数据来完成本人自己的应用。故上网查询各种api接口。发现大部分接口都是收费,而且接口仅可以获取最近50-100期的历史数据。经过大量查找,终于找到了一个网站,可以提供每天100次的免费查询接口。看了一下,从2003年第一期到目前每一期都有。但是对于身为程序员的我们,已经决定来爬取你的数据,而不是每天受到限制。文末我会附上我自己的token。但是因为没氪金,所以每天只有100次调用。有缘人可以直接拿去用。因为拿到这个token需要实名认证。
二、过程
直接贴上网站:
https://www.juhe.cn/docs
在这里搜索**,可以得到一个api:
按照要求注册(你们可以直接用我的token,不用注册了),订阅这个双色球数据。我们得到一个接口如下:
http://apis.juhe.cn/lottery/history?key=afc556731226f0ea785fd87fe5383d62&lottery_id=ssq&page_size=50&page=1
通过pagesize
和page
属性,我们就可以拿到某一时期的历史数据。返回结果如下:
看到这里不禁一笑。JSON。呵呵,立即想到了使用elasticsearch。
三、动手
本来想着本地随便弄个ajax,循环50次即可搞定。但是测试发现该接口:不 支 持 跨 域 !
于是采用jsonp,发现也无法调用。接口无法支持jsonp.
咋办?于是脑子一转。去同域试试?查看api接口,尝试访问
http://apis.juhe.cn/ 果然可以访问:
于是万恶的我按下了F12…
进入控制台,敲上ajax测试代码。没有ajax?没关系,复制jquery.min.js内容贴到控制台。当然,你也可以使用fetch 和原生的XmlhttpRequest。
剩下的就是建库。es建库,然后编写js 插入代码。代码都在下面,如果你使用elasticsearch,那么你复制到控制台就能跑。如果对elasticsearch不熟悉,可以参考我的博客 javascript玩转ElasticSearch(一)
当然,如果你不希望使用es作为你的数据存储媒介,你可以修改代码,使用Blob
对象创建一个文件进行下载。网上示例很多,我就不贴了。
function req(page, callback) {
var xmlHttp = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");
xmlHttp.open("get", 'http://apis.juhe.cn/lottery/history?key=afc556731226f0ea785fd87fe5383d62&lottery_id=ssq&page_size=50&page='+page, true); //打开连接
xmlHttp.onreadystatechange = function () {
try { //判断是否成功返回数据
if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {
objData = JSON.parse(xmlHttp.responseText); //解析文本格式的json数据并赋给json对象
callback(objData.result.lotteryResList);
}
}
catch (err) { alert(err); }
}
xmlHttp.send(null);//发送
}
function insertToES(data) {
data.lottery_no = Number(data.lottery_no);
$.ajax({
"type": "post",
"contentType": 'application/json',
"url": `http://localhost:9200/lottery_ssq/lottery_ssq?refresh=wait_for`,
"data": JSON.stringify(data),
"success": () => {
console.log(data.lottery_no + " 导入成功")
},
"error": (e) => {
console.error(data.lottery_no + "导入失败")
}
})
}
var page = 1;
var interval = setInterval(() => {
req(page, function (reqs) {
if (!reqs)
clearInterval(interval);
var length = reqs.length;
var index = 0;
var interval_inner = setInterval(() => {
if (index == length) {
clearInterval(interval_inner);
return;
}
insertToES(reqs[index++]);
}, 100)
page++;
});
}, 40000)
运行结果:
kibana截图:
四、结语:
附上我使用的两个token,你们随意使用,每天100次。按照50条每次,一个token每天可以用2次。
afc556731226f0ea785fd87fe5383d62
50656fe3d4ea32cd98c31c19192136b3
喜欢请点个赞,谢谢~