簡體   English   中英

Aiohttp異步會話請求

[英]Aiohttp async session requests

因此,我一直在使用會話來抓取帶有請求的網站(www.cardsphere.com)受保護的頁面,如下所示:

import requests

payload = {
            'email': <enter-email-here>,
            'password': <enter-site-password-here>
          }

with requests.Session() as request:
   requests.get(<site-login-page>)
   request.post(<site-login-here>, data=payload)
   request.get(<site-protected-page1>)
   save-stuff-from-page1
   request.get(<site-protected-page2>)
   save-stuff-from-page2
   .
   .
   .
   request.get(<site-protected-pageN>)
   save-stuff-from-pageN
the-end

現在,由於頁面很多,我想使用Aiohttp + asyncio來加速它,但是我缺少了一些東西。 我已經能夠或多或少地使用它來刮掉未受保護的頁面,如下所示:

import asyncio
import aiohttp

async def get_cards(url):
    async with aiohttp.ClientSession() as session:
        async with session.get(url) as resp:
            data = await resp.text()
            <do-stuff-with-data>

urls  = [
         'https://www.<url1>.com'
         'https://www.<url2>.com'
         .
         .
         . 
         'https://www.<urlN>.com'
        ]

loop = asyncio.get_event_loop()
loop.run_until_complete(
    asyncio.gather(
        *(get_cards(url) for url in urls)
    )
)

那給出了一些結果,但是對於需要登錄的頁面我該怎么辦呢? 我嘗試在異步函數內添加session.post(<login-url>,data=payload) ,但顯然效果不佳,它將一直保持登錄狀態。在之前有沒有辦法“設置” aiohttp ClientSession循環功能? 由於我需要先登錄,然后在同一會話中,使用asyncio + aiohttp從一堆受保護的鏈接中獲取數據?

對於python來說還是相當新的東西,所以異步甚至更多,我在這里缺少一些關鍵概念。 如果有人能指出正確的方向,我將不勝感激。

這是我能想到的最簡單的方法,具體取決於您在<do-stuff-with-data>您可能會遇到其他一些有關並發的麻煩,您可能會遇到麻煩……只是在開玩笑,有點將您的頭緒圍繞在承諾,承諾和任務上會更加復雜,但是一旦獲得,它就像順序編程一樣簡單

import asyncio
import aiohttp


async def get_cards(url, session, sem):
    async with sem, session.get(url) as resp:
        data = await resp.text()
        # <do-stuff-with-data>


urls = [
    'https://www.<url1>.com',
    'https://www.<url2>.com',
    'https://www.<urlN>.com'
]


async def main():
    sem = asyncio.Semaphore(100)
    async with aiohttp.ClientSession() as session:
        await session.get('auth_url')
        await session.post('auth_url', data={'user': None, 'pass': None})
        tasks = [asyncio.create_task(get_cards(url, session, sem)) for url in urls]
        results = await asyncio.gather(*tasks)
        return results


asyncio.run(main())

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM