urlur=null;
try{
//搜狐行情历史接口
// ur=new;
//新浪行情历史接口
ur=new&symbol=sh600000&end_date=20150809&begin_date=20000101&type=plain\" );<="" p="">
httpurlconnectionuc=(httpurlconnection)ur.openconnection();
bufferedreaderreader=newbufferedreader(newinputstreamreader(ur.openstream(),\"gbk\"));
stringline;
while((line=reader.readline())!=null){
system.out.println(line);
}
}catch(exceptione){
//todoauto-generatedcatchblock
e.printstacktrace();
}
}
}
这是新浪的,我用过。但是,现在的历史数据接口链接似乎坏了,接收到乱码,所以,现在改用搜狐的,只是不知道上证股票代码怎么表示,只知道深证的,是股票号码前加cn_
实时股票数据接口
股票数据的获取目前有如下两种方法可以获取:
1.
http/javascript接口取数据
2.
web-service接口
1.http/javascript接口取数据
1.1sina股票数据接口
以大秦铁路(股票代码:601006)为例,如果要获取它的最新行情,只需访问新浪的股票数据
接口:
这个url会返回一串文本,例如:
var
hq_str_sh601006="大秦铁路, 27.55, 27.25, 26.91, 27.55, 26.20, 26.91,
26.92,
22114263, 589824680, 4695, 26.91, 57590, 26.90, 14700,
26.89, 14300,
26.88, 15100, 26.87, 3100, 26.92, 8900, 26.93,
14230, 26.94, 25150, 26.95, 15220, 26.96, 2008-01-11,
15:05:32";
这个字符串由许多数据拼接在一起,不同含义的数据用逗号隔开了,按照程序员的思路,顺序号从0开始。
0:”大秦铁路”,股票名字;
1:”27.55″,今日开盘价;
2:”27.25″,昨日收盘价;
3:”26.91″,当前价格;
4:”27.55″,今日最高价;
5:”26.20″,今日最低价;
6:”26.91″,竞买价,即“买一”报价;
7:”26.92″,竞卖价,即“卖一”报价;
8:”22114263″,成交的股票数,由于股票交易以一百股为基本单位,所以在使用时,通常把该值除以一百;
9:”589824680″,成交金额,单位为“元”,为了一目了然,通常以“万元”为成交金额的单位,所以通常把该值除以一万;
10:”4695″,“买一”申请4695股,即47手;
11:”26.91″,“买一”报价;
12:”57590″,“买二”
13:”26.90″,“买二”
14:”14700″,“买三”
15:”26.89″,“买三”
16:”14300″,“买四”
17:”26.88″,“买四”
18:”15100″,“买五”
19:”26.87″,“买五”
20:”3100″,“卖一”申报3100股,即31手;
21:”26.92″,“卖一”报价
(22,
23), (24, 25), (26,27), (28,
29)分别为“卖二”至“卖四的情况”
30:”2008-01-11″,日期;
31:”15:05:32″,时间;
一个简单的javascript应用例子:
script
type="text/javascript" src=""
charset="gb2312">/script>
/javascript">
var
elements=hq_str_sh601006.split(",");
document.write("current
price:" elements[3]);
这段代码输出大秦铁路(股票代码:601006)的当前股价
current
price:14.20
如果你要同时查询多个股票,那么在url最后加上一个逗号,再加上股票代码就可以了;比如你要一次查询大秦铁路(601006)和大同煤业(601001)的行情,就这样使用url:
,sh601001
查询大盘指数,比如查询上证综合指数(000001):
服务器返回的数据为:
var
hq_str_s_sh000001="上证指数,3094.668,-128.073,-3.97,436653,5458126";
数据含义分别为:指数名称,当前点数,当前价格,涨跌率,成交量(手),成交额(万元);
查询深圳成指数:
对于股票的k线图,日线图等的获取可以通过请求…./…/*.gif此url获取,其中*代表股票代码,详见如下:
查看日k线图:
newchart/daily/n/sh601006.gif
分时线的查询:
newchart/min/n/sh000001.gif
日k线查询:
newchart/daily/n/sh000001.gif
周k线查询:
newchart/weekly/n/sh000001.gif
月k线查询:
newchart/monthly/n/sh000001.gif
1.2
baidu&google的财经数据
在baidu,
google中搜索某只股票代码时,将会在头条显示此股票的相关信息,例如在google搜索601006时,
第一条搜索结果如下图:
通过点击左边的图片我们发现会将此图片链接到sina财经频道上,也就是说google股票数据的获取也是从sina获取。后经抓包分析,发现google也是采用1.1中介绍的接口。
baidu的股票数据来自baidu的财经频道
1.3
其他方式
除了sina,baidu等网站提供股票信息外,其他网站也有类似的接口。我们分析了一款论坛上采用的股票插件,
其中有关于实时股票数据获取的介绍,详见如下代码,其中可以看到有些数据来自sina。
以下是asp示例:
=5
then
stockdata=gethttp(""&code&"")
if
not len(stockdata)=0 then
stockdata=split(stockdata,chr(34))(1)
end if
if
len(stockdata)=0
then
stockdata="0,0,0,0,0,0,0,0,0,0,0,0"
else
stockdatasplit=split(stockdata,",")
stockdata=""&exstock.checkstr(stockdatasplit(0))&","&stockdatasplit(1)&","&stockdatasplit(2)&","&stockdatasplit(3)&","&stockdatasplit(4)&","&stockdatasplit(5)&","&formatdatetime(""&stockdatasplit(30)&"
"&stockdatasplit(31)&"",0)&""
end
if
‘0=股票名称,1=开盘价格,2=昨收盘价格,3=当前价格,4=最高价,5=最低价,6=更新时间
getstockdata=stockdata
end
function
function getstockimg(code)
dim
rndnum,addnum,checkcode,imgsource
if len(code)=5
then
getstockimg="newchart/daily/n/sh"&code&".gif"
end
if
imgsource=""
case
3
getstockimg=""&code&"&1003&sz
500 330"
imgsource=""
case
4
getstockimg=""&code&""
imgsource=""
end
select
getstockimg=split(""&getstockimg&"||"&imgsource&"","||")
end
function
function getastockimg()
dim
rndnum,addnum,checkcode
dim
getastockimgb,imgsource
addnum=6
randomize:rndnum=cint(rnd*addnum)
select
case rndnum
case
0
getastockimg=""
getastockimgb=""
imgsource=""
case
1
getastockimg=""
getastockimgb=""
imgsource=""
case
2
getastockimg=""
getastockimgb=""
imgsource=""
case
3
getastockimg="
180
140"
getastockimgb="
180
140"
imgsource=""
case
4
getastockimg="newchart/small/ish000001.gif?1189176558328"
getastockimgb="newchart/small/isz399001.gif?1189176558328"
imgsource=""
case
5
getastockimg=""
getastockimgb=""
imgsource=""
case
6
getastockimg=""
getastockimgb=""
imgsource=""
end
select
getastockimg=split(""&getastockimg&"||"&getastockimgb&"||"&imgsource&"","||")
end
function
%>
2.
web-service接口
2.1 chinastock的web-service:
中国股票行情数据
web 服务(支持深圳和上海股市的全部基金、债券和股票),数据即时更新。输出gif分时走势图、日/周/月 k
线图、及时行情数据(股票名称、行情时间、最新价、昨收盘、今开盘、涨跌额、最低、最高、涨跌幅、成交量、成交额、竞买价、竞卖价、委比、买一 - 买五、卖一 -
卖五)。此web服务提供了如下几个接口:
2.1.1
getstockimagebycode
get
股票gif分时走势图
input:thestockcode =
股票代号,如:sh000001
post /webservices/chinastockwebservice.asmx
http/1.1
host:
content-type:
text/xml; charset=utf-8
content-length:
length
soapaction:
""
string
output:
2.1.2
getstockimagebytebycode
获得中国股票gif分时走势图字节数组
input:thestockcode
= 股票代号,如:sh000001
post /webservices/chinastockwebservice.asmx
http/1.1host: content-type: text/xml;
charset=utf-8content-length: lengthsoapaction:
""
string
返回的数据如下:
r0lgodlhiqisafcaaaaaaawlbxkgbq4odhaqebsschuvfs4tdb8egqka9kopcdaazy4mfvgap2uyc0iqeuyubvwideasi1qnfx8agdu1nuozflgxd6cbwvy5fniwemq4gc0amlhdhpeadlvjmepksm1ihoubwpy3fzmyvy9igxrwiefmwgnyumpdpxjghqb8hk9eggbgx4lxiacoahhkmyt4m4vkjtstbv8a
2.1.3
getstockimage_kbycode
直接获得中国股票gif日/周/月 k
线图(545*300pixel/72dpi)
input: thestockcode =
股票代号
thetype = k 线图类型(d:日[默认]、w:周、m:月),
post
/webservices/chinastockwebservice.asmx http/1.1host:
content-type: text/xml; charset=utf-8content-length:
lengthsoapaction: "" string
string
比如按照下图所示输入:
返回的结果就是周k线图:
2.1.4
getstockimage_kbytebycode
获得中国股票gif日/周/月 k
线图字节数组
input:thestockcode = 股票代号,如:sh000001
post
/webservices/chinastockwebservice.asmx http/1.1host:
content-type: text/xml; charset=utf-8content-length:
lengthsoapaction: "" string string
http/1.1 200 okcontent-type: text/xml; charset=utf-8content-length: length
base64binary
比如按照下图输入:
返回的结果就是周k线图字节数组
r0lgodlhiqisafcaaaaaaawlbxkgbq4odhaqebsschuvfs4tdb8egqka9kopcdaazy4mfvgap2uyc0iqeuyubvwideasi1qnfx8agdu1nuozflgxd6cbwvy5fniwemq4gc0amlhdhpeadlvjmepksm1ihoubwpy3fzmyvy9igxrwiefmwgnyumpdpxjghqb8hk9eggbgx4lxiacoahhkmyt4m4vkjtstbv8a
2.1.5
getstockinfobycode
获得中国股票及时行情
input:thestockcode
= 股票代号
post /webservices/chinastockwebservice.asmx http/1.1host:
content-type: text/xml; charset=utf-8content-length:
lengthsoapaction: ""
string
返回的值一个一维字符串数组
string(24),结构为:string(0)股票代号、string(1)股票名称、string(2)行情时间、string(3)最新价(元)、string(4)昨收盘(元)、string(5)今开盘(元)、string(6)涨跌额(元)、string(7)最低(元)、string(8)最高(元)、string(9)涨跌幅(%)、string(10)成交量(手)、string(11)成交额(万元)、string(12)竞买价(元)、string(13)竞卖价(元)、string(14)委比(%)、string(15)-string(19)买一
- 买五(元)/手、string(20)-string(24)卖一 - 卖五(元)/手。
web
service的方法类似于现在concurrent项目的dbws数据的获取,都是通过soap协议向dbws服务器获取相关的数据。
利用雅虎查中国股票
返回微软的股票价格
"msft","4:00pm
- 30.70", 1.04,"21.46 -
30.75",29.77,29.66
这个返回安泰科技的,一般有半个小时的延迟。
但是s=000969.sz
这个后面的sz是深圳的意思, 沪市是ss后缀
10多年这些接口就存在了,这些年免费的行情软件到处都是,许多人都不用这种接口了,这种接口是全推行情,自己会用公式选股的人用用比较合适。普通人还是用免费的,淘宝上都是真的,你随便找家便宜的,下载安装接口后直接用买来的账号就可以用了,接口上都有到期时间
通达信股票软件现在上面都直接挂期货和港股行情
publicstaticvoidmain(string[]args){
urlur=null;
try{
//搜狐股票行情历史接口
// ur=new;
//新浪股票行情历史接口
ur=new&symbol=sh600000&end_date=20150809&begin_date=20000101&type=plain");
httpurlconnectionuc=(httpurlconnection)ur.openconnection();
bufferedreaderreader=newbufferedreader(newinputstreamreader(ur.openstream(),"gbk"));
stringline;
while((line=reader.readline())!=null){
system.out.println(line);
}
}catch(exceptione){
//todoauto-generatedcatchblock
e.printstacktrace();
}
}
}
目前市场上有很多股票行情交易软件,各种软件提供了丰富的分析和展示功能,而且基本上是免费的。但这些数据都是在线的、无法统一地下载到本地进行分析,于是上网找了些资料,有的是将程序到新浪搜狐的财经频道或其他财经类网站抓取并分析网页,这种方法操作性不强而且准确率较低,遇到广告或网页变动时风险较大。于是找到了sina股票数据接口,这个接口是通过在ie端输入"" 相应股票代码网站返回一个文件形式的数据,也可以通过js获取该文件中的变量得到想要的数据字符串。
以大秦铁路(股票代码:601006)为例,如果要获取它的最新行情,只需访问新浪的股票数据接口:sh601006这个url会返回一串文本,例如:
var hq_str_sh601006="大秦铁路, 27.55, 27.25, 26.91, 27.55, 26.20, 26.91, 26.92,
22114263, 589824680, 4695, 26.91, 57590, 26.90, 14700, 26.89, 14300,
26.88, 15100, 26.87, 3100, 26.92, 8900, 26.93, 14230, 26.94, 25150, 26.95, 15220, 26.96, 2008-01-11, 15:05:32";
这个字符串由许多数据拼接在一起,不同含义的数据用逗号隔开了,按照程序员的思路,顺序号从0开始。
0:”大秦铁路”,股票名字;
1:”27.55″,今日开盘价;
2:”27.25″,昨日收盘价;
3:”26.91″,当前价格;
4:”27.55″,今日最高价;
5:”26.20″,今日最低价;
6:”26.91″,竞买价,即“买一”报价;
7:”26.92″,竞卖价,即“卖一”报价;
8:”22114263″,成交的股票数,由于股票交易以一百股为基本单位,所以在使用时,通常把该值除以一百;
9:”589824680″,成交金额,单位为“元”,为了一目了然,通常以“万元”为成交金额的单位,所以通常把该值除以一万;
10:”4695″,“买一”申请4695股,即47手;
11:”26.91″,“买一”报价;
12:”57590″,“买二”
13:”26.90″,“买二”
14:”14700″,“买三”
15:”26.89″,“买三”
16:”14300″,“买四”
17:”26.88″,“买四”
18:”15100″,“买五”
19:”26.87″,“买五”
20:”3100″,“卖一”申报3100股,即31手;
21:”26.92″,“卖一”报价
(22, 23), (24, 25), (26,27), (28, 29)分别为“卖二”至“卖四的情况”
30:”2008-01-11″,日期;
31:”15:05:32″,时间;
相应地,也可以获得深市相关股票信息,但是这种方法的弊病是只能获得最新的或者是当天的股票数据,无法将历史数据导入到数据库,当然,你也可以以某一天为起始点自己重新创造历史数据。所以继续寻找其他网站接口,终于找到了雅虎财经网站,它提供的接口可以直接把股票历史数据导成excel,真实太方便了!直接在浏览器地址中数据网址即可股票代码,但是如果手动输入再逐一下载保存简直是太麻烦了,光上证股票就800多个,估计刚手动下载完就又开盘了还得重新下载。所以我的思路是,1、利用多线程方法下载股票文件。2、将这些文件统一导入数据库。
1.1文件下载类:
import java.io.*;
import java.net.*;
import java.util.list;
import fatowen.stocksystem.sysconfig.data.downloadvo;
public class httpdownfile {
private static int buffer_size = 8096;
/**根据url下载文件并保存
* @param desturl string
* @param filename string
* @throws exception
*/
public void savetofile(string desturl, string filename) throws ioexception {
fileoutputstream fos = null;
bufferedinputstream bis = null;
httpurlconnection httpurl = null;
url url = null;
byte[] buf = new byte[buffer_size];
int size = 0;
url = new ;
httpurl = (httpurlconnection) url.openconnection();
httpurl.connect();
bis = new bufferedinputstream(httpurl.getinputstream());
fos = new fileoutputstream(filename);
while ((size = bis.read(buf)) != -1)
fos.write(buf, 0, size);
fos.close();
bis.close();
httpurl.disconnect();
}
}
1.2多线程实现下载类:
import java.util.arraylist;
import java.util.list;
public class hisdataaddthread extends thread {
boolean runflag = true;
list myparamlist = null;
string downloaddata ="";
string baseurl = "";
string result = "";
string savepath = "";
public hisdataaddthread(list paramlist,string savepath){
this.myparamlist = paramlist;
this.savepath = savepath;
}
public void run() {
while(runflag){
downloaddata = publicdatautil.getdownloaddata(myparamlist);
if(!lib.isempty(downloaddata)){
httpdownfile oinstance = new httpdownfile();
try {
oinstance.savetofile(baseurl downloaddata, savepath downloaddata ".csv");
}catch (exception err) {
system.out.println(err.tostring());
}
}else{
runflag = false;
}
try {
thread.sleep(1000);
} catch (interruptedexception e) {
e.printstacktrace();
}
}
}
public list getfailurelist() {
return failurelist;
}
public void setfailurelist(list failurelist) {
this.failurelist = failurelist;
}
public list getsuccesslist() {
return successlist;
}
public void setsuccesslist(list successlist) {
this.successlist = successlist;
}
}
2.将下载完的文件统一保存到数据库工具类
import java.io.bufferedreader;
import java.io.file;
import java.io.filereader;
import java.io.ioexception;
import java.util.arraylist;
import java.util.iterator;
import java.util.list;
public class csvutitl {
private bufferedreader bufferedreader = null;
private list list = new arraylist();
public csvutitl(){
}
public csvutitl(string filename) throws ioexception{
bufferedreader = new bufferedreader(new filereader(filename));
string stemp;
while((stemp = bufferedreader.readline()) != null){
list.add(stemp);
}
}
public list getlist() throws ioexception {
return list;
}
// 得到csv文件的行数
public int getrownum(){
return list.size();
}
//得到csv文件的列数
public int getcolnum(){
if(!list.tostring().equals("[]")) {
//csv文件中,每列之间的是用','来分隔的
if(list.get(0).tostring().contains(",")) {
return list.get(0).tostring().split(",").length;
}else if(list.get(0).tostring().trim().length() != 0) {
return 1;
}else{
return 0;
}
}else{
return 0;
}
}
//取得指定行的值
public string getrow(int index) {
if (this.list.size() != 0)
return (string) list.get(index);
else
return null;
}
//取得指定列的值
public string getcol(int index){
if (this.getcolnum() == 0){
return null;
}
stringbuffer scol = new stringbuffer();
string temp = null;
int colnum = this.getcolnum();
if (colnum > 1){
for (iterator it = list.iterator(); it.hasnext();) {
temp = it.next().tostring();
scol = scol.append(temp.split(",")[index] ",");
}
}else{
for (iterator it = list.iterator(); it.hasnext();) {
temp = it.next().tostring();
scol = scol.append(temp ",");
}
}
string str=new string(scol.tostring());
str = str.substring(0, str.length() - 1);
return str;
}
//取得指定行,指定列的值
public string getstring(int row, int col) {
string temp = null;
int colnum = this.getcolnum();
if(colnum > 1){
temp = list.get(row).tostring().split(",")[col];
}else if(colnum == 1) {
temp = list.get(row).tostring();
}else{
temp = null;
}
return temp;
}
public void csvclose() throws ioexception {
this.bufferedreader.close();
}
public void run(string filename) throws ioexception {
csvutitl cu = new csvutitl(filename);
for(int i=0;i
string sscctag = formatdata(cu.getstring(i,1));//得到第i行.第一列的数据.
string sitename = formatdata(cu.getstring(i,2));//得到第i行.第二列的数据.
string stationid= formatdata(cu.getstring(i,3));
//将数据保存到数据库中
... ...
... ...
... ...
}
cu.csvclose();
}
public string formatdata(string basedata){
string result = null;
if(!"".equals(basedata) && basedata != null){
if(basedata.length() > 1){
result = basedata.substring(1,basedata.length());
result = result.substring(0, result.length()-1);
}else{
result = basedata;
}
}else{
result = "";
}
return result.trim();
}
public static void main(string[] args) throws ioexception {
csvutitl test = new csvutitl();
try{
file path = new file("e:\\data");
file[] f = path.listfiles();
list l = new arraylist();
for(int i=0;i
if(f[i].getname().endswith(".csv"))
l.add(f[i]);
}
iterator it = l.iterator();
while(it.hasnext()){
file ff = (file)it.next();
test.run(path.tostring() file.separator ff.getname());
}
}catch (exception e){
}
}
}