Yahoo Finance API Java下载CSV

时间:2017-04-20 06:12:46

标签: java url inputstream yahoo-api yahoo-finance

我一直在使用Yahoo Finance“API”和下面的代码几周。大约一个星期前,它停止了工作。如果您输入以下地址:http://ichart.yahoo.com/table.csv?s=MSFT,您将获得Microsoft的一些历史数据(我的浏览器会自动下载它)。但是,当我尝试通过Java读取它时,流显然是打开的(我没有得到异常),但是,流不包含任何数据。任何人都知道为什么下面的缓冲读卡器无法像过去几周那样流式传输对象?我怀疑雅虎可能会添加一些java脚本来阻止自动下载。

URL url = new URL("http://ichart.yahoo.com/table.csv?s=" + symbol);
URLConnection hc = url.openConnection();
hc.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 4.10; rv:52.0) Gecko/20100101 Firefox/52.0");
BufferedReader in = new BufferedReader(new InputStreamReader(hc.getInputStream()));
    br.readLine();
    //Read File Line By Line
    String strLine;
    while ((strLine = br.readLine()) != null) {
        System.out.println(strLine);
    }
    br.close();

5 个答案:

答案 0 :(得分:1)

如果没有发送任何字符串来阻止自动访问,许多网站都会检查用户代理字符串并阻止访问。

这是一个如何添加用户代理字符串的示例:

    URL url = new URL("http://ichart.yahoo.com/table.csv?s=MSFT");
    URLConnection hc = url.openConnection();
    hc.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 4.10; rv:52.0) Gecko/20100101 Firefox/52.0");

答案 1 :(得分:1)

要了解java通信无法正常工作的原因,请跟踪html通信。我使用Chrome浏览器,启用了HTTP跟踪扩展。跟踪输出显示该链接 http://ichart.yahoo.com/table.csv?s= ^ GSPC 重定向到 https://ichart.yahoo.com/table.csv?s= ^ GSPC。

在Java中,您需要实现URL连接以遵循重定向。关注重定向的示例位于http://www.mkyong.com/java/java-httpurlconnection-follow-redirect-example/。通过传递url字符串来修改示例,您应该得到预期的输出。

答案 2 :(得分:1)

您可以将网址从“http”更改为“https”,其工作没有任何问题。

答案 3 :(得分:0)

  1. 这是一个Java代码,可从Yahoo Finance下载历史股票数据。

  2. 在这里,我已获取了必需的日期参数,并将其设置在日历对象中,然后将该对象转换为期间对象,将该对象传递给函数,该函数将其转换为UNIX时间戳,然后将该值设置为附加到链接

  3. 我已经创建了一个url对象,该对象将获取所需股票行情价格的历史数据的csv文件,该文件将使用输入流阅读器读取,并显示在控制台上。

     public class demo {
     public static void main(String[] args) throws IOException, ParseException {
    
     final String SYM = "TSLA";
     Calendar cal = Calendar.getInstance();
     Calendar cal1 = Calendar.getInstance();
     cal.set(Calendar.YEAR, 2019);
     cal.set(Calendar.MONTH, Calendar.JULY);
     cal.set(Calendar.DAY_OF_MONTH, 16);
    
     Date period1 = datechange(cal);
     cal1.set(Calendar.YEAR, 2019);
     cal1.set(Calendar.MONTH, Calendar.JULY);
     cal1.set(Calendar.DAY_OF_MONTH, 23);
     Date period2 = datechange(cal1);
    
     String interval="1d";
    
     long strDate = (period1.getTime());
     strDate= strDate/1000;
     long strDate1 = (period2.getTime());
     strDate1= strDate1/1000;
     //System.out.println(strDate+" "+strDate1+"     ans");
     String link="https://query1.finance.yahoo.com/v7/finance/download/"+SYM+"?period1="+strDate+"&period2="+strDate1+"&interval="+interval+"&events=history";
    
     URL url = new URL(link);
     URLConnection urlConn = url.openConnection();
     InputStreamReader inStream = new InputStreamReader(urlConn.getInputStream());
     BufferedReader buf = new BufferedReader(inStream);
    
    
     String line =buf.readLine();
     while(line != null) {
         System.out.println(line);
         line=buf.readLine();
     }
     }
    
     public static Date datechange(Calendar cal) throws ParseException {
     Date dateOne =cal.getTime();
     //boolean date1904 = true;
     //double ans =DateUtil.getExcelDate(cal,date1904);
    
     String a = dateOne.toString();
     String b[] = a.split(" ");
     String c = b[1]+" "+b[2]+" "+b[5];
     SimpleDateFormat sdf = new SimpleDateFormat("MMM dd yyyy", 
     Locale.ENGLISH);
     sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
     cal.setTime(sdf.parse(c));
     dateOne=cal.getTime();
     sdf.format(dateOne);
     return dateOne;
    
     }
    
    
     }
    

答案 4 :(得分:-2)

尝试从其他网络执行此代码。这可以让您清楚雅虎是否阻止了自动下载,或者只是将您正在使用的网络列入黑名单。