Java-互联网金融-德指日K抓取

简介:

前段时间项目的德指日K抓不到数据了,后面检查发现,这个接口已经被关闭了,所以取不到数据,因此自己在工具类中加了个小方法,抓了某家网站上的数据。具体网站就不列出来了,把代码贴上。股票,期货的指数其实是有专门的网站提供接口的,不过鉴于网上能提供这个数据的比较多,所以就用了免费的办法,简单省事的来把。

有些网站上能扒到的数据是这样的:

{
 "t":
     [1491955200,1492041600,1492473600,1492560000,1492646400,1492732800,1492992000,1493078400,1493164800,1493251200],
 "c":
     [12242.76,12147.7,12162.47,12040.23,12050.66,12091.33,12456.18,12482.9,12486.29,12478.28],
 "l":
     [12123.12,12089.94,11996.74,12001.86,11941.57,12009.12,12289.37,12439.11,12442.37,12426.99],
 "v":
     [76479500,75853200,89781500,85822600,85378000,109690000,191530000,94319000,66345700,104300000],
" s":"ok"
}

有些是这样的:

{
    "_comment": "pair_id: 40717, interval: 300, candles: 96",
    "candles": [
       ....
        [
            1493322600000,
            12466,
            12466,
            12462,
            12462,
            153
        ],
        [
            1493322900000,
            12460.5,
            12466.5,
            12460,
            12464.5,
            219
        ],
        [
            1493323200000,
            12460,
            12460,
            12460,
            12460,
            13
        ]
    ],
    "events": {
        "news": [],
        "ec": []
    },
    "attr": {
        "decimals": "1",
        "last_value": "12460.0",
        "last_close_value": "12460.00",
        "server_time": 1493349837,
        "interval": "300",
        "pair_id": "40717",
        "exchange_id": "85",
        "symbol": "德国DAX指数",
        "last_update_datetime": null
    },
    "edition_timezone_offset": 28800
    ....
}

各网站接口返回的数据结构各自不一致拿到数据后,要自己处理下滤出自己要的数据,基本的操作方法:

  1. 第一个就是看下是不是公开的接口,如果是的话就直接调用了,简单省事
  2. 在1条件下,做了防爬处理,会得到403 forbidden之类的错误,这个如何绕过,就见仁见智了
  3. 第三就是用HtmlUnit之类的模拟浏览器请求,拿到页面后再滤出自己要的数据,HtmlUnit有一个大坑就是对JS,CSS 的支持不怎么好,处理起来比较麻烦一点
    
    public static JSONArray getDaxData (String Url) throws IOException, ParseException {
        JSONArray arraydata = new JSONArray();
        JSONArray array = new JSONArray();
        try{
            //创建一个webclient
            WebClient webClient = new WebClient();
            //htmlunit 对css和javascript的支持不好,所以关闭
            webClient.getOptions().setJavaScriptEnabled(false);
            webClient.getOptions().setCssEnabled(false);
            //获取页面
            HtmlPage page = webClient.getPage(Url);
            final HtmlTable table = page.getHtmlElementById("curr_table");
            int rowsNum = 0;
            for (final HtmlTableRow row : table.getRows()) {
                if(rowsNum==0){
                    rowsNum++;                                    
                }else{
                    JSONObject object = new JSONObject();
                    int index = 0;
                    for (final HtmlTableCell cell : row.getCells()) {
                        if(index == 0 ){                           
                            SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyy-MM-dd");

                            String day=cell.asText().replaceAll("年","-")
                                    .replaceAll("月" ,"-")
                                    .replaceAll("日","").trim().toString();
                            java.sql.Date d1 = new java.sql.Date(sdf.parse(day).getTime());
                            object.put("date",d1.toString()); //日期
                            index++;
                        }else if (index == 1) {         //收盘价
                            object.put("close",Double.parseDouble(cell.asText().toString().replaceAll(",","").trim()));
                            index ++;
                        }else if (index == 2) {         //开盘价
                            object.put("open",Double.parseDouble(cell.asText().toString().replaceAll(",","").trim()));
                            index ++;
                        }else if (index == 3 ) {        //最高价
                            object.put("hight",Double.parseDouble(cell.asText().toString().replaceAll(",","").trim()));
                            index ++;
                        }else if (index == 4) {         //最低价
                            object.put("low",Double.parseDouble(cell.asText().toString().replaceAll(",","").trim()));
                            index ++;
                        }else if(index == 5){
                            String volume =  cell.asText().toString().replaceAll("K","").replaceAll("-","0").trim();
                            Double seleas = Double.parseDouble(volume)*1000;
                            object.put("volume",seleas.longValue());
                            index ++;
                        }else if(index == 6){
                            index ++;
                        }
                    }
                    array.add(object);
                    rowsNum++;
                }
            }
            for(int i = array.size()-1;i>0;i--){
                arraydata.add(array.get(i));
            }
            webClient.closeAllWindows();
        }catch (Exception ex){
            ex.printStackTrace();
        }
        return arraydata;
    }

 

转载于:https://my.oschina.net/percylee/blog/894484

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值