package com.gupiao.views;import java.io.BufferedReader;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Writer;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 抓取网络数据的类
* 数据位 : 日期、开、高、收、低、交易量(交易金额)
* @author Administrator
*
*/
public class StockDataMining { private static String myStr="http://biz.finance.sina.com.cn/stock/flash_hq/kline_data.php?";
/*完整链接如:http://money.finance.sina.com.cn/corp/go.php/vMS_MarketHistory/stockid/" +
"600006.phtml?year=2013&jidu=4";*/
static int c;
// static String wj=c+".txt";
static String mdate;
public static void main(String[] args){
StockDataMining sd=new StockDataMining();
try {
sd.gPselt("20170203", "20160101");
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
/**
* 根据url从新浪财经上获取股票数据
* @param
* @param code 股票代码
* @return null,如果异常发生。否则返回一个arraylist ,其中每个元素为一个hashmap———里面的值从1~7分别为 :日期、开、高、收、低、交易量、交易金额
* @throws MalformedURLException
*/
public HashMap<Integer, Object> getStockData(String Str,String code,String enddate,String begindate){
try { //拼接完整url
String tempStr=myStr+Str+code+"&end_date="+enddate+"&begin_date="+begindate+"&type=plain";
URL url=new URL(tempStr);
HttpURLConnection uc = (HttpURLConnection) url.openConnection();
///创建输入流
BufferedReader reader = null;
reader=new BufferedReader(new InputStreamReader(url.openStream()));
//创建hashmap存储每一行具体数据
HashMap<Integer, Object> hashMap=new HashMap<Integer, Object>();
///匹配读取内容,并存入list里面
int i=0;
String str;
Cb cb=new Cb();
// cb.Mdate(code);
// mdate=Cb.gpDatem;
System.out.printf(code+"");
while((str=reader.readLine())!= null){
System.out.println(str);
for(String s :str.trim().split(",")){
hashMap.put(Integer.valueOf(i),s);
System.out.println(hashMap.get(i));
i++;
System.out.println(i);
}
// String fileName ="D:"+File.separator+"hk"+File.separator+"gupsj"+File.separator+code+".txt";
// File f=new File(fileName);
// Writer out = new FileWriter(f,true);
// out.write(matcher.group()+" ");
// if(7==i){
// out.write("\r\n");
// }
// out.close();
///左对齐输出
//System.out.printf("%-22s", matcher.group());
if(i>=6){
// cb.Date(code,hashMap,"2017-02-19 00:00:00.0");
System.out.printf("进入数据库11111");
// System.out.println(hashMap.get(1)+" "+hashMap.get(2)+" "+hashMap.get(3)+" "+hashMap.get(5)+" "
// + " "+hashMap.get(4)+" "+hashMap.get(6)+" "+hashMap.get(7)+"\r\n");
//每七个数据算一行,此时把该行数据存入list并且重置i,与hashMap
i=0;
hashMap=new HashMap<Integer, Object>();
}
}//end of while
return hashMap;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}public void gPselt(String a,String b) throws IOException{
for(int n=1;n<1000;n++){
String str="&rand=random(10000)&symbol=sz";
// c=n;
System.out.println(n);
if(n<10){
// File fl=new File("D:/hk/gupsj/"+"00000"+wj);
// fl.createNewFile();
this.getStockData(str,"00000"+n, a, b);
}
if(n>=10&&n<100){
// File fl=new File("D:/hk/gupsj/"+"0000"+wj);
// fl.createNewFile();
this.getStockData(str,"0000"+n, a, b);
}
else if(n>=100&&n<1000){
// File fl=new File("D:/hk/gupsj/"+"000"+wj);
// fl.createNewFile();
this.getStockData(str,"000"+n, a, b);
}
}
for(int m=600001;m<602000;m++){
// c=m;
System.out.println(m);
// File fl=new File("D:/hk/gupsj/"+wj);
// fl.createNewFile();
String tr="&rand=random(10000)&symbol=sh";
this.getStockData(tr,m+"", a, b);
}
for(int m=603000;m<604000;m++){
// c=m;
System.out.println(m);
// File fl=new File("D:/hk/gupsj/"+wj);
// fl.createNewFile();
String trc="&rand=random(10000)&symbol=sh";
this.getStockData(trc,m+"", a, b);
}
}
}
*****************************************************
java.net.UnknownHostException: biz.finance.sina.com.cn
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at sun.net.NetworkClient.doConnect(Unknown Source)
at sun.net.www.http.HttpClient.openServer(Unknown Source)
at sun.net.www.http.HttpClient.openServer(Unknown Source)
at sun.net.www.http.HttpClient.<init>(Unknown Source)
at sun.net.www.http.HttpClient.New(Unknown Source)
at sun.net.www.http.HttpClient.New(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.plainConnect(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.connect(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
at java.net.URL.openStream(Unknown Source)
at com.gupiao.views.StockDataMining.getStockData(StockDataMining.java:63)
at com.gupiao.views.StockDataMining.gPselt(StockDataMining.java:123)
at com.gupiao.views.StockDataMining.main(StockDataMining.java:38)
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Writer;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 抓取网络数据的类
* 数据位 : 日期、开、高、收、低、交易量(交易金额)
* @author Administrator
*
*/
public class StockDataMining { private static String myStr="http://biz.finance.sina.com.cn/stock/flash_hq/kline_data.php?";
/*完整链接如:http://money.finance.sina.com.cn/corp/go.php/vMS_MarketHistory/stockid/" +
"600006.phtml?year=2013&jidu=4";*/
static int c;
// static String wj=c+".txt";
static String mdate;
public static void main(String[] args){
StockDataMining sd=new StockDataMining();
try {
sd.gPselt("20170203", "20160101");
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
/**
* 根据url从新浪财经上获取股票数据
* @param
* @param code 股票代码
* @return null,如果异常发生。否则返回一个arraylist ,其中每个元素为一个hashmap———里面的值从1~7分别为 :日期、开、高、收、低、交易量、交易金额
* @throws MalformedURLException
*/
public HashMap<Integer, Object> getStockData(String Str,String code,String enddate,String begindate){
try { //拼接完整url
String tempStr=myStr+Str+code+"&end_date="+enddate+"&begin_date="+begindate+"&type=plain";
URL url=new URL(tempStr);
HttpURLConnection uc = (HttpURLConnection) url.openConnection();
///创建输入流
BufferedReader reader = null;
reader=new BufferedReader(new InputStreamReader(url.openStream()));
//创建hashmap存储每一行具体数据
HashMap<Integer, Object> hashMap=new HashMap<Integer, Object>();
///匹配读取内容,并存入list里面
int i=0;
String str;
Cb cb=new Cb();
// cb.Mdate(code);
// mdate=Cb.gpDatem;
System.out.printf(code+"");
while((str=reader.readLine())!= null){
System.out.println(str);
for(String s :str.trim().split(",")){
hashMap.put(Integer.valueOf(i),s);
System.out.println(hashMap.get(i));
i++;
System.out.println(i);
}
// String fileName ="D:"+File.separator+"hk"+File.separator+"gupsj"+File.separator+code+".txt";
// File f=new File(fileName);
// Writer out = new FileWriter(f,true);
// out.write(matcher.group()+" ");
// if(7==i){
// out.write("\r\n");
// }
// out.close();
///左对齐输出
//System.out.printf("%-22s", matcher.group());
if(i>=6){
// cb.Date(code,hashMap,"2017-02-19 00:00:00.0");
System.out.printf("进入数据库11111");
// System.out.println(hashMap.get(1)+" "+hashMap.get(2)+" "+hashMap.get(3)+" "+hashMap.get(5)+" "
// + " "+hashMap.get(4)+" "+hashMap.get(6)+" "+hashMap.get(7)+"\r\n");
//每七个数据算一行,此时把该行数据存入list并且重置i,与hashMap
i=0;
hashMap=new HashMap<Integer, Object>();
}
}//end of while
return hashMap;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}public void gPselt(String a,String b) throws IOException{
for(int n=1;n<1000;n++){
String str="&rand=random(10000)&symbol=sz";
// c=n;
System.out.println(n);
if(n<10){
// File fl=new File("D:/hk/gupsj/"+"00000"+wj);
// fl.createNewFile();
this.getStockData(str,"00000"+n, a, b);
}
if(n>=10&&n<100){
// File fl=new File("D:/hk/gupsj/"+"0000"+wj);
// fl.createNewFile();
this.getStockData(str,"0000"+n, a, b);
}
else if(n>=100&&n<1000){
// File fl=new File("D:/hk/gupsj/"+"000"+wj);
// fl.createNewFile();
this.getStockData(str,"000"+n, a, b);
}
}
for(int m=600001;m<602000;m++){
// c=m;
System.out.println(m);
// File fl=new File("D:/hk/gupsj/"+wj);
// fl.createNewFile();
String tr="&rand=random(10000)&symbol=sh";
this.getStockData(tr,m+"", a, b);
}
for(int m=603000;m<604000;m++){
// c=m;
System.out.println(m);
// File fl=new File("D:/hk/gupsj/"+wj);
// fl.createNewFile();
String trc="&rand=random(10000)&symbol=sh";
this.getStockData(trc,m+"", a, b);
}
}
}
*****************************************************
java.net.UnknownHostException: biz.finance.sina.com.cn
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at sun.net.NetworkClient.doConnect(Unknown Source)
at sun.net.www.http.HttpClient.openServer(Unknown Source)
at sun.net.www.http.HttpClient.openServer(Unknown Source)
at sun.net.www.http.HttpClient.<init>(Unknown Source)
at sun.net.www.http.HttpClient.New(Unknown Source)
at sun.net.www.http.HttpClient.New(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.plainConnect(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.connect(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
at java.net.URL.openStream(Unknown Source)
at com.gupiao.views.StockDataMining.getStockData(StockDataMining.java:63)
at com.gupiao.views.StockDataMining.gPselt(StockDataMining.java:123)
at com.gupiao.views.StockDataMining.main(StockDataMining.java:38)
还是不行,我设置了10000还是走不完,只到了60几就停了
还是不行,我设置了10000还是走不完,只到了60几就停了比之前好些了吧 ... 那就有可能是这方面的原因了 ,可能是会有反爬虫的机制 , 甚至可能是对方有限制访问次数的策略再就是,有其他的提示吗.?代码我也没仔细看, 我看你遍历股票, 是要取行情吗? 应该有行情接口吧,你从这边爬可能不是什么好方式
还是不行,我设置了10000还是走不完,只到了60几就停了比之前好些了吧 ... 那就有可能是这方面的原因了 ,可能是会有反爬虫的机制 , 甚至可能是对方有限制访问次数的策略再就是,有其他的提示吗.?代码我也没仔细看, 我看你遍历股票, 是要取行情吗? 应该有行情接口吧,你从这边爬可能不是什么好方式想要股票的历史成交量,网上找了好久,就找到这么个接口,刚刚在自学Java,这是第一个自己写的程序,不太会写,有其他行情接口可以推荐下吗。
String[] arr = str.trim().split(",");
for (String s : arr) {
hashMap.put(Integer.valueOf(i), s);
i++;
}这一段先改一下, split应该是一个很耗时的操作.因为是用正则表达式,而且在循环体里面... 你使用foreach来操作可能会导致复杂度高了一个级别另外流没有关闭,我不知道会不会有影响, 你也可以先试着看一下.. 我也还没看完.
和一开始的设想不太一样, sleep应该是没有必要的.
&rand=random(10000) 这个我也不理解,是web接口上的
哦 我还缩减了一下天数...这样说的话 处理量应该小了几十倍不过 根据我这边的日志, 这里应该不会那么耗时了
601258
601258 in 1486201527444
601258 out 1486201527446 cost 2
一般每条不会超过10ms的样子.
嗯,是的,打印行数多是为了调试,还不会用断点调试,呵呵嗯 主要问题应该就是那个split了...
再就是 如果控制台的日志过多,也会影响性能...至于报错好像是个别的股票有问题...
最后记得关流... close方法就可以了..
嗯,是的,打印行数多是为了调试,还不会用断点调试,呵呵嗯 主要问题应该就是那个split了...
再就是 如果控制台的日志过多,也会影响性能...至于报错好像是个别的股票有问题...
最后记得关流... close方法就可以了.. 可是每次程序停止都是在随机的数上面,不是固定的在某个数就停止了
嗯,是的,打印行数多是为了调试,还不会用断点调试,呵呵嗯 主要问题应该就是那个split了...
再就是 如果控制台的日志过多,也会影响性能...至于报错好像是个别的股票有问题...
最后记得关流... close方法就可以了.. 试了下不经过split方法,结果还是报错呢
我那天尝试的结果是, 虽然会报错 但是程序会继续执行... 其实代码刚写完的两个月时间是没有问题的,后来不知道什么原因就出现这个问题。是通过定时任务 在一个server中 持续运行了两个月? 还是说每次都是单独启动的.
持续运行可能要查一下内存泄漏的问题. 至于这个问题java.net.UnknownHostException 本身.. 更大的可能性是网络不稳定..................或者丢包之类的, catch一下,然后做一下失败重试的处理吧