Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
雅虎财经API Java下载_Java_Url_Inputstream_Yahoo Api_Yahoo Finance - Fatal编程技术网

雅虎财经API Java下载

雅虎财经API Java下载,java,url,inputstream,yahoo-api,yahoo-finance,Java,Url,Inputstream,Yahoo Api,Yahoo Finance,我已经使用雅虎财经“API”和下面的代码几个星期了。大约一周前,它就停止工作了。如果您键入此地址:,您将获得Microsoft的一些历史数据(我的浏览器会自动下载它)。然而,当我试图通过Java读取它时,流显然是打开的(我没有得到异常),但是,流不包含任何数据。有人知道为什么下面的缓冲读取器不能像前几周那样对对象进行流式处理吗?我怀疑雅虎可能添加了一些java脚本来阻止自动下载 URL url = new URL("http://ichart.yahoo.com/table.csv?s=" +

我已经使用雅虎财经“API”和下面的代码几个星期了。大约一周前,它就停止工作了。如果您键入此地址:,您将获得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();

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

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

以下是如何添加用户代理字符串的示例:

    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跟踪扩展。跟踪输出显示链接 ^GSPC 重定向到 ^GSPC


在Java中,您需要实现URL连接以遵循重定向。下面是一个遵循重定向的示例。通过传递url字符串修改示例,您应该会得到预期的输出。

您可以将url从“http”更改为“https”,这不会产生任何问题

  • 这是一个java代码,用于从yahoo finance下载历史股票数据

  • 在这里,我获取了所需的日期参数,并在日历对象中设置它们,然后将该对象转换为period对象。该对象被传递到函数,在该函数中,它将被转换为UNIX时间戳,然后将该值附加到链接中

  • 我已经创建了一个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;
    
     }
    
    
     }
    

  • 我建议您使用Wireshark等工具查看您与Yahoo!之间的实际通信!。你在问题中读到它可以从浏览器中工作吗?谢谢tak3shi,我编辑了原始帖子以包含你的建议,但是流阅读器仍然是空的。应该使用添加一些关于为什么这是一个好的解决方案的解释到你的答案中。纯代码的答案并不总能帮助读者理解为什么这可能是最好的解决方案,因此您需要解释更多。