雅虎财经 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",这不会出现任何问题。
这是从雅虎财经下载历史股票数据的java代码。
这里我已经获取了所需的日期参数并将它们设置在一个日历对象中,然后这个对象被转换为周期对象这个对象被传递给函数,它将被转换为 UNIX 时间戳和然后该值附加到 link
我创建了一个 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;
}
}
我已经使用带有以下代码的 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",这不会出现任何问题。
这是从雅虎财经下载历史股票数据的java代码。
这里我已经获取了所需的日期参数并将它们设置在一个日历对象中,然后这个对象被转换为周期对象这个对象被传递给函数,它将被转换为 UNIX 时间戳和然后该值附加到 link
我创建了一个 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; } }