0

現在、Reddit のフロント ページからトップ ヘッドラインをダウンロードするためのスクリプトがあり、ほぼ常に機能します。時折、以下の例外が発生します。tryコードを保護するためにandステートメントを挿入する必要があることはわかってexceptいますが、どこに配置すればよいでしょうか?

クロール:

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
4

1 に答える 1

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 回試行し、失敗した試行間の間隔は 1 秒になりました。3回目の試行の後、あきらめます。サーバーがオフラインなどの可能性があります。

于 2015-01-20T04:30:17.380 に答える