aiohttp调用英超Fantasy API返回空响应但Postman调用正常求助
问题排查与解决方案
该问题是目标网站的反爬策略拦截导致的:默认aiohttp发起请求时携带的User-Agent会明确标识这是Python脚本请求,网站识别后返回了状态码200但内容为空的响应。Postman因为携带了标准客户端的请求头信息,符合网站的访问规则,所以可以正常获取返回结果。
修复方案
- 给请求添加常规浏览器的User-Agent请求头,也可按需补充Accept、Accept-Language等其他常规请求头,模拟真实浏览器的访问行为。
- 可增加响应状态校验逻辑,提前识别请求异常情况,避免后续解析报错。
修改后的完整代码
import asyncio import time import aiohttp # 模拟浏览器的请求头配置 DEFAULT_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": "application/json, text/plain, */*", "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8" } async def player(name, n, session): print(f'number-{n}') url = f'https://fantasy.premierleague.com/api/element-summary/{n}/' # 携带配置的请求头发起请求 response = await session.request(method='GET', url=url, headers=DEFAULT_HEADERS) # 可选:添加响应状态校验 if response.status != 200: print(f"请求异常,状态码:{response.status}") return None value = await response.text() return value async def main(): async with aiohttp.ClientSession() as session: response = await player('armaan', 233, session) print("response: ", response) if __name__ == "__main__": start = time.perf_counter() asyncio.run(main()) elapsed = time.perf_counter() - start print(f"请求总耗时:{elapsed}秒")
如果添加上述请求头后仍然返回空内容,可直接复制Postman请求中携带的所有头信息到DEFAULT_HEADERS配置中,完全匹配Postman的请求特征即可正常获取数据。
内容的提问来源于stack exchange,提问作者Armaan Bansal
相关产品推荐
相关产品推荐

