欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

使用纯javascript 爬取双色球历史数据

程序员文章站 2022-07-13 15:37:00
...

一、前言

本人需要一个双色球历史数据来完成本人自己的应用。故上网查询各种api接口。发现大部分接口都是收费,而且接口仅可以获取最近50-100期的历史数据。经过大量查找,终于找到了一个网站,可以提供每天100次的免费查询接口。看了一下,从2003年第一期到目前每一期都有。但是对于身为程序员的我们,已经决定来爬取你的数据,而不是每天受到限制。文末我会附上我自己的token。但是因为没氪金,所以每天只有100次调用。有缘人可以直接拿去用。因为拿到这个token需要实名认证。

二、过程

直接贴上网站:

https://www.juhe.cn/docs

在这里搜索**,可以得到一个api:

使用纯javascript 爬取双色球历史数据

按照要求注册(你们可以直接用我的token,不用注册了),订阅这个双色球数据。我们得到一个接口如下:
http://apis.juhe.cn/lottery/history?key=afc556731226f0ea785fd87fe5383d62&lottery_id=ssq&page_size=50&page=1

通过pagesizepage属性,我们就可以拿到某一时期的历史数据。返回结果如下:
使用纯javascript 爬取双色球历史数据
看到这里不禁一笑。JSON。呵呵,立即想到了使用elasticsearch。

三、动手

本来想着本地随便弄个ajax,循环50次即可搞定。但是测试发现该接口:不 支 持 跨 域 !

于是采用jsonp,发现也无法调用。接口无法支持jsonp.

咋办?于是脑子一转。去同域试试?查看api接口,尝试访问
http://apis.juhe.cn/ 果然可以访问:

使用纯javascript 爬取双色球历史数据
于是万恶的我按下了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)

运行结果:
使用纯javascript 爬取双色球历史数据

kibana截图:
使用纯javascript 爬取双色球历史数据

四、结语:

附上我使用的两个token,你们随意使用,每天100次。按照50条每次,一个token每天可以用2次。

afc556731226f0ea785fd87fe5383d62
50656fe3d4ea32cd98c31c19192136b3

喜欢请点个赞,谢谢~