雅虎财经 API Java 下载 CSV

Yahoo Finance API Java Download CSV

我已经使用带有以下代码的 Yahoo Finance "API" 几周了。从大约一周前开始,它就停止工作了。如果你输入这个地址:http://ichart.yahoo.com/table.csv?s=MSFT,你会得到一些微软的历史数据(我的浏览器会自动下载)。但是,当我尝试通过 Java 读取它时,流显然已打开(我没有得到异常),但是,流不包含任何数据。任何人都知道为什么下面缓冲的 reader 不能像前几周那样流式传输对象?我怀疑 Yahoo 可能添加了一些 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();

尝试从其他网络执行此代码。这将使您清楚 Yahoo 是否已阻止自动下载或仅将您正在使用的网络列入黑名单。

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

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

    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");

要了解 java 通信不起作用的原因,请跟踪 html 通信。我使用 Chrome 浏览器,启用了 HTTP 跟踪扩展。跟踪输出显示 link http://ichart.yahoo.com/table.csv?s=^GSPC 重定向到 https://ichart.yahoo.com/table.csv?s=^全球植物保护中心。

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

您可以将 URL 从 "http" 更改为 "https",这不会出现任何问题。

  1. 这是从雅虎财经下载历史股票数据的java代码。

  2. 这里我已经获取了所需的日期参数并将它们设置在一个日历对象中,然后这个对象被转换为周期对象这个对象被传递给函数,它将被转换为 UNIX 时间戳和然后该值附加到 link

  3. 我创建了一个 url 对象,它将获取所需代码值的历史数据的 csv 文件,该代码值是使用输入流 reader 读取的,它们它显示在控制台上。

     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;
    
     }
    
    
     }