电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Python 爬蟲性能相關總結

瀏覽:3日期:2022-07-15 11:55:47

這里我們通過請求網頁例子來一步步理解爬蟲性能

當我們有一個列表存放了一些url需要我們獲取相關數據,我們首先想到的是循環

簡單的循環串行

這一種方法相對來說是最慢的,因為一個一個循環,耗時是最長的,是所有的時間總和代碼如下:

import requestsurl_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)

通過線程池

通過線程池的方式訪問,這樣整體的耗時是所有連接里耗時最久的那個,相對循環來說快了很多

import requestsfrom concurrent.futures import ThreadPoolExecutordef 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)

線程池+回調函數

這里定義了一個回調函數callback

from concurrent.futures import ThreadPoolExecutorimport requestsdef fetch_async(url): response = requests.get(url) return responsedef 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操作,所以這里線程池比進程池更好

import requestsfrom concurrent.futures import ProcessPoolExecutordef 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)

進程池+回調函數

這種方式和線程+回調函數的效果是一樣的,相對來說開進程比開線程浪費資源

from concurrent.futures import ProcessPoolExecutorimport requestsdef fetch_async(url): response = requests.get(url) return responsedef 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()

主流的單線程實現并發的幾種方式

asyncio gevent Twisted Tornado

下面分別是這四種代碼的實現例子:

asyncio例子1:

import asyncio@asyncio.coroutine #通過這個裝飾器裝飾def func1(): print(’before...func1......’) # 這里必須用yield from,并且這里必須是asyncio.sleep不能是time.sleep yield from asyncio.sleep(2) print(’end...func1......’)tasks = [func1(), func1()]loop = asyncio.get_event_loop()loop.run_until_complete(asyncio.gather(*tasks))loop.close()

上述的效果是同時會打印兩個before的內容,然后等待2秒打印end內容這里asyncio并沒有提供我們發送http請求的方法,但是我們可以在yield from這里構造http請求的方法。

asyncio例子2:

import asyncio@asyncio.coroutinedef fetch_async(host, url=’/’): print('----',host, url) reader, writer = yield from asyncio.open_connection(host, 80) #構造請求頭內容 request_header_content = '''GET %s HTTP/1.0rnHost: %srnrn''' % (url, host,) request_header_content = bytes(request_header_content, encoding=’utf-8’) #發送請求 writer.write(request_header_content) yield from writer.drain() text = yield from reader.read() print(host, url, text) writer.close()tasks = [ fetch_async(’www.cnblogs.com’, ’/zhaof/’), fetch_async(’dig.chouti.com’, ’/pic/show?nid=4073644713430508&lid=10273091’)]loop = asyncio.get_event_loop()results = loop.run_until_complete(asyncio.gather(*tasks))loop.close()

asyncio + aiohttp 代碼例子:

