aiohttp是一個為Python提供異步HTTP 客戶端/服務端編程,基於asyncio(Python用於支持異步編程的標准庫)的異步庫。
爬蟲方面我們用的主要是客戶端來發起請求,一般我們使用aiohttp和asyncio聯合這兩個異步庫來寫異步爬蟲,其實可以把aiohttp 看作是異步版的requests庫。
這是aiohttp使用的最簡單的例子
import aiohttp
import asyncio
async def main():
#我們得到一個session會話對象,由ClientSession賦值得到
async with aiohttp.ClientSession() as session:
#使用session.get方法得到response(response是一個CilentResponse對象)
async with session.get("https://baidu.com") as response:
print(response.status)
print(await response.text)
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
loop.close()
要注意的是由於這是異步庫,要實現異步必須全部使用async/await 異步語法
其實對於session對象的操作比如get,post獲得json數據等等http方法的使用和在requests里使用都是十分相似的
下面記流水仗了
- 傳遞參數
async with session.get(url, params = dict) as response:
注意的是aiohttp會在發送請求前標准化URL。 域名部分會用IDNA 編碼,路徑和查詢條件會重新編譯(requoting)。如果服務器需要接受准確的表示並不要求編譯URL,那標准化過程應是禁止的。 禁止標准化可以使用encoded=True:
await session.get(URL('http://example.com/%30', encoded=True))
- 文本的解碼
await resp.text(encoding='utf-8')
- 文件的讀取
await response.read()
await response.text()
await response.json()
- 獲取流式響應內容
await response.content.text()
return 信息
import aiohttp
import asyncio
async def main():
# 好像必須寫一個並發數,否則無法return
async with asyncio.Semaphore(5):
async with aiohttp.ClientSession() as session:
async with session.get("https://baidu.com") as html:
response = await html.text(encoding = 'utf-8')
return response
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
loop.close()