问题:aiohttp.client_exceptions.ContentTypeError
当通过aiohttp进行某网游英雄皮肤内容获取时,查询到所有英雄都在一个json文件中,手动对该url进行请求,会自动下载此文件。
此时 并不想手动下载该json再对json文件进行读取,打算直接通过aiohttp模块进行请求。
import asyncio
import aiohttp # 异步请求
class HeroSkin:
def __init__(self):
# 英雄列表
self.herolist_api = 'https://pvp.qq.com/web201605/js/herolist.json'
# 皮肤api
self.heroskin_api = 'https://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/{}/{}-bigskin-{}.jpg'
self.headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0'
}
async def main(self):
async with aiohttp.ClientSession() as session:
async with session.get(url=self.herolist_api, headers=self.headers) as response:
json_data = await response.json()
print(json_data)
if __name__ == '__main__':
h = HeroSkin()
# asyncio.run(h.main())
asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
asyncio.run(h.main())
程序大概写完后,想查看一下能否读取到json内容,却发现出现以下错误:
aiohttp.client_exceptions.ContentTypeError: 0, message='Attempt to decode JSON with unexpected mimetype: application/octet-stream', url=URL('https://pvp.qq.com/web201605/js/herolist.json')
解决办法
报错信息为:内容的类型错误。
那就手动在
json_data = await response.json()
这一行上添加 内容的类型。
json_data = await response.json(content_type=None)
如此问题解决。
import asyncio
import aiohttp # 异步请求
class HeroSkin:
def __init__(self):
# 英雄列表
self.herolist_api = 'https://pvp.qq.com/web201605/js/herolist.json'
# 皮肤api
self.heroskin_api = 'https://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/{}/{}-bigskin-{}.jpg'
self.headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0'
}
async def main(self):
async with aiohttp.ClientSession() as session:
async with session.get(url=self.herolist_api, headers=self.headers) as response:
json_data = await response.json(content_type=None)
print(json_data)
if __name__ == '__main__':
h = HeroSkin()
# asyncio.run(h.main())
asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
asyncio.run(h.main())