Python3使用aiohttp请求部分网站报header存在无效字符错误如何解决
aiohttp请求部分网站提示
invalid character in header问题解答 问题原因
该问题由aiohttp与requests的HTTP校验策略差异导致:
- aiohttp默认严格遵循HTTP RFC规范,对响应头的字符范围做强校验,若目标网站返回的响应头包含非ASCII字符、未转义控制字符等不符合规范的内容,会直接抛出对应错误
- requests对不规范响应头做了内置容错处理,会自动转义或忽略异常字符,因此可以正常请求成功
解决方案
方案1:关闭响应头严格校验(推荐)
aiohttp 3.7及以上版本可直接在创建ClientSession时传入response_params={"strict": False}关闭校验逻辑,同时建议手动指定标准浏览器UA,避免部分网站拦截非浏览器请求,修改后代码如下:
import asyncio import aiohttp async def main(): async with aiohttp.ClientSession(response_params={"strict": False}) as session: 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" } async with session.get('https://www.rockhamptonregion.qld.gov.au/Home', headers=headers) as response: print("Status:", response.status) if __name__ == "__main__": loop = asyncio.get_event_loop() loop.run_until_complete(main())
如果使用的aiohttp版本低于3.7,可通过自定义响应类实现相同效果:
import asyncio import aiohttp from aiohttp import ClientResponse class NonStrictResponse(ClientResponse): def __init__(self, *args, **kwargs): super().__init__(*args, strict=False, **kwargs) async def main(): async with aiohttp.ClientSession(response_class=NonStrictResponse) as session: 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" } async with session.get('https://www.rockhamptonregion.qld.gov.au/Home', headers=headers) as response: print("Status:", response.status) if __name__ == "__main__": loop = asyncio.get_event_loop() loop.run_until_complete(main())
方案2:自定义响应头预处理(特殊场景用)
如果目标网站返回的响应头存在编码异常,可在自定义响应类中提前对响应头做编码转义、异常字符过滤处理,再交给aiohttp原生逻辑解析。
内容的提问来源于stack exchange,提问作者squidg
相关产品推荐
相关产品推荐

