Python3爬虫(十二) 爬虫性能
Infi-chu:
http://www.cnblogs.com/Infi-chu/
一、简单的循环串行
一个一个循环,耗时是最长的,是所有的时间综合
1 2 3 4 5 6 7 8 9 10 | import requests url_list = [ 'http://www.baidu.com' , 'http://www.pythonsite.com' , 'http://www.cnblogs.com/' ] for url in url_list: result = requests.get(url) print (result.text) |
二、通过线程池
整体耗时是所有连接里耗时最久的那个,相对于循环来说快了不少
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | import requests from concurrent.futures import ThreadPoolExecutor def fetch_request(url): result = requests.get(url) print (result.text) url_list = [ 'http://www.baidu.com' , 'http://www.bing.com' , 'http://www.cnblogs.com/' ] pool = ThreadPoolExecutor( 10 ) for url in url_list: #去线程池中获取一个线程,线程去执行fetch_request方法 pool.submit(fetch_request,url) pool.shutdown( True ) |
三、线程池+回调函数
定义了一个回调函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | from concurrent.futures import ThreadPoolExecutor import requests def fetch_async(url): response = requests.get(url) return response def callback(future): print (future.result().text) url_list = [ 'http://www.baidu.com' , 'http://www.bing.com' , 'http://www.cnblogs.com/' ] pool = ThreadPoolExecutor( 5 ) for url in url_list: v = pool.submit(fetch_async,url) #这里调用回调函数 v.add_done_callback(callback) pool.shutdown() |
四、通过进程池
进程池的方式访问,同样的也是取决于耗时最长的,但是相对于线程来说,进程需要耗费更多的资源,同时这里是访问url时IO操作,所以这里线程池比进程池更好
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | import requests from concurrent.futures import ProcessPoolExecutor def fetch_request(url): result = requests.get(url) print (result.text) url_list = [ 'http://www.baidu.com' , 'http://www.bing.com' , 'http://www.cnblogs.com/' ] pool = ProcessPoolExecutor( 10 ) for url in url_list: #去进程池中获取一个线程,子进程程去执行fetch_request方法 pool.submit(fetch_request,url) pool.shutdown( True ) |
五、进程池+回调函数
这种方式和线程+回调函数的效果是一样的,相对来说开进程比开线程浪费资源
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | from concurrent.futures import ProcessPoolExecutor import requests def fetch_async(url): response = requests.get(url) return response def callback(future): print (future.result().text) url_list = [ 'http://www.baidu.com' , 'http://www.bing.com' , 'http://www.cnblogs.com/' ] pool = ProcessPoolExecutor( 5 ) for url in url_list: v = pool.submit(fetch_async, url) # 这里调用回调函数 v.add_done_callback(callback) pool.shutdown() |
标签:
Python爬虫
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· ThreeJs-16智慧城市项目(重磅以及未来发展ai)
· .NET 原生驾驭 AI 新基建实战系列(一):向量数据库的应用与畅想
· Ai满嘴顺口溜,想考研?浪费我几个小时
· Browser-use 详细介绍&使用文档
· 软件产品开发中常见的10个问题及处理方法