import aiohttpimport asyncio@asyncio.coroutinedef fetch_async(url): print(url) response = yield from aiohttp.request(’GET’, url) print(url, response) response.close()tasks = [fetch_async(’http://baidu.com/’), fetch_async(’http://www.chouti.com/’)]event_loop = asyncio.get_event_loop()results = event_loop.run_until_complete(asyncio.gather(*tasks))event_loop.close()

asyncio+requests代碼例子

import asyncioimport requests@asyncio.coroutinedef fetch_async(func, *args): loop = asyncio.get_event_loop() future = loop.run_in_executor(None, func, *args) response = yield from future print(response.url, response.content)tasks = [ fetch_async(requests.get, ’http://www.cnblogs.com/wupeiqi/’), fetch_async(requests.get, ’http://dig.chouti.com/pic/show?nid=4073644713430508&lid=10273091’)]loop = asyncio.get_event_loop()results = loop.run_until_complete(asyncio.gather(*tasks))loop.close()

gevent+requests代碼例子

import geventimport requestsfrom gevent import monkeymonkey.patch_all()def fetch_async(method, url, req_kwargs): print(method, url, req_kwargs) response = requests.request(method=method, url=url, **req_kwargs) print(response.url, response.content)# ##### 發送請求 #####gevent.joinall([ gevent.spawn(fetch_async, method=’get’, url=’https://www.python.org/’, req_kwargs={}), gevent.spawn(fetch_async, method=’get’, url=’https://www.yahoo.com/’, req_kwargs={}), gevent.spawn(fetch_async, method=’get’, url=’https://github.com/’, req_kwargs={}),])# ##### 發送請求(協程池控制最大協程數量) ###### from gevent.pool import Pool# pool = Pool(None)# gevent.joinall([# pool.spawn(fetch_async, method=’get’, url=’https://www.python.org/’, req_kwargs={}),# pool.spawn(fetch_async, method=’get’, url=’https://www.yahoo.com/’, req_kwargs={}),# pool.spawn(fetch_async, method=’get’, url=’https://www.github.com/’, req_kwargs={}),# ])

grequests代碼例子這個是講requests+gevent進行了封裝

import grequestsrequest_list = [ grequests.get(’http://httpbin.org/delay/1’, timeout=0.001), grequests.get(’http://fakedomain/’), grequests.get(’http://httpbin.org/status/500’)]# ##### 執行并獲取響應列表 ###### response_list = grequests.map(request_list)# print(response_list)# ##### 執行并獲取響應列表(處理異常) ###### def exception_handler(request, exception):# print(request,exception)# print('Request failed')# response_list = grequests.map(request_list, exception_handler=exception_handler)# print(response_list)

twisted代碼例子

#getPage相當于requets模塊,defer特殊的返回值,rector是做事件循環from twisted.web.client import getPage, deferfrom twisted.internet import reactordef all_done(arg): reactor.stop()def callback(contents): print(contents)deferred_list = []url_list = [’http://www.bing.com’, ’http://www.baidu.com’, ]for url in url_list: deferred = getPage(bytes(url, encoding=’utf8’)) deferred.addCallback(callback) deferred_list.append(deferred)#這里就是進就行一種檢測,判斷所有的請求知否執行完畢dlist = defer.DeferredList(deferred_list)dlist.addBoth(all_done)reactor.run()

tornado代碼例子

from tornado.httpclient import AsyncHTTPClientfrom tornado.httpclient import HTTPRequestfrom tornado import ioloopdef handle_response(response): ''' 處理返回值內容(需要維護計數器,來停止IO循環),調用 ioloop.IOLoop.current().stop() :param response: :return: ''' if response.error: print('Error:', response.error) else: print(response.body)def func(): url_list = [ ’http://www.baidu.com’, ’http://www.bing.com’, ] for url in url_list: print(url) http_client = AsyncHTTPClient() http_client.fetch(HTTPRequest(url), handle_response)ioloop.IOLoop.current().add_callback(func)ioloop.IOLoop.current().start()

以上就是Python 爬蟲性能相關總結的詳細內容,更多關于Python 爬蟲性能的資料請關注好吧啦網其它相關文章!

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 安德建奇火花机-阿奇夏米尔慢走丝|高维|发那科-北京杰森柏汇 | 托盘租赁_塑料托盘租赁_托盘出租_栈板出租_青岛托盘租赁-优胜必达 | Maneurop/美优乐压缩机,活塞压缩机,型号规格,技术参数,尺寸图片,价格经销商 | 山东商品混凝土搅拌楼-环保型搅拌站-拌合站-分体仓-搅拌机厂家-天宇 | 微学堂-电动能源汽车评测_电动车性能分享网 | OLChemim试剂-ABsciex耗材-广州市自力色谱科仪有限公司 | 莱州网络公司|莱州网站建设|莱州网站优化|莱州阿里巴巴-莱州唯佳网络科技有限公司 | 工作心得_读书心得_学习心得_找心得体会范文就上学道文库 | 温湿度记录纸_圆盘_横河记录纸|霍尼韦尔记录仪-广州汤米斯机电设备有限公司 | 双杰天平-国产双杰电子天平-美国双杰-常熟双杰仪器 | 手机存放柜,超市储物柜,电子储物柜,自动寄存柜,行李寄存柜,自动存包柜,条码存包柜-上海天琪实业有限公司 | 破碎机锤头_耐磨锤头_合金锤头-鼎成机械一站式耐磨铸件定制服务 微型驱动系统解决方案-深圳市兆威机电股份有限公司 | 北京自然绿环境科技发展有限公司专业生产【洗车机_加油站洗车机-全自动洗车机】 | 螺旋丝杆升降机-SWL蜗轮-滚珠丝杆升降机厂家-山东明泰传动机械有限公司 | 附着力促进剂-尼龙处理剂-PP处理剂-金属附着力处理剂-东莞市炅盛塑胶科技有限公司 | 工业机械三维动画制作 环保设备原理三维演示动画 自动化装配产线三维动画制作公司-南京燃动数字 聚合氯化铝_喷雾聚氯化铝_聚合氯化铝铁厂家_郑州亿升化工有限公司 | DNA亲子鉴定_DNA基因检测中心官方预约平台-严选好基因网 | hc22_hc22价格_hc22哈氏合金—东锜特殊钢 | 股票入门基础知识_股票知识_股票投资大师_格雷厄姆网 | 作文导航网_作文之家_满分作文_优秀作文_作文大全_作文素材_最新作文分享发布平台 | EDLC超级法拉电容器_LIC锂离子超级电容_超级电容模组_软包单体电容电池_轴向薄膜电力电容器_深圳佳名兴电容有限公司_JMX专注中高端品牌电容生产厂家 | 粘度计维修,在线粘度计,二手博勒飞粘度计维修|收购-天津市祥睿科技有限公司 | 黑田精工电磁阀-CAMMOZI气缸-ROSS电磁-上海茂硕机械设备有限公司 | 车充外壳,车载充电器外壳,车载点烟器外壳,点烟器连接头,旅行充充电器外壳,手机充电器外壳,深圳市华科达塑胶五金有限公司 | 汽车润滑油厂家-机油/润滑油代理-高性能机油-领驰慧润滑科技(河北)有限公司 | 智能垃圾箱|垃圾房|垃圾分类亭|垃圾分类箱专业生产厂家定做-宿迁市传宇环保设备有限公司 | 小威小说网 - 新小威小说网 - 小威小说网小说搜索引擎 | 油缸定制-液压油缸厂家-无锡大鸿液压气动成套有限公司 | 合肥升降机-合肥升降货梯-安徽升降平台「厂家直销」-安徽鼎升自动化科技有限公司 | 洛阳永磁工业大吊扇研发生产-工厂通风降温解决方案提供商-中实洛阳环境科技有限公司 | 金刚网,金刚网窗纱,不锈钢网,金刚网厂家- 河北萨邦丝网制品有限公司 | 温州中研白癜风专科_温州治疗白癜风_温州治疗白癜风医院哪家好_温州哪里治疗白癜风 | 青岛球场围网,青岛车间隔离网,青岛机器人围栏,青岛水源地围网,青岛围网,青岛隔离栅-青岛晟腾金属制品有限公司 | 二手光谱仪维修-德国OBLF光谱仪|进口斯派克光谱仪-热电ARL光谱仪-意大利GNR光谱仪-永晖检测 | 广州展台特装搭建商|特装展位设计搭建|展会特装搭建|特装展台制作设计|展览特装公司 | 防勒索软件_数据防泄密_Trellix(原McAfee)核心代理商_Trellix(原Fireeye)售后-广州文智信息科技有限公司 | 蓝米云-专注于高性价比香港/美国VPS云服务器及海外公益型免费虚拟主机 | 120kv/2mA直流高压发生器-60kv/2mA-30kva/50kv工频耐压试验装置-旭明电工 | 长沙中央空调维修,中央空调清洗维保,空气能热水工程,价格,公司就找维小保-湖南维小保环保科技有限公司 | 行星搅拌机,双行星搅拌机,动力混合机,无锡米克斯行星搅拌机生产厂家 | 臭氧实验装置_实验室臭氧发生器-北京同林臭氧装置网 |