python如何提升爬虫效率

  

<强>单线程+多任务异步协程
  

  
      <李>协程李   
  

在函数(特殊函数)定义的时候,使用异步修饰,函数调用后,内部语句不会立即执行,而是会返回一个协程对象

  
      <李>任务对象李   
  

任务对象=高级的协程对象(进一步封装)=特殊的函数
  任务对象必须要注册到时间循环对象中
  给任务对象绑定回调:爬虫的数据解析中

  
      <李>事件循环李   
  

当做是一个装载任务对象的容器
  当启动事件循环对象的时候,存储在内的任务对象会异步执行

  
      <李>特殊函数内部不能写不支持异步请求的模块,如时间,请求…否则虽然不报错但实现不了异步李   
  

时间。睡眠——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如何提升爬虫效率