【发布时间】:2012-07-16 03:16:07
【问题描述】:
我正在执行一项任务,我使用雅虎的股票价格系统从网上检索多个股票价格。不幸的是,Yahoo API 我需要使用返回一个 .csv 文件,该文件显然包含每天交易股票的一行,对于我正在使用的股票至少有 5000 行,甚至更多其中一些有 10000 行 (example)。
不过,我只关心当前的价格,它在第二行。
我目前正在这样做:
require 'open-uri'
def get_ticker_price(stock)
open("http://ichart.finance.yahoo.com/table.csv?s=#{stock}") do |io|
io.read.split(',')[10].to_f
end
end
…但它真的很慢。
是所有延迟都来自获取文件,还是我处理它的方式有一些延迟?
io.read是否正在读取整个文件?有没有办法只下载 Yahoo CSV 文件的前几行?
如果问题 1 和 2 的答案没有使这一个无关紧要,有没有更好的方法来处理它,不需要查看整个文件(假设这是
io.read正在做的) ?
【问题讨论】:
-
open 命令的工作方式似乎是首先将下载的网页保存到一个临时文件,然后将该 Tempfile IO 对象传递给给定的块。即
open("http://...") { |io| puts File.read(io.path) }输出下载网页的内容。因此,open方法会在整个文件到达您的块之前下载整个文件。不幸的是,我不知道如何部分下载文件(以前从不需要这样做),所以我无法回答 2 或 3,但是我很确定您将无法使用open来做这个。 -
如果您使用报价服务,您可以通过在查询字符串中指定最后交易日期来减小文件大小。示例:finance.yahoo.com/d/quotes.csv?s=MO&f=snd1l1yr 如果您可以使用此其他服务,请在此处了解更多信息:greenido.wordpress.com/2009/12/22/yahoo-finance-hidden-api
-
实际上,我为您正在使用的服务找到了更好的参考。这是获取今天数据的示例:ichart.finance.yahoo.com/…