雅虎财经API Java下载CSV

q43xntqr  于 2023-02-15  发布在  Java
关注(0)|答案(6)|浏览(185)

我已经使用雅虎财经“API”与下面的代码几个星期。因为大约一个星期前,它停止工作。如果你键入这个地址:http://ichart.yahoo.com/table.csv?s=MSFT,您将获得Microsoft的一些历史数据(我的浏览器自动下载)。然而,当我试图通过Java阅读它时,流显然是打开的(我没有得到异常),然而,这个流不包含任何数据。2有人知道为什么下面的缓冲读取器不能像前几周那样流式传输对象吗?我怀疑雅虎可能添加了一些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();
k5ifujac

k5ifujac1#

您可以将URL从“http”更改为“https”,这样就可以正常工作,没有任何问题。

suzh9iv8

suzh9iv82#

许多网站正在检查用户代理字符串,如果没有发送字符串来阻止自动访问,则阻止访问。
以下是添加用户代理字符串的示例:

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

inn6fuwd3#

要了解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字符串来修改这个例子,你应该会得到预期的输出。

px9o7tmv

px9o7tmv4#

1.这是一个从雅虎财经下载历史股票数据的java代码。
1.在这里,我获取了所需的日期参数,并在Calender对象中设置了这些参数,然后将此对象转换为period对象,将此对象传递给函数,在此函数中将其转换为UNIX时间戳,然后将该值附加到链接中
1.我已经创建了一个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;

 }

 }
fbcarpbf

fbcarpbf5#

有雅虎财经图书馆

implementation group: 'com.yahoofinance-api', name: 'YahooFinanceAPI', version: '3.17.0'
import java.io.IOException;
import java.util.Calendar;
import java.util.List;

import yahoofinance.Stock;
import yahoofinance.YahooFinance;
import yahoofinance.histquotes.HistoricalQuote;
import yahoofinance.histquotes.Interval;

public class GetQuotes {

    public static void main(String[] args) throws IOException {
        Calendar from = Calendar.getInstance();
        Calendar to = Calendar.getInstance();
        from.add(Calendar.YEAR, -5); // from 5 years ago
         
        Stock google = YahooFinance.get("ENB.TO");
        List<HistoricalQuote> data = google.getHistory(from, to, Interval.DAILY);
        
        data.forEach(t -> { 
            System.out.println(t.getOpen() + "  " + t.getClose());
        });
    }
}
rvpgvaaj

rvpgvaaj6#

试着从其他网络上执行这段代码,这样你就能清楚雅虎是阻止了自动下载还是只把你正在使用的网络列入黑名单。

相关问题