【问题标题】:Python URL Request Yahoo APIPython URL 请求 Yahoo API
【发布时间】:2013-07-26 02:17:14
【问题描述】:

我编写了这个脚本,它使用 ystockquote-master 来抓取 Yahoo Finance API 的价格和市值。它非常简单,在我的电脑上运行良好,但是当我尝试在我朋友的 mac 上使用它时,我得到一个错误。很长,所以我会在最后贴出来。我一直在努力找出发生了什么,所以我转向这里。背景:初学者到新手。这是我的代码的 sn-p:

try:
    # py3
    from urllib.request import Request, urlopen
    from urllib.parse import urlencode
except ImportError:
    # py2
    from urllib2 import Request, urlopen
    from urllib import urlencode

def _request(symbol, stat):
    url = 'http://finance.yahoo.com/d/quotes.csv?s=%s&f=%s' % (symbol, stat)
    req = Request(url)
    resp = urlopen(req)
    return str(resp.read().decode('utf-8').strip())
def get_price(symbol):
    return _request(symbol, 'l1')
def get_market_cap(symbol):
    return _request(symbol, 'j1')

i = 0
while i<len(NewSymbolsList):
    results = open("intermediateresults.csv", "a")
    api = [get_price(NewSymbolsList[i]),get_market_cap(NewSymbolsList[i])]
    api = re.sub("\[\'|\'|\]", "", str(api))
    results.write(str(NewSymbolsList[i]) +"," +str(api) +"\n")
    print NewSymbolsList[i], api                  
    i+=1
results.close()

这是我在朋友 Mac 上遇到的错误:

cd '/Users/JW/Desktop/market cap/' && '/usr/local/bin/pythonw' -t         '   /Users/JW/Desktop/market cap/MarketCap_Scan.py'  && echo Exit status: $? && exit 1
JWs-MacBook-Pro:~ JW$ cd '/Users/JW/Desktop/market cap/' && '/usr/local/bin/pythonw' -t     '/Users/JW/Desktop/market cap/MarketCap_Scan.py'  && echo Exit status: $? && exit 1
Traceback (most recent call last):
  File "/Users/JW/Desktop/market cap/MarketCap_Scan.py", line 33, in <module>
    api = [get_price(NewSymbolsList[i]),get_market_cap(NewSymbolsList[i])]
  File "/Users/JW/Desktop/market cap/MarketCap_Scan.py", line 18, in get_price
    return _request(symbol, 'l1')
  File "/Users/JW/Desktop/market cap/MarketCap_Scan.py", line 15, in _request
    resp = urlopen(req)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 127, in urlopen
    return _opener.open(url, data, timeout)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 410, in open
    response = meth(req, response)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 523, in http_response
    'http', request, response, code, msg, hdrs)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 442, in error
    result = self._call_chain(*args)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 382, in _call_chain
    result = func(*args)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 629, in http_error_302
    return self.parent.open(new, timeout=req.timeout)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 410, in open
    response = meth(req, response)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 523, in http_response
    'http', request, response, code, msg, hdrs)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 448, in error
    return self._call_chain(*args)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 382, in _call_chain
    result = func(*args)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 531, in http_error_default
    raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
urllib2.HTTPError: HTTP Error 400: Bad Request
JWs-MacBook-Pro:market cap JW$ 

显示我如何准备要迭代的列表的编辑,(我猜这很标准,但认为它可能会有所帮助):

symbols = open("symbolslist.txt")
readsymbols = symbols.read()
NewSymbolsList = readsymbols.split("\n")

【问题讨论】:

  • 几个问题: - 你在每台机器上使用什么版本的 Python? - 你在 mac 上点击的实际 URL 是什么? 400 表示雅虎告诉您您做错了什么。在调用之前尝试打印出来。
  • @Mark 版本在两台机器上都是 Python 2.7。错误出现在第一个 url,所以我猜它是语法?就像我说的,它在我的电脑上运行良好。这是网址:("finance.yahoo.com/d/quotes.csv?s=%s&f=%s"),列表中的第一个符号是 AAAE,我确保列表中没有特殊字符
  • 嗯。所以调用 get_price('AAAE') 和 get_market_cap('AAAE') 在我的 mac 上使用 python 2.7 可以正常工作。如果您直接调用它,请求是否有效?
  • @Mark 问题是我的朋友与我位于不同的地区,他甚至不如我无能。我为他写了这篇文章,希望他永远不必编辑它(因为它会过于复杂)。显然,如果没有其他追索权,那么我们将走那条路。
  • 我在想这可能与编码有关,但我在我的电脑上遍历了列表,它工作得很好,这就是我感到困惑的原因

标签: python api yahoo finance stock


【解决方案1】:

好的,让我们在这里尝试一下。我怀疑正在面临的问题是源文件中的空白相关(可能是流氓\r?)。作为补充说明,我介绍了几个 with 子句上下文管理器来说明它们用于文件处理的用途。

import re
try:
    # py3
    from urllib.request import Request, urlopen
    from urllib.parse import urlencode
except ImportError:
    # py2
    from urllib2 import Request, urlopen
    from urllib import urlencode

def _request(symbol, stat):
    url = 'http://finance.yahoo.com/d/quotes.csv?s=%s&f=%s' % (symbol, stat)
    req = Request(url)
    resp = urlopen(req)
    return str(resp.read().decode('utf-8').strip())

def get_price(symbol):
    return _request(symbol, 'l1')

def get_market_cap(symbol):
    return _request(symbol, 'j1')

symbols = open("symbolslist.txt")
readsymbols = symbols.read()
NewSymbolsList = readsymbols.split("\n")

with open('symbolslist.txt') as ifp, open('intermediateresults.csv', 'a') as results_fp:
    for row in ifp:
        row = row.strip()
        api = [ get_price(row), get_market_cap(row) ]
        api = re.sub("\[\'|\'|\]", "", str(api))
        results_fp.write(str(row) +"," +str(api) +"\n")
        print row, api

在我的电脑上,打印出来的是:

Marks-MBP:~ mroberts$ python aa.py
AAAE 0.005, 171K
RENT 22.07, 262.4M

【讨论】:

  • 实际上,我想到的另一件事是错误输出中的 /usr/local/bin/pythonw。您是否尝试过使用 /usr/bin/python?
  • 我明天会调查的。我给我的朋友发了一个脚本,它只为一个交易品种调用 get_price 命令。这对他有用,所以我想你对 /r 角色是正确的。不幸的是,我要到明天才能知道。我非常感谢您的时间,并且我确实投票了答案。如果,正如我怀疑的那样,它最终是正确的,我将在明天用绿色复选标记表示。再次感谢@Mark Update,我已将其发送给我的朋友,它确实有效,非常感谢您的时间,现在我有一个未来的解决方案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-19
  • 2015-08-29
  • 2014-10-10
  • 1970-01-01
相关资源
最近更新 更多