我正在尝试从互联网上读取图像URL,并能够通过python将图像上传到我的机器上,我在这篇博客文章中使用了这个例子https://www.geeksforgeeks.org/how-to-open-an-image-from-the-url-in-pil/哪个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来测试它是否允许我通过非浏览器应用程序下载。它奏效了。所以我只是重新使用了一个用户头,看看它是否只是缺少用户代理。
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
,但没有成功。你不会总是遇到这个问题(只要你是合理的,大多数网站在允许的方面都很宽松),但当你遇到这个问题时,试着使用用户代理。如果什么都不起作用,请尝试使用与浏览器相同的用户代理。
我遇到了同样的问题,原因是URL过期。我查看了回复文本,得到了";URL签名过期";这是一条你通常不会看到的消息,除非你检查了回复文本。
这意味着一些URL会过期,通常是出于安全目的。请尝试再次获取URL并更新脚本中的URL。如果你试图抓取的内容没有新的URL,那么不幸的是你无法抓取。