urllib.error.HTTPError: HTTP Error 403: Forbidden with urllib.requests

urllib.error.HTTPError: HTTP Error 403: Forbidden with urllib.requests

我正在尝试从互联网上读取图像 URL 并能够通过 python 将图像传输到我的机器上,我使用了此博客中使用的示例 post https://www.geeksforgeeks.org/how-to-open-an-image-from-the-url-in-pil/ which was https://media.geeksforgeeks.org/wp-content/uploads/20210318103632/gfg-300x300.png,但是,当我尝试自己的示例时,它似乎不起作用我已经尝试了 HTTP 版本,但它仍然给我 403 错误。有谁知道可能是什么原因吗?

import urllib.request

urllib.request.urlretrieve(
  "http://image.prntscr.com/image/ynfpUXgaRmGPwj5YdZJmaw.png",
   "gfg.png")

输出:

urllib.error.HTTPError:HTTP 错误 403:禁止

位于 prntscr.com 的服务器主动拒绝您的请求。原因有很多。一些网站会检查调用者的用户代理,看看是否是这种情况。就我而言,我使用 httpie 来测试它是否允许我通过非浏览器应用程序下载。有效。于是干脆重用了一个user header,看看是不是只是缺少user-agent。

import urllib.request

opener = urllib.request.build_opener()
opener.addheaders = [('User-Agent', 'MyApp/1.0')]
urllib.request.install_opener(opener)
urllib.request.urlretrieve(
  "http://image.prntscr.com/image/ynfpUXgaRmGPwj5YdZJmaw.png",
   "gfg.png")

成功了!现在我不知道服务器使用什么逻辑。例如,我尝试了一个标准的 Mozilla/5.0 但它没有用。您不会总是遇到此问题(只要您合理,大多数网站在允许的内容上都相当宽松),但是当您遇到此问题时,请尝试使用用户代理。如果没有任何效果,请尝试使用与浏览器相同的用户代理。