How to fix - TypeError: object StreamReader can't be used in 'await' expression
How to fix - TypeError: object StreamReader can't be used in 'await' expression
我正在使用 python(3.8.8) aiohttp 和 asyncio 来发出异步 http 请求。
但是,当我尝试等待 resp.content 的呼叫时,我收到了
TypeError:对象 StreamReader 不能用于 'await' 表达式
Traceback (most recent call last):
File "test_aiohttp.py", line 34, in get_country_wrapper
country_lst = await asyncio.gather(*result)
File "test_aiohttp.py", line 17, in get_country
html_text = await resp.content
TypeError: object StreamReader can't be used in 'await' expression
但是当我尝试等待对 resp.json() 的调用时,它起作用了。
async def get_country(session, url):
'''
Return the country of a given kaggle user
'''
async with session.get(url) as resp:
# json_resp = await resp.json()
html_text = await resp.content
country = re.search(r',"country":"([\w ]+)"', html_text)
return str(country.group(1))
async def get_country_wrapper(usernames):
try:
async with aiohttp.ClientSession() as session:
base_url = 'https://www.kaggle.com/'
result = []
for username in usernames:
url = base_url+str(username)
result.append(asyncio.create_task(get_country(session, url)))
country_lst = await asyncio.gather(*result)
return country_lst
except Exception as e:
print("Error: ", traceback.format_exc())
# Below is a sample list of users.
# Actual requirement is to run below for about 10,000 or more users
user_list = ['jhovey1', 'jsheppard95', 'dudihgustian', 'khmx5200', 'skshivamkedia']
asyncio.run(get_country_wrapper(user_list[:5]))
为什么我不能像 resp.json() 一样在这里使用 resp.content?
(我使用 resp.content 而不是 resp.json() 的原因是后者给出了这个特定 url 的错误)
我参考了以下文章,其中 resp.json() 的用法在上面描述过。
https://www.twilio.com/blog/asynchronous-http-requests-in-python-with-aiohttp
https://itqna.net/questions/76711/error-requests-aiohttp-asyncio
ClientResponse.json
是一个尝试将响应数据解析为 JSON 和 returns 字典的协程。 ClientResponse.content
是StreamReader
对象用户读取响应数据。这两者不可互换。您可能希望 ClientResponse.text
其中 returns 响应数据为字符串或 ClientResponse.bytes
其中 returns 响应数据为一个字节。
html_text = await resp.text()
我正在使用 python(3.8.8) aiohttp 和 asyncio 来发出异步 http 请求。 但是,当我尝试等待 resp.content 的呼叫时,我收到了 TypeError:对象 StreamReader 不能用于 'await' 表达式
Traceback (most recent call last):
File "test_aiohttp.py", line 34, in get_country_wrapper
country_lst = await asyncio.gather(*result)
File "test_aiohttp.py", line 17, in get_country
html_text = await resp.content
TypeError: object StreamReader can't be used in 'await' expression
但是当我尝试等待对 resp.json() 的调用时,它起作用了。
async def get_country(session, url):
'''
Return the country of a given kaggle user
'''
async with session.get(url) as resp:
# json_resp = await resp.json()
html_text = await resp.content
country = re.search(r',"country":"([\w ]+)"', html_text)
return str(country.group(1))
async def get_country_wrapper(usernames):
try:
async with aiohttp.ClientSession() as session:
base_url = 'https://www.kaggle.com/'
result = []
for username in usernames:
url = base_url+str(username)
result.append(asyncio.create_task(get_country(session, url)))
country_lst = await asyncio.gather(*result)
return country_lst
except Exception as e:
print("Error: ", traceback.format_exc())
# Below is a sample list of users.
# Actual requirement is to run below for about 10,000 or more users
user_list = ['jhovey1', 'jsheppard95', 'dudihgustian', 'khmx5200', 'skshivamkedia']
asyncio.run(get_country_wrapper(user_list[:5]))
为什么我不能像 resp.json() 一样在这里使用 resp.content?
(我使用 resp.content 而不是 resp.json() 的原因是后者给出了这个特定 url 的错误)
我参考了以下文章,其中 resp.json() 的用法在上面描述过。
https://www.twilio.com/blog/asynchronous-http-requests-in-python-with-aiohttp
https://itqna.net/questions/76711/error-requests-aiohttp-asyncio
ClientResponse.json
是一个尝试将响应数据解析为 JSON 和 returns 字典的协程。 ClientResponse.content
是StreamReader
对象用户读取响应数据。这两者不可互换。您可能希望 ClientResponse.text
其中 returns 响应数据为字符串或 ClientResponse.bytes
其中 returns 响应数据为一个字节。
html_text = await resp.text()