在 Python 3.2.1 上使用 urllib.request.urlopen() 时出错

Getting an error when using urllib.request.urlopen() on Python 3.2.1

我正在使用 urllib.request 打开带有 Python 3.2.1 的页面源代码,但我收到一条错误消息 urllib.error.HTTPError: HTTP Error 503: Service Unavailable。请在下面找到代码和错误。

代码

import re
import urllib.request

html = urllib.request.urlopen("http://www.pythonchallenge.com/pc/def/ocr.html").read().decode()

print (html)

错误

Traceback (most recent call last):
  File "I:/Private/nabm/python/python_challenge/python_challenge_2.py", line 4, in <module>
    html = urllib.request.urlopen("http://www.pythonchallenge.com/pc/def/ocr.html").read().decode()
  File "C:\appl\Python.2.1\lib\urllib\request.py", line 138, in urlopen
    return opener.open(url, data, timeout)
  File "C:\appl\Python.2.1\lib\urllib\request.py", line 375, in open
    response = meth(req, response)
  File "C:\appl\Python.2.1\lib\urllib\request.py", line 487, in http_response
    'http', request, response, code, msg, hdrs)
  File "C:\appl\Python.2.1\lib\urllib\request.py", line 413, in error
    return self._call_chain(*args)
  File "C:\appl\Python.2.1\lib\urllib\request.py", line 347, in _call_chain
    result = func(*args)
  File "C:\appl\Python.2.1\lib\urllib\request.py", line 495, in http_error_default
    raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 503: Service Unavailable

Process finished with exit code 1

谁能看出是什么导致了这个错误?

HTTP 错误 503 表示服务器当时无法响应,原因可能是过载或拒绝您的连接。换句话说,您无法更改代码来修复它。

我知道距离约会已经有一段时间了。但我会 post 我是如何处理 "HTTP Error 503" 的,以防它对其他人有帮助。 首先,我确实将 request.urlretrieve(...) 放入 try 块中以捕获错误。 就我而言,我尝试访问的服务器确实需要时间来处理请求。 (我访问的服务器不是 Amazon.com 或据说可以防止程序访问其内容的那种服务器。) 使用 try 块,以防发生异常,我使用 time.sleep(20) 让程序等待 20 秒。这使我的程序能够完成。

我在某些 URL 上遇到了同样的问题并提供了 header 帮助。当我仔细研究它时,我发现服务器有时会识别出一个机器人正在尝试访问该网站,因此为了防止它,它们会给出一个虚假的连接错误。

from urllib.request import urlopen, Request
header = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36."}
req = Request("url", headers=header)

response = urlopen(req, timeout=60)