使用request.urlretrieve时出现404 Not Found问题的排查与解决
问题:提取URL后使用urlretrieve下载报404,但手动赋值或浏览器可正常访问
从外部服务发送POST请求获取响应后,提取响应中的URL并通过urllib.request.urlretrieve下载文件时,出现404 Not Found错误;但手动复制该URL并直接赋值给变量后,urlretrieve可正常下载,将提取的URL复制到浏览器中也能正常访问。
代码示例
方法1 - 报错
response = requests.post(url, json=payload, headers=headers) # 提取格式类似'https://my_provide_name.com/csv_exports/5704d5.csv.gz'的链接 url = response.text[17:-2] urlrtv = urllib.request.urlretrieve(url=url, filename='C:\Users\UserName\Downloads\test4.csv.gz')
返回错误: HTTP Error 404 Not Found
方法2 - 正常运行
response = requests.post(url, json=payload, headers=headers) url2 = 'https://my_provide_name.com/csv_exports/5704d5.csv.gz' urlrtv=urllib.request.urlretrieve(url=url2, filename='C:\Users\UserName\Downloads\test4.csv.gz')
正常运行
补充尝试
改用json.loads解析响应提取URL,结果仍然报错:
a = json.loads(response.text) # 输出: {'csv_file_url': 'https://service_name.com/csv_exports/746d6.csv.gz'} url = a['csv_file_url'] print(url) # 输出: https://service_name.com/csv_exports/746d6.csv.gz
解决方法
在下载文件前添加time.sleep(3)延迟,即可正常运行:
url = response.json()['csv_file_url'] time.sleep(3) urlrtv = urllib.request.urlretrieve(url=url, filename=f'{storage_path}{filename}')
内容的提问来源于stack exchange,提问作者MR.Max
相关产品推荐
相关产品推荐

