2013-07-26 1 views
1

Я написал этот скрипт, который использует ystockquote-master для очистки API Yahoo Finance для цены и рыночной капитализации. Это очень просто и хорошо работает на моем компьютере, однако, когда я пытаюсь использовать его на своих друзьях mac, я получаю сообщение об ошибке. Это очень длинный, поэтому я выложу его в конце. Я изо всех сил пытался узнать, что происходит, поэтому я повернулся сюда. Предыстория: от новичка до новичков. Вот отрывок из моего кода:Python URL Request Yahoo 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 вы используете на каждой машине? - Каков фактический URL-адрес, который вы нажимаете на Mac? 400 означает, что Yahoo сообщает вам, что вы делаете что-то неправильно. Попробуйте распечатать его, прежде чем звонить. –

+0

@Mark Version - это Python 2.7 на обеих машинах. Ошибка возникает при первом URL-адресе, поэтому я предполагаю, что это синтаксис? Как я уже сказал, это отлично работает на моем компьютере. Это url: («http://finance.yahoo.com/d/quotes.csv?s=%s&f=%s»), и первым символом в списке является AAAE, я убедился, что особых символов нет в моем списке –

+0

Хммм. Поэтому вызов get_price ('AAAE') и get_market_cap ('AAAE') работает так, как ожидалось, на моем mac с 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, я отправил его моему другу, и он действительно работает, спасибо вам большое за ваше время, и теперь у меня есть решение для будущего –