【问题标题】:Why does my urllib.request return a http error 403?为什么我的 urllib.request 返回 http 错误 403?
【发布时间】:2021-01-26 04:35:48
【问题描述】:

我正在尝试制作一个使用 python 从网站下载一系列产品图片的程序。该网站将其图像存储在特定的 url 格式 https://www.sitename.com/XYZabcde 下,其中 XYZ 是代表产品品牌的三个字母,abcde 是介于 00000 和 30000 之间的一系列数字。 这是我的代码:

import urllib.request

def down(i, inp):
    full_path = 'images/image-{}.jpg'.format(i)
    url = "https://www.sitename.com/{}{}.jpg".format(inp,i)
    urllib.request.urlretrieve(url, full_path)

    print("saved")
    return None

inp = input("brand :" )

i = 20100

while i <= 20105:
    x = str(i)
    y = x.zfill(5)
    z = "https://www.sitename.com/{}{}.jpg".format(inp,y)
    print(z)
    down(y, inp)
    i += 1

使用我编写的代码,我可以从中成功下载我知道存在的一系列图片,例如从 20100 到 20105 的品牌 RVL 将成功下载这六张图片。 但是,当我扩大 while 循环以包含链接时,我不知道会给我一个图像,我得到这个错误代码:

Traceback (most recent call last):
  File "c:/Users/euan/Desktop/university/programming/Python/parser/test - Copy.py", line 20, in <module>
    down(y, inp)
  File "c:/Users/euan/Desktop/university/programming/Python/parser/test - Copy.py", line 6, in down
    urllib.request.urlretrieve(url, full_path)
  File "C:\Users\euan\AppData\Local\Programs\Python\Python38\lib\urllib\request.py", line 247, in urlretrieve
    with contextlib.closing(urlopen(url, data)) as fp:
  File "C:\Users\euan\AppData\Local\Programs\Python\Python38\lib\urllib\request.py", line 222, in urlopen
    return opener.open(url, data, timeout)
  File "C:\Users\euan\AppData\Local\Programs\Python\Python38\lib\urllib\request.py", line 531, in open
    response = meth(req, response)
  File "C:\Users\euan\AppData\Local\Programs\Python\Python38\lib\urllib\request.py", line 640, in http_response
    response = self.parent.error(
  File "C:\Users\euan\AppData\Local\Programs\Python\Python38\lib\urllib\request.py", line 569, in error
    return self._call_chain(*args)
  File "C:\Users\euan\AppData\Local\Programs\Python\Python38\lib\urllib\request.py", line 502, in _call_chain
    result = func(*args)
  File "C:\Users\euan\AppData\Local\Programs\Python\Python38\lib\urllib\request.py", line 649, in http_error_default
    raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 403: Forbidden

我可以做些什么来检查和避免任何会产生这种结果的网址?

【问题讨论】:

  • 如错误消息所述,您(或您的 IP)已被禁止访问。 HTTP Error 403: Forbidden 当网络服务器上运行的服务闻到机器人(重复命中、嗅探等)从而自动阻止 IP 时,可能会发生这种情况。
  • 需要认证吗?您最好使用requests 包,它在这些事情上非常胜任。

标签: python web-scraping error-code


【解决方案1】:

因此,您无法提前知道哪些 URL 是您无权访问的,但您可以用 try-except 包围下载:

import urllib.request, urllib.error

...

def down(i, inp):
    full_path = 'images/image-{}.jpg'.format(i)
    url = "https://www.sitename.com/{}{}.jpg".format(inp,i)
    try:
        urllib.request.urlretrieve(url, full_path)
        print("saved")
    except urllib.error.HTTPError as e:
        print("failed:", e)


    return None

在这种情况下,它只会打印例如每当无法获取 URL 时,“失败:HTTP 错误 403:禁止”,程序将继续。

【讨论】:

  • 不客气,尤安!高兴听到。也许您可以通过单击答案旁边的复选标记将答案标记为已接受?
  • 你能推荐一个解释 urllib.error 的教程吗?我喜欢了解我的代码在做什么,而不是仅仅从 stackoverflow 中删除它
  • 我喜欢这种态度。 import urllib.error 从主模块“urllib”导入子模块“error”。在该模块中存在异常类 HTTPError,我们需要它来告诉 Python,如果在 try-except 子句中发生 HTTPError 类型的异常,它应该执行 except 子句之后的代码。您可以在许多地方阅读有关 try 和 except 的更多信息,例如 docs.python.org/3/tutorial/errors.html
  • 再次感谢 Jesper 度过了一个愉快的夜晚(如果你在的地方是晚上)
  • 是的!祝你有个愉快的夜晚,尤安! ?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-25
  • 2018-11-17
  • 2015-01-18
  • 2016-05-12
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多