怎么使用PyCharm Profile分析异步爬虫效率
发表于:2024-10-31 作者:千家信息网编辑
千家信息网最后更新 2024年10月31日,这篇文章主要介绍"怎么使用PyCharm Profile分析异步爬虫效率"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"怎么使用PyCharm Profile分
千家信息网最后更新 2024年10月31日怎么使用PyCharm Profile分析异步爬虫效率
这篇文章主要介绍"怎么使用PyCharm Profile分析异步爬虫效率"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"怎么使用PyCharm Profile分析异步爬虫效率"文章能帮助大家解决问题。
第一个代码如下,就是一个普通的 for 循环爬虫。原文地址。
import requestsimport bs4from colorama import Foredef main(): get_title_range() print("Done.")def get_html(episode_number: int) -> str: print(Fore.YELLOW + f"Getting HTML for episode {episode_number}", flush=True) url = f'https://talkpython.fm/{episode_number}' resp = requests.get(url) resp.raise_for_status() return resp.textdef get_title(html: str, episode_number: int) -> str: print(Fore.CYAN + f"Getting TITLE for episode {episode_number}", flush=True) soup = bs4.BeautifulSoup(html, 'html.parser') header = soup.select_one('h2') if not header: return "MISSING" return header.text.strip()def get_title_range(): # Please keep this range pretty small to not DDoS my site. ;) for n in range(185, 200): html = get_html(n) title = get_title(html, n) print(Fore.WHITE + f"Title found: {title}", flush=True)if __name__ == '__main__': main()
这段代码跑完花了37s,然后我们用 pycharm 的 profiler 工具来具体看看哪些地方比较耗时间。
点击Profile (文件名称)
之后获取到得到一个详细的函数调用关系、耗时图:
可以看到 get_html 这个方法占了96.7%的时间。这个程序的 IO 耗时达到了97%,获取 html 的时候,这段时间内程序就在那死等着。如果我们能够让他不要在那儿傻傻地等待 IO 完成,而是开始干些其他有意义的事,就能节省大量的时间。
稍微做一个计算,试用asyncio异步抓取,能将时间降低多少?
get_html这个方法耗时36.8s,一共调用了15次,说明实际上获取一个链接的 html 的时间为36.8s / 15 = 2.4s。**要是全异步的话,获取15个链接的时间还是2.4s。**然后加上get_title这个函数的耗时0.6s,所以我们估算,改进后的程序将可以用 3s 左右的时间完成,也就是性能能够提升13倍。
再看下改进后的代码。原文地址。
import asynciofrom asyncio import AbstractEventLoopimport aiohttpimport requestsimport bs4from colorama import Foredef main(): # Create loop loop = asyncio.get_event_loop() loop.run_until_complete(get_title_range(loop)) print("Done.")async def get_html(episode_number: int) -> str: print(Fore.YELLOW + f"Getting HTML for episode {episode_number}", flush=True) # Make this async with aiohttp's ClientSession url = f'https://talkpython.fm/{episode_number}' # resp = await requests.get(url) # resp.raise_for_status() async with aiohttp.ClientSession() as session: async with session.get(url) as resp: resp.raise_for_status() html = await resp.text() return htmldef get_title(html: str, episode_number: int) -> str: print(Fore.CYAN + f"Getting TITLE for episode {episode_number}", flush=True) soup = bs4.BeautifulSoup(html, 'html.parser') header = soup.select_one('h2') if not header: return "MISSING" return header.text.strip()async def get_title_range(loop: AbstractEventLoop): # Please keep this range pretty small to not DDoS my site. ;) tasks = [] for n in range(190, 200): tasks.append((loop.create_task(get_html(n)), n)) for task, n in tasks: html = await task title = get_title(html, n) print(Fore.WHITE + f"Title found: {title}", flush=True)if __name__ == '__main__': main()
同样的步骤生成profile 图:
可见现在耗时为大约3.8s,基本符合我们的预期了。
关于"怎么使用PyCharm Profile分析异步爬虫效率"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注行业资讯频道,小编每天都会为大家更新不同的知识点。
时间
爬虫
效率
分析
代码
方法
知识
程序
函数
原文
地址
实际
行业
链接
不同
实用
普通
也就是
内容
名称
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
南京软件开发流程
汉子注音软件开发
科技 互联网 养老
网易我的世界服务器32开怎么弄
常规网络安全配置
文旅部人才中心数据库
委托企业软件开发合同范本
服务器 cpu过高
浪潮服务器怎么开启网口
网络安全责任实施办法
贝拉日记软件开发
网络安全宣传周文件
衡水网络技术市场报价
天津软件开发月收入多少钱
服务器出现异常什么原因
高校网络安全答题答案
航路数据库没有EDDT
我的世界服务器经验
东营联想服务器总代理销售电话
汽车车载网络技术数据总线
张涛网络安全
自考报名服务器过后要交钱续期吗
软件开发工具2020年10月
互联网金融 金融科技
怎么下载服务器的系统
网络安全讲读观后感
洛阳帝都网络技术
普元信息应用服务器的优缺点
东营联想服务器总代理销售电话
华为弹性服务器怎么登录