相关链接:
    一、高性能异步爬虫
   
    
     本章节学习目的:在爬虫中使用异步实现高性能的数据爬取操作。
    
   
    
     
      1.1、
     
     
      异步爬虫的方式
     
     
      :
     
    
   
    
     1、多线程,多进程(不建议):
    
   
    
     好处:可以为相关阻塞的操作单独开启线程或进程,阻塞操作就可以异步操作执行。
    
   
    
     弊端:无法无限制的开启多线程或多进程。
    
   
    
     2、线程池、进程池(适当的使用):
    
   
    
     好处:我们可以降低系统对进程或线程创建和销毁的频率,从而很好的降低系统的开销。
    
   
    
     弊端:池中线程或进程的数量是有上限。
    
   
    
     
      
       线程池的基本使用
      
     
     
      
       :
      
     
    
   
    
     
      
       步骤1
      
     
     
      
       :导入线程池模块对应的类
      
     
     
      
       :from multiprocessing.dump import Pool (
      
     
     
      
       pool应用到阻塞操作处
      
     
     
      
       )
      
     
    
   
    
     
      
       步骤2
      
     
     
      
       :实例化一个线程池对象
      
     
     
     
     
      
       pool
      
     
     
      
       =
      
     
     
      
       Pool
      
     
     
      
       (4)
      
     
    
   
    
     
      
       步骤3
      
     
     
      
       :使用线程池处理这些操作
      
     
     
     
     
      
       pool
      
     
     
      
       .map(
      
     
     
      
       get
      
     
     
      
       _page,name_list)(
      
     
     
      
       将列表中每一个列表元素传递给阻塞操作
      
     
     
      
       (get_page)
      
     
     
      
       处理
      
     
     
      
       。
      
     
    
   
    
     线程池使用基本原则:线程池处理的是阻塞且耗时的操作。
    
   
    
     3、
     
      
       单线程
      
     
     
      
       +
      
     
     
      
       异步协程
      
     
     
      
       (
      
     
     
      
       推荐
      
     
     
      
       )
      
     
     :
    
   
    
     协程相关概念:
    
   
    
     event_loop:事件循环,相当于无限循环,我们可以把一些函数注册到这个事件循环上,当满足某些条件的时候,函数就会被循环执行。
    
   
    
     coroutine:协程对象,我们可以将协程对象注册到事件循环中,它会被事件循环调用。我们可以使用async关键字来定义一个方法,这个方法在调用时不会立即被执行,而是返回一个协程对象。
    
   
    
     task:任务,它是对协程对象的进一步封装,包含了任务的各个状态。
    
   
    
     future:代表将来执行或还没有执行的任务,实际上和task没有本质区别。
    
   
    
     async:定义一个协程。
    
   
    
     await:用来挂起阻塞方法的执行。
    
   
    
     
      在异步协程中,如果出现了同步模块相同的代码
     
     
      ,
     
     
      那么就无法实现异步
     
     。(request.get是基于同步,必须使用基于异步的网络请求模块进行指定url的请求发送——
     
      aiohttp
     
     
      :
     
     
      基于异步网络请求的模块
     
     )
    
   
    
     二、动态加载数据处理
    
   
    
     
      2.
     
     
      1、
     
     
      selenium模块
     
    
   
    
     selenium模块和爬虫之间的关系:
    
   
    
     —便捷的获取网络中动态加载的数据。
    
   
    
     —便捷实现模拟登陆
    
   
    
     什么是selenium模块?
    
   
    
     基于浏览器自动化的一个模块。(浏览器自动化:可以通过编写代码,让代码表示行为动作,让代码操作浏览器,实现浏览器自动化的操作)
    
   
    
     selenium使用流程:
    
   
    
     —环境安装:pip install selenium
    
   
    
     —下载一个浏览器的驱动程(http://chromedriver.storage.googleapis.com/index.html)
    
   
    
     —驱动程序和浏览器的映射关系         (https://blog.csdn.net/huilan_same/article/details/51896672)
    
   
    
     —实例化一个浏览器对象
    
   
    
     —编写基于浏览器自动化的操作代码
    
   
    
     
      2.2、
     
     
      seleium其他自动化操作
     
    
   
    
     发起请求:get(url)
    
   
    
     标签定位:find系列方法
    
   
    
     标签交互:send_keys(‘xxx’)
    
   
    
     执行js程序:excute_script(‘jsCode’)
    
   
    
     前进,后退:back(),forward()
    
   
    
     关闭浏览器:quit()
    
   
    
     
      2.
     
     
      3、
     
     
      selenium处理iframe
     
    
   
    
     如果定位的标签是存在于iframe标签之中的则必须通过如下操作进行标签定位:
    
   
    
     bro.
     
      
       switch_to.frame(‘iframeReuslt’)
      
     
     # 切换浏览器标签定位的作用域
    
   
    
     动作链(拖动):
     
      
       from
      
     
     
     
     
      
       selenium
      
     
     
      
       .webrive import ActionChains(
      
     
     
      
       导入动作链对应的类
      
     
     
      
       )
      
     
    
   
    
     —实例化一个动作链对象:action = ActionChains(bro)
    
   
    
     —click_and_hild(div) :长按且点击操作
    
   
    
     —move_by_offset(x,y)
    
   
    
     —perform()让动作链立即执行
    
   
    
     —action.release() 释放动作链对象
    
   
 
