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)

解决方案 »

  1.   

    单次正常的,每次执行的时候,跑到十几或者其它随机的数,就停了,然后经过1-2小时就报这个错误了。嗯 循环里加上sleep(100), 有点间隔试试,. 你就这样访问1000次人家还以为你要进攻他呢. 
      

  2.   

    单次正常的,每次执行的时候,跑到十几或者其它随机的数,就停了,然后经过1-2小时就报这个错误了。嗯 循环里加上sleep(100), 有点间隔试试,. 你就这样访问1000次人家还以为你要进攻他呢. 
    还是不行,我设置了10000还是走不完,只到了60几就停了
      

  3.   

    单次正常的,每次执行的时候,跑到十几或者其它随机的数,就停了,然后经过1-2小时就报这个错误了。嗯 循环里加上sleep(100), 有点间隔试试,. 你就这样访问1000次人家还以为你要进攻他呢. 
    还是不行,我设置了10000还是走不完,只到了60几就停了比之前好些了吧 ... 那就有可能是这方面的原因了 ,可能是会有反爬虫的机制 , 甚至可能是对方有限制访问次数的策略再就是,有其他的提示吗.?代码我也没仔细看, 我看你遍历股票, 是要取行情吗?  应该有行情接口吧,你从这边爬可能不是什么好方式
      

  4.   

    单次正常的,每次执行的时候,跑到十几或者其它随机的数,就停了,然后经过1-2小时就报这个错误了。嗯 循环里加上sleep(100), 有点间隔试试,. 你就这样访问1000次人家还以为你要进攻他呢. 
    还是不行,我设置了10000还是走不完,只到了60几就停了比之前好些了吧 ... 那就有可能是这方面的原因了 ,可能是会有反爬虫的机制 , 甚至可能是对方有限制访问次数的策略再就是,有其他的提示吗.?代码我也没仔细看, 我看你遍历股票, 是要取行情吗?  应该有行情接口吧,你从这边爬可能不是什么好方式想要股票的历史成交量,网上找了好久,就找到这么个接口,刚刚在自学Java,这是第一个自己写的程序,不太会写,有其他行情接口可以推荐下吗。
      

  5.   


                    String[] arr = str.trim().split(",");
                    for (String s : arr) {
                        hashMap.put(Integer.valueOf(i), s);
                        i++;
                    }这一段先改一下, split应该是一个很耗时的操作.因为是用正则表达式,而且在循环体里面... 你使用foreach来操作可能会导致复杂度高了一个级别另外流没有关闭,我不知道会不会有影响, 你也可以先试着看一下..  我也还没看完. 
      

  6.   

    &rand=random(10000)是什么意思~ 不太理解..我把总量减少了一些  感觉速度虽然有点慢 ,但是应该是可以完成的吧.. 
    和一开始的设想不太一样, sleep应该是没有必要的.
      

  7.   


    &rand=random(10000)  这个我也不理解,是web接口上的
      

  8.   

    再就是精简一下控制台的日志吧.. 感觉只打印这样几行就好了嘛.
    哦  我还缩减了一下天数...这样说的话 处理量应该小了几十倍不过 根据我这边的日志, 这里应该不会那么耗时了
    601258
    601258   in 1486201527444
    601258   out 1486201527446 cost 2
    一般每条不会超过10ms的样子. 
      

  9.   


    嗯,是的,打印行数多是为了调试,还不会用断点调试,呵呵嗯  主要问题应该就是那个split了... 
    再就是 如果控制台的日志过多,也会影响性能...至于报错好像是个别的股票有问题...
    最后记得关流... close方法就可以了.. 
      

  10.   


    嗯,是的,打印行数多是为了调试,还不会用断点调试,呵呵嗯  主要问题应该就是那个split了... 
    再就是 如果控制台的日志过多,也会影响性能...至于报错好像是个别的股票有问题...
    最后记得关流... close方法就可以了.. 可是每次程序停止都是在随机的数上面,不是固定的在某个数就停止了
      

  11.   


    嗯,是的,打印行数多是为了调试,还不会用断点调试,呵呵嗯  主要问题应该就是那个split了... 
    再就是 如果控制台的日志过多,也会影响性能...至于报错好像是个别的股票有问题...
    最后记得关流... close方法就可以了.. 试了下不经过split方法,结果还是报错呢
      

  12.   

    为什么随便换个百度的首页的URL:https://www.baidu.com/   居然也可以读到股票数据
      

  13.   


    我那天尝试的结果是, 虽然会报错 但是程序会继续执行... 其实代码刚写完的两个月时间是没有问题的,后来不知道什么原因就出现这个问题。是通过定时任务 在一个server中 持续运行了两个月? 还是说每次都是单独启动的.
    持续运行可能要查一下内存泄漏的问题. 至于这个问题java.net.UnknownHostException 本身.. 更大的可能性是网络不稳定..................或者丢包之类的, catch一下,然后做一下失败重试的处理吧