asyncioとaiohttpに基づいて非同期爬虫類を実現

1471 ワード

今まで爬虫類を使っていたpython 2.7,サードパーティフレームを使わないとマルチスレッドで爬虫効率を上げるしかありません.python 3と聞いてから5原生は非同期を持ってきて、それを実現して、効果は悪くありません.
asyncioを使用してrequestsライブラリと爬虫しようとしたが、requests同期ブロックのため非同期化できなかった.Googleはpythonでaiohttpが非同期化できることを知った.
添付公式ドキュメント:aiohttp公式ドキュメント
コードの一部は次のとおりです.
asyncio
import asyncio

loop = asyncio.get_event_loop()
tasks = [    
    do_something() #       
    for i in range(5) #         ,       5 
]
loop.run_until_complete(asyncio.wait(tasks))
loop.close()

aiohttp
import aiohttp

# http post    ,          ,   requests   ,     
async with aiohttp.ClientSession() as session:
    async with session.post(url=url, data=formData, headers=headers) as response:
          r = await response.text()
    ...
    pass

async && await
python 3.5以降、キーワードasyncとawaitのキーワードも導入され、メソッドの前にasyncが書かれていない場合は、メソッド内でawaitを定義できません.
async:非同期メソッドdefを指定する前に、@asyncioに等しいと書きます.coroutine
async def doSomething():
    ...
    pass

await:このメソッドを呼び出す前に、yield fromに等しいと書きます.
async def other_field():
    await doSomething()
    ...
    pass

その後、上記のコードを統合し、自分のビジネスロジックコードと組み合わせて、非同期操作を実現することができます.テストを経て、この方法はマルチスレッドよりも力を入れます.同じサイトでは、以前は10スレッドを開いていたが、1分で300本程度のデータしか登れなかった.上記の方法で1分後に1000本程度登ることができます.
python 2で7で非同期を使用するには、サードパーティ製のフレームワークを使用する必要があります.celeryをお勧めしますが、メッセージの仲介者が必要です.メッセージキューが必要であることに等しく、公式ドキュメントではrabbitMQの使用を推奨しています.後で分析します