強大的aiohttp異步爬蟲的使用


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()


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM