使用urllib.request下载网络图片出现HTTP 403 Forbidden错误如何解决
错误产生原因
- 该错误是目标站点的反爬策略拦截导致的:绝大多数提供图片存储的公共站点会校验HTTP请求的
User-Agent(用户代理)字段,用来识别非浏览器的爬虫请求。 - 你使用的
urllib.request默认发送的请求会携带Python-urllib/[版本号]格式的UA标识,很容易被站点识别为爬虫,直接返回403 Forbidden拒绝访问。GeeksforGeeks的示例资源没有配置这类反爬校验,因此可以正常下载。
解决方案
方案1:给urllib请求添加自定义请求头,伪装成浏览器访问
修改代码手动构造请求对象,添加浏览器UA,示例代码如下:
import urllib.request # 构造请求对象,添加浏览器User-Agent,这里用Chrome的UA示例 req = urllib.request.Request( "http://image.prntscr.com/image/ynfpUXgaRmGPwj5YdZJmaw.png", headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"} ) # 发送请求并保存文件 with urllib.request.urlopen(req) as response, open("gfg.png", "wb") as f: f.write(response.read())
方案2:使用更简洁的requests库实现(推荐)
requests库对请求头配置做了更友好的封装,使用前先执行安装命令:pip install requests
示例代码如下:
import requests headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"} response = requests.get("http://image.prntscr.com/image/ynfpUXgaRmGPwj5YdZJmaw.png", headers=headers) # 请求成功则保存文件 if response.status_code == 200: with open("gfg.png", "wb") as f: f.write(response.content)
内容的提问来源于stack exchange,提问作者patricebailey1998
相关产品推荐
相关产品推荐

