2013-07-26 149 views
1

我編寫了這個腳本,它使用ystockquote-master來刮取Yahoo Finance API的價格和市值。這是非常簡單的,並在我的電腦上運行良好,但是當我嘗試在我的朋友mac上使用它時,出現錯誤。這是一個很長的,所以我會在最後發佈它。我一直在努力研究發生了什麼,因此我轉向了這裏。背景:初學者到新手。這裏是我的代碼片段:Python URL請求雅虎API

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") 
+0

幾個問題: - 你在每臺機器上使用的是什麼版本的Python? - 您在Mac上打的實際URL是什麼? 400意味着雅虎告訴你,你做錯了事。在打電話之前嘗試打印出來。 –

+0

@Mark Version在兩臺機器上均爲Python 2.7。錯誤出現在第一個url,所以我猜這是語法?就像我說的,它在我的電腦上工作正常。這是網址:(「http://finance.yahoo.com/d/quotes.csv?s=%s&f=%s」),列表中的第一個符號是AAAE,我確定沒有特殊字符在我的名單 –

+0

嗯。所以調用get_price('AAAE')和get_market_cap('AAAE')按我的預期在python 2.7上運行。如果您直接打電話,請求是否有效? –

回答

1

好吧,讓我們試試這裏。我懷疑目前遇到的問題是源文件中涉及的空白(可能是流氓\ r?)。作爲補充說明,我介紹了一些使用子句上下文管理器來說明它們用於文件處理的用法。

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 
+0

其實,另一個想到的是/ usr/local/bin/pythonw在你的錯誤輸出中。你有沒有嘗試過使用/ usr/bin/python? –

+1

明天我會看看。我給我的朋友發送了一個腳本,它只爲一個符號調用get_price命令。這對他很有用,所以我想你對/ r角色是正確的。不幸的是,我不知道明天。我非常感謝你的時間,我也投了贊成票。如果,正如我懷疑的那樣,它最終會是正確的,我會用綠色的勾號表示tomorroow。再次感謝@Mark Update,我將它發送給我的朋友,它的確工作,非常感謝你的時間,現在我有一個爲未來的解決方案 –