gpt4 book ai didi

python - Aiohttp 异步 session 请求

转载 作者:行者123 更新时间:2023-12-01 01:06:57 24 4
gpt4 key购买 nike

所以我一直在使用 session 抓取网站( www.cardsphere.com ) protected 页面,如下所示:

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 来加速它......但我错过了一些东西。我已经能够或多或少地使用它来抓取不 protected 页面,如下所示:

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)在 async 函数内部,但这显然效果不佳,它只会继续登录。有没有办法在循环函数之前“设置”aiohttp ClientSession?因为我需要先登录,然后在同一个 session 中,使用 asyncio + aiohttp 从一堆 protected 链接中获取数据?

对 python 来说还是相当陌生,异步更是如此,我在这里遗漏了一些关键概念。如果有人能指出我正确的方向,我将不胜感激。

最佳答案

这是我能想到的最简单的方法,具体取决于您在<do-stuff-with-data>中所做的事情你可能会遇到一些关于并发性的其他麻烦,你会陷入兔子洞……只是开玩笑,让你的头脑围绕 coros、promise 和任务有点复杂,但一旦你明白了,它就像顺序编程一样简单

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

关于python - Aiohttp 异步 session 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55250420/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com