各位老总,有时我们想钱想疯了(没办法,上有老,下有小),就去玩股票,虽然大多数当菲菜,让人割了,但还是乐此不疲。
上APP、上软件看各股资料太麻烦?不好找出各股的对比数据?那你可以把各股资料放入数据库,像平常我们玩数据库一样,想查哪个市值多少,哪个地方的,非常方便。
下面程序是我之前写的读取各股票信息,然后存到数据库里,供自己分析,大家可以参考,编写更详细的信息。
主要是读取东方财富网的数据
上证各股资料的URL都是:http://quote.eastmoney.com/sh+股票编号.html
深上证各股资料的URL都是:http://quote.eastmoney.com/sz+股票编号.html
代码如下(几年前的JAVA代码,能运行就得了)
package yjz.nms.cla;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.ConnectException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class GetStockInfo {
public void getData() throws IOException {
//股票名
String stockname=null ;
//板块
String bankuai=null;
//业务范围
String yewufanwei=null ;
//概念
String gainian=null ;
//发行价
float faxingjia;
//注册资本
float zhuceziben = 0 ;
//市值
float shizhi ;
//市盈率
float shiyinglv = 0 ;
//每股收益
float meigushouyi = 0 ;
//业务收入
float yingyeshouru = 0 ;
//收入同比
float shourutongbi ;
//利润
float liren = 0 ;
//利润同比
float lirentongbi ;
//市净率
float shijinglv ;
Connection con = null;
// 连接数据库
con = connDB(con);
String codeSqe=null;
codeSqe=getCodeSeq(con );
String fileNameN = "e:allStockCode.ini";
File f = new File(fileNameN);
String data = null;
if (f.exists()) {
BufferedReader br = new BufferedReader(new InputStreamReader(
new FileInputStream(fileNameN), "UTF-8"));
while((data=br.readLine())!=null && ! data.equals("")){
data=data.substring(data.indexOf("(")+1,data.indexOf(")"));
String urls = null;
if (data.startsWith("60")) {
urls = "http://quote.eastmoney.com/sh"+data+".html";
} else {
urls = "http://quote.eastmoney.com/sz"+data+".html";
}
String htmlContent= getHtmlContent(urls,"gb2312");
stockname = getContent(htmlContent,"
(.*?)
");shizhi = Float.parseFloat(getContent(htmlContent,"(.*?)亿"));
String tmp=getContent(htmlContent,"(.*?)");
if(tmp.indexOf("-")<0){
shiyinglv = Float.parseFloat(tmp);
}
tmp=getContent(htmlContent,"收益.*(d+.d+?)");
if(tmp.indexOf("-")<0){
meigushouyi = Float.parseFloat(tmp);
}
String yingyeshourus = getContent(htmlContent,"
收入:(.*?)");if(yingyeshourus.indexOf("亿")>0){
yingyeshouru=Float.parseFloat(yingyeshourus.substring(0,yingyeshourus.indexOf("亿")))*10000;
}else{
yingyeshouru=Float.parseFloat(yingyeshourus.substring(0,yingyeshourus.indexOf("万")));
}
shourutongbi = Float.parseFloat(getContent(htmlContent,"同比:(.*?)%"));
String lirens = getContent(htmlContent,"
净利润:(.*?)");if(lirens.indexOf("亿")>0){
liren=Float.parseFloat(lirens.substring(0,lirens.indexOf("亿")))*10000;
}else{
tmp=lirens.substring(0,lirens.indexOf("万"));
liren=Float.parseFloat(tmp);
}
lirentongbi = Float.parseFloat(getContent(htmlContent,"
同比:(.*?)%"));shijinglv = Float.parseFloat(getContent(htmlContent,"
市净率: (.*?)"));if (data.startsWith("60")) {
urls = "http://f10.eastmoney.com/f10_v2/CompanySurvey.aspx?code=sh"+data;
} else {
urls = "http://f10.eastmoney.com/f10_v2/CompanySurvey.aspx?code=sz"+data;
}
htmlContent= getHtmlContent(urls,"utf-8");
yewufanwei = getContent(htmlContent,"
经营范围(.*?)");bankuai = getContent(htmlContent,"
所属行业(.*?)");String zhucezibens = getContent(htmlContent,"注册资本(元)
(.*?)");if(zhucezibens.indexOf("亿")>0){
zhuceziben=Float.parseFloat(zhucezibens.substring(0,zhucezibens.indexOf("亿")))*10000;
}else{
zhuceziben=Float.parseFloat(zhucezibens.substring(0,zhucezibens.indexOf("万")));
}
System.out.println(getContent(htmlContent,"每股发行价(元)
(.*?)"));faxingjia= Float.parseFloat(getContent(htmlContent,"每股发行价(元)
(.*?)"));if (data.startsWith("60")) {
urls = "http://f10.eastmoney.com/f10_v2/CoreConception.aspx?code=sh"+data;
} else {
urls = "http://f10.eastmoney.com/f10_v2/CoreConception.aspx?code=sz"+data;
}
htmlContent= getHtmlContent(urls,"utf-8");
gainian= getContent(htmlContent,"
要点一:所属板块 (.*?)
");/*System.out.println("data:"+data);
System.out.println("stockname:"+stockname);
System.out.println("bankuai:"+bankuai);
System.out.println("yewufanwei:"+yewufanwei);
System.out.println("gainian:"+gainian);;
System.out.println("faxingjia:"+faxingjia);
System.out.println("zhuceziben:"+zhuceziben);
System.out.println("shizhi:"+shizhi);
System.out.println("shiyinglv:"+shiyinglv );
System.out.println("meigushouyi:"+meigushouyi );
System.out.println("yingyeshouru:"+yingyeshouru);
System.out.println("shourutongbi:"+shourutongbi);
System.out.println("liren:"+liren );
System.out.println("lirentongbi:"+lirentongbi);
System.out.println("shijinglv:"+shijinglv);*/
if((codeSqe==null) || (!codeSqe.contains(data))){
try {
String insertsql = "insert into stockINFO(stockcode , stockname, bankuai, yewufanwei,gainian ,faxingjia ,zhuceziben ,shizhi,shiyinglv ,meigushouyi,yingyeshouru ,shourutongbi,liren,lirentongbi,shijinglv)" +
" values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
PreparedStatement pstmt = con.prepareStatement(insertsql);
pstmt.setString(1, data);
pstmt.setString(2, stockname);
pstmt.setString(3, bankuai);
pstmt.setString(4, yewufanwei);
pstmt.setString(5, gainian);
pstmt.setFloat(6, faxingjia);
pstmt.setFloat(7, zhuceziben);
pstmt.setFloat(8, shizhi);
pstmt.setFloat(9,shiyinglv);
pstmt.setFloat(10,meigushouyi );
pstmt.setFloat(11,yingyeshouru);
pstmt.setFloat(12,shourutongbi );
pstmt.setFloat(13,liren);
pstmt.setFloat(14,lirentongbi );
pstmt.setFloat(15,shijinglv );
int result = pstmt.executeUpdate();
if(result==1){
System.out.print("insert "+data+" into database ok");
}
pstmt.close();
} catch (SQLException e) {
System.out.println("SQL error"+data);
e.printStackTrace();
}catch (NumberFormatException e){
System.out.println("数安格式错"+data);
e.printStackTrace();
}
catch (StringIndexOutOfBoundsException e){
System.out.println("索引超出值"+data);
e.printStackTrace();
}
}else{
try {
String updatesql = "update stockINFO set stockname=?, bankuai=?, yewufanwei=?,gainian=? ,faxingjia=? ,zhuceziben=? ,shizhi=?,shiyinglv=? ,meigushouyi=?,yingyeshouru=? ,shourutongbi=?,liren=?,lirentongbi=?,shijinglv=? where stockcode=?" ;
PreparedStatement pstmt = con.prepareStatement(updatesql);
pstmt.setString(1, stockname);
pstmt.setString(2, bankuai);
pstmt.setString(3, yewufanwei);
pstmt.setString(4, gainian);
pstmt.setFloat(5, faxingjia);
pstmt.setFloat(6, zhuceziben);
pstmt.setFloat(7, shizhi);
pstmt.setFloat(8,shiyinglv);
pstmt.setFloat(9,meigushouyi );
pstmt.setFloat(10,yingyeshouru);
pstmt.setFloat(11,shourutongbi );
pstmt.setFloat(12,liren);
pstmt.setFloat(13,lirentongbi );
pstmt.setFloat(14,shijinglv );
pstmt.setString(15, data);
int result = pstmt.executeUpdate();
if(result==1){
System.out.print("update "+data+" into database ok");
}
pstmt.close();
} catch (SQLException e) {
System.out.println("SQL error"+data);
e.printStackTrace();
}catch (NumberFormatException e){
System.out.println("数安格式错"+data);
e.printStackTrace();
}
catch (StringIndexOutOfBoundsException e){
System.out.println("索引超出值"+data);
e.printStackTrace();
}
}
}
br.close();
br=null;
} else {
System.out.println("请在/slview/yjz,里面加上股票代码,用逗号分隔");
}
try {
con.close();
con=null;
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private Connection connDB(Connection con) {
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
} catch (Exception e) {
System.out.println("Can't load dbdriver!-->"
+ e.getMessage());
}
try {
con = DriverManager.getConnection(
"jdbc:oracle:thin:@127.0.0.1:1639:dbnms