2015-01-20 7 views
0

В настоящее время у меня есть сценарий для загрузки верхних заголовков с первой страницы Reddit, и он работает почти всегда. Иногда я получаю исключение ниже. Я знаю, что мне следует вставить try и except заявления для защиты моего кода, но где их разместить?Защита от исключений - PRAW

Crawl:

def crawlReddit():              
    r = praw.Reddit(user_agent='challenge')    # PRAW object 
    topHeadlines = []         # List of headlines 
    for item in r.get_front_page(): 
     topHeadlines.append(item)      # Add headlines to list 
    return topHeadlines[0].title       # Return top headline 

def main(): 
    headline = crawlReddit()       # Pull top headline 

if __name__ == "__main__": 
    main()    

Ошибка:

Traceback (most recent call last): 
    File "makecall.py", line 57, in <module> 
    main()          # Run 
    File "makecall.py", line 53, in main 
    headline = crawlReddit()       # Pull top headline 
    File "makecall.py", line 34, in crawlReddit 
    for item in r.get_front_page(): 
    File "/Users/myusername/Documents/dir/lib/python2.7/site-packages/praw/__init__.py", line 480, in get_content 
    page_data = self.request_json(url, params=params) 
    File "/Users/myusername/Documents/dir/lib/python2.7/site-packages/praw/decorators.py", line 161, in wrapped 
    return_value = function(reddit_session, *args, **kwargs) 
    File "/Users/myusername/Documents/dir/lib/python2.7/site-packages/praw/__init__.py", line 519, in request_json 
    response = self._request(url, params, data) 
    File "/Users/myusername/Documents/dir/lib/python2.7/site-packages/praw/__init__.py", line 383, in _request 
    _raise_response_exceptions(response) 
    File "/Users/myusername/Documents/dir/lib/python2.7/site-packages/praw/internal.py", line 172, in _raise_response_exceptions 
    response.raise_for_status() 
    File "/Users/myusername/Documents/dir/lib/python2.7/site-packages/requests/models.py", line 831, in raise_for_status 
    raise HTTPError(http_error_msg, response=self) 
requests.exceptions.HTTPError: 503 Server Error: Service Unavailable 

ответ

1

Похоже r.get_front_page() возвращает лениво оцениваемого объекта, и вам нужно только первый элемент из этого объекта. Если да, то попробуйте следующее:

import time 

def crawlReddit():              
    r = praw.Reddit(user_agent='challenge')    # PRAW object 
    front_page = r.get_front_page() 
    try: 
     first_headline = front_page.next() # Get the first item from front_page 
    except HTTPError: 
     return None 
    else: 
     return first_headline.title 


def main(): 
    max_attempts = 3 
    attempts = 1 
    headline = crawlReddit() 
    while not headline and attempts < max_attempts: 
     time.sleep(1) # Make the program wait a bit before resending request 
     headline = crawlReddit() 
     attempts += 1 
    if not headline: 
     print "Request failed after {} attempts".format(max_attempts) 


if __name__ == "__main__": 
    main() 

Редактировать Теперь код пытается получить доступ к данным максимум 3 раза, с секундным интервалом между неудачными попытками. После третьей попытки он сдался. Сервер может быть отключен и т. Д.

+0

спасибо. и как бы мне заставить его попробовать второй раз при неудаче? – Apollo

+0

, если у вас есть crawlReddit return None в случае исключения, вы можете сделать его проверкой x много раз после time.sleep 'while not headline'. – zehnpaard

+0

ах. Есть ли способ предоставить образец кода для этого? Я не слишком хорошо знаком с этой функцией Python. Спасибо! – Apollo