<强>单线程+多任务异步协程
强>
-
<李>协程李>
在函数(特殊函数)定义的时候,使用异步修饰,函数调用后,内部语句不会立即执行,而是会返回一个协程对象
-
<李>任务对象李>
任务对象=高级的协程对象(进一步封装)=特殊的函数
任务对象必须要注册到时间循环对象中
给任务对象绑定回调:爬虫的数据解析中
-
<李>事件循环李>
当做是一个装载任务对象的容器
当启动事件循环对象的时候,存储在内的任务对象会异步执行
-
<李>特殊函数内部不能写不支持异步请求的模块,如时间,请求…否则虽然不报错但实现不了异步李>
时间。睡眠——asyncio。睡眠
请求——aiohttp
进口asyncio 导入的时间 start_time=time.time () 异步def get_request (url): 等待asyncio.sleep (2) 打印(url”,下载完成!”) url=[ “www.1.com”, “www.2.com”, ] task_lst=[] #任务对象列表 为在url网址: c=get_request (url) #协程对象 任务=asyncio.ensure_future (c) #任务对象 # task.add_done_callback(…) #绑定回调 task_lst.append(任务) 循环=asyncio.get_event_loop() #事件循环对象 loop.run_until_complete (asyncio.wait (task_lst) #注册,手动挂起
<强>线程池+请求模块强>
#线程池 导入的时间 多处理。假进口池 start_time=time.time () url_list=[ “www.1.com”, “www.2.com”, “www.3.com”, ] def get_request (url): 打印(“正在下载…”,url) time . sleep (2) 打印(“下载完成!”,url) 池=池(3) pool.map (get_request url_list) 打印(“总耗时:“,time.time () -start_time)
<强>两个方法提升爬虫效率强>
起一个烧瓶服务端
从进口瓶瓶 导入的时间 应用=瓶(__name__) @app.route('/波波') def index_bobo (): time . sleep (2) 返回“你好波波!” @app.route ('/jay ') def index_jay (): time . sleep (2) 返回“你好周杰伦!” @app.route(汤姆'/') def index_tom (): time . sleep (2) 返回“你好,汤姆!” if __name__==癬_main__”: app.run(螺纹=True)
aiohttp模块+单线程多任务异步协程
进口asyncio 进口aiohttp 进口的要求 导入的时间 开始=time.time () 异步def get_page (url): # page_text=requests.get (url=url)。text #打印(page_text) #返回page_text 异步aiohttp.ClientSession()年代:#生成一个会话对象 异步与等待s.get (url=url)作为回应: page_text=等待response.text () 打印(page_text) 返回page_text url=[ “http://127.0.0.1:5000波波”, “http://127.0.0.1:5000杰”, “http://127.0.0.1:5000汤姆”, ] 任务=[] 为在url网址: c=get_page (url) 任务=asyncio.ensure_future (c) tasks.append(任务) 循环=asyncio.get_event_loop () loop.run_until_complete (asyncio.wait(任务) 结束=time.time () 打印(end-start) #异步执行! #你好,汤姆! #你好波波! #你好周杰伦! # 2.0311079025268555
“‘ aiohttp模块实现单线程+多任务异步协程 并用xpath解析数据 “‘ 进口aiohttp 进口asyncio 从lxml进口etree 导入的时间 开始=time.time () #特殊函数:请求的发送和数据的捕获 #注意与等待异步关键字 异步def get_request (url): 异步与aiohttp.ClientSession()年代: 异步与等待s.get (url=url)作为回应: page_text=等待response.text () 返回page_text #返回页面源码 #回调函数,解析数据 def解析(任务): page_text=task.result () 树=etree.HTML (page_text) 味精=tree.xpath ('/html/身体/ul//text () ') 打印(味精) url=[ “http://127.0.0.1:5000波波”, “http://127.0.0.1:5000杰”, “http://127.0.0.1:5000汤姆”, ] 任务=[] 为在url网址: c=get_request (url) 任务=asyncio.ensure_future (c) task.add_done_callback(解析)#绑定回调函数! tasks.append(任务) 循环=asyncio.get_event_loop () loop.run_until_complete (asyncio.wait(任务) 结束=time.time () 打印(end-start)python如何提升爬虫效率