解决Chrome中可正常访问链接触发HTTP Error 400: Bad Request问题
解决HTTP Error 400: Bad Request的文件下载问题
首先,HTTP 400错误本质是你的请求不符合服务器的校验规则——既然浏览器能正常打开链接,那肯定是代码里的请求和浏览器的请求存在差异,光加User-Agent可能不够。给你几个针对性的排查方向和解决方案:
1. 模拟浏览器的完整请求头
浏览器发送的请求远不止User-Agent这一个字段,很多网站会校验Referer、Accept、Accept-Language这些参数,甚至部分网站会验证Cookie。你可以按这个步骤获取浏览器的真实请求头:
- 打开浏览器按F12进入开发者工具,切换到Network标签页
- 在浏览器里打开目标链接,找到对应的请求条目,查看Headers下的
Request Headers - 把这些关键字段复制到代码里,让请求更贴近浏览器的行为
2. 改用requests库替代urllib
requests库比urllib更灵活,更容易模拟完整的请求逻辑。这里给你修改后的可运行代码示例:
import os.path import requests from urllib.parse import quote # 从浏览器复制的请求头,按需调整字段 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8', 'Accept-Language': 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3', # 如果浏览器请求里有Referer,就把对应的地址加上 # 'Referer': 'https://example.com/' } for link in links: link = link.strip() # 处理URL中的特殊字符(比如空格、中文),避免编码错误 encoded_link = quote(link, safe=':/') name = encoded_link.rsplit('/', 1)[-1] filename = os.path.join('downloads', name) if not os.path.isfile(filename): print(f'Downloading: {filename}') try: # 允许自动处理重定向,设置超时避免卡壳 response = requests.get(encoded_link, headers=headers, allow_redirects=True, timeout=10) response.raise_for_status() # 主动抛出HTTP错误 with open(filename, 'wb') as f: f.write(response.content) except requests.exceptions.RequestException as e: print(f'Error occurred: {e}') print('Continuing to next link...')
3. 排查URL编码问题
有些链接里可能包含空格、中文或者其他特殊字符,浏览器会自动对这些字符编码,但代码里直接使用原始链接会导致服务器无法识别。上面的代码用urllib.parse.quote处理了编码问题,确保URL格式符合规范。
4. 检查是否需要Cookie验证
如果目标网站需要登录才能访问,浏览器的请求会携带登录状态的Cookie,而代码里没有的话就会返回400。这种情况你可以把浏览器里的Cookie复制到headers中,或者用requests的Session对象来维持会话状态。
试试这些方法,应该能解决你的下载问题~
内容的提问来源于stack exchange,提问作者XsLiar
相关产品推荐
相关产品推荐

