Python 有人知道我如何让代码运行得更快吗?
我已经完成了一个网络刮板,将通过Roblox,并挑选出在Roblox上创建的前1000个帐户的所有用户名。幸运的是,它起作用了!然而,也有不利的一面 我的问题是,这段代码需要绝对的时间才能完成。是否有人知道一种更有效的方法来编写同样的东西,或者这只是Python请求的基本速度?代码如下:) 附:代码只花了5分钟就通过了600个帐户Python 有人知道我如何让代码运行得更快吗?,python,performance,python-requests,Python,Performance,Python Requests,我已经完成了一个网络刮板,将通过Roblox,并挑选出在Roblox上创建的前1000个帐户的所有用户名。幸运的是,它起作用了!然而,也有不利的一面 我的问题是,这段代码需要绝对的时间才能完成。是否有人知道一种更有效的方法来编写同样的东西,或者这只是Python请求的基本速度?代码如下:) 附:代码只花了5分钟就通过了600个帐户 def find_account(id): import requests from bs4 import BeautifulSoup r
def find_account(id):
import requests
from bs4 import BeautifulSoup
r = requests.request(url=f'https://web.roblox.com/users/{id}/profile', method='get')
if r.status_code == 200:
soup = BeautifulSoup(r.text, 'html.parser')
stuff = soup.find_all('h2')
special = stuff[0]
special = list(special)
special = special[0]
return str(special) + ' ID: {}'.format(id)
else:
return None
users = []
for i in range(10000,11000):
users.append(find_account(i))
print(f'{i-9999} out of 1000 done')
#There is more below this, but that is just the GUI and stuff. This is the part that gets the usernames.
尝试异步库以异步方式尝试执行相同的操作。使用异步python的优点是,在调用下一个http调用之前,不需要等待一个http调用完成。这是一篇关于如何用python编写并发/并行代码的精彩文章,如果这里的语法令人困惑,请阅读 重构为在异步模式下运行:
导入异步IO
进口aiohttp
从bs4导入BeautifulSoup
异步def find_帐户(id,会话):
与session.get异步(f'https://web.roblox.com/users/{id}/profile')作为r:
如果r.status==200:
响应\u text=wait r.read()
soup=BeautifulSoup(响应文本'html.parser')
stuff=汤。查找所有('h2'))
特殊=材料[0]
特殊=列表(特殊)
特殊=特殊[0]
打印(完成1000个字符中的f'{id-9999}')
返回str(特殊)+'ID:{}'。格式(ID)
其他:
一无所获
异步定义爬网url id范围(最小id、最大id):
任务=[]
与aiohttp.ClientSession()作为会话异步:
对于范围内的id(最小id、最大id):
tasks.append(asyncio.sure_future(find_account(id=id,session=session)))
return wait asyncio.gather(*任务)
event\u loop=asyncio.get\u event\u loop()
用户=事件\循环。运行\直到\完成(爬网\ url \ id \范围(最小\ id=10000,最大\ id=11000))
我进行了测试,上面的代码运行得相当好。除了代码,可能是internet连接吗?我建议使用多处理,以便同时启动多个批处理,然后在最后收集所有结果。您研究过使用它了吗?这很可能会从并行化中受益匪浅。无论是多处理还是异步IO库,这里都有一篇很棒的文章,展示了每种方法的用例,根据您的python版本,可能会有不同的语法。有时您可以执行
run()
,而不是收集事件循环并运行直到完成,有时您可以使用create_task()
而不是sure_future()
。