您的位置:首页 > 业界新闻

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

2017-05-07 00:00 78 查看
摘要: 使用htmlunit实现德指日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条件下,做了防爬处理,会得到403 forbidden之类的错误,这个如何绕过,就见仁见智了

第三就是用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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息