雅虎财经API Java下载
我已经使用雅虎财经“API”和下面的代码几个星期了。大约一周前,它就停止工作了。如果您键入此地址:,您将获得Microsoft的一些历史数据(我的浏览器会自动下载它)。然而,当我试图通过Java读取它时,流显然是打开的(我没有得到异常),但是,流不包含任何数据。有人知道为什么下面的缓冲读取器不能像前几周那样对对象进行流式处理吗?我怀疑雅虎可能添加了一些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=" +
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”,这不会产生任何问题
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,我编辑了原始帖子以包含你的建议,但是流阅读器仍然是空的。应该使用添加一些关于为什么这是一个好的解决方案的解释到你的答案中。纯代码的答案并不总能帮助读者理解为什么这可能是最好的解决方案,因此您需要解释更多。