【爬虫】 使用urllib下的 urlretrieve 下载图片时报urllib.error.HTTPError: HTTP Error 403: Forbidden

文章介绍了在使用Python的urllib库下载图片时遇到HTTPError403:Forbidden错误的解决方法,通过伪装User-Agent和使用IP代理来避免被服务器禁止。具体步骤包括构建不同的User-Agent列表,创建ProxyHandler以随机选择IP代理,最后安装opener并下载图片。

【爬虫】 使用urllib下的 urlretrieve 下载图片时报urllib.error.HTTPError: HTTP Error 403: Forbidden



解决办法: 对请求进行伪装

import urllib.request
import random

url = 'http://pic.monidai.com/img/202210052042294253562s.jpg'
filename = './1.jpg'
# 1. 构建请求头列表
ua_list = ['Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Firefox/102.0',
           'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36',
           'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.114 Safari/537.36 Edg/103.0.1264.62',
           'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:98.0) Gecko/20100101 Firefox/98.0',
           'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.81 Safari/537.36 SE 2.X MetaSr 1.0'
           ]

# 2. 构建IP代理池
IP_list = [{'http': 'http://123.123.0.246'},

           {'http': 'http://123.36.207.153'},

           {'http': 'http://123.230.210.218'},

           {'http': 'http://123.237.245.38'}]

# 3.创建handler对象
handler = urllib.request.ProxyHandler(random.choice(IP_list))

# 4. 创建opener对象
opener = urllib.request.build_opener(handler)

# 5. opener对象 添加请求头信息
opener.addheaders = [('User-Agent', random.choice(ua_list))]

# 6. opener设置为全局安装
urllib.request.install_opener(opener)

# 7.接着去下载就发现不会报 urllib.error.HTTPError: HTTP Error 403: Forbidden
urllib.request.urlretrieve(url=url, filename=filename)```


总结

以上就是今天要讲的内容,希望对大家有所帮助!!!

### Detectron2 中因 HTTP Error 403 导致的 `urllib.error.HTTPError` 的解决方案 当使用 Detectron2 下载模型权重或其他资源时,可能会遇到 `HTTP Error 403: Forbidden` 错误。这种错误通常是因为服务器拒绝了请求,可能的原因包括缺少必要的头部信息、IP 地址被封禁或者目标 URL 不再可用。 以下是针对该问题的一种通用解决方案: #### 添加 User-Agent 头部信息 许多网站会通过检测请求头中的 `User-Agent` 字段来判断客户端的身份。如果缺失此字段,某些站点可能会返回 403 错误。可以通过修改 Detectron2 或其依赖库(如 fvcore)的相关配置来添加自定义的请求头。 以下是一个示例代码片段,展示如何设置 `User-Agent` 来规避 403 错误[^1]: ```python import urllib.request # 自定义请求头 opener = urllib.request.build_opener() opener.addheaders = [('User-agent', 'Mozilla/5.0')] urllib.request.install_opener(opener) # 测试下载链接 url = "https://example.com/resource" output_file = "./resource.zip" try: urllib.request.urlretrieve(url, output_file) except Exception as e: print(f"Download failed with error: {e}") ``` 对于 Detectron2 而言,可以尝试调整其内部使用的网络请求逻辑。具体方法如下: 1. **定位并修改源码** 如果允许修改 Detectron2 源码,则可以在涉及网络请求的部分加入上述类似的 `User-Agent` 设置。例如,在 `fvcore.common.file_io` 或其他负责文件下载的地方进行更改。 2. **绕过内置下载器** 另一种方式是手动下载所需的预训练模型,并将其路径指定给 Detectron2 使用。这样可以完全避开潜在的网络访问问题。假设已经将模型保存到本地目录 `/path/to/local/model.pth`,则可通过以下方式进行加载: ```python from detectron2.config import get_cfg from detectron2.engine import DefaultPredictor cfg = get_cfg() # 手动设定本地模型路径 cfg.MODEL.WEIGHTS = "/path/to/local/model.pth" predictor = DefaultPredictor(cfg) ``` #### 替代方案:代理或镜像地址 如果仍然无法解决问题,还可以考虑以下几个替代策略: - 配置 HTTPS 代理以隐藏真实 IP 地址。 - 将官方提供的远程存储替换为可信的第三方镜像服务。 --- ### 总结 通过对 `urllib` 请求头增加合适的 `User-Agent` 值,能够有效缓解大部分由权限不足引发的 403 报错情况[^2]。此外,采用离线模式运行 Detectron2 是另一种可靠的选择,尤其适用于频繁遭遇网络限制的情形下[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值