day26 -爬虫-selenium、phantonJs

一、图片懒加载

图片懒加载概念:

图片懒加载是一种网页优化技术。图片作为一种网络资源,在被请求时也与普通静态资源一样,将占用网络资源,而一次性将整个页面的所有图片加载完,将大大增加页面的首屏加载时间。为了解决这种问题,通过前后端配合,使图片仅在浏览器当前视窗内出现时才加载该图片,达到减少首屏图片请求数的技术就被称为“图片懒加载”。

网站一般如何实现图片懒加载技术呢?

在网页源码中,在img标签中首先会使用一个“伪属性”(通常使用src2,original......)去存放真正的图片链接而并非是直接存放在src属性中。当图片出现到页面的可视化区域中,会动态将伪属性替换成src属性,完成图片的加载。

二.selenium

什么是selenium?
是Python的一个第三方库,对外提供的接口可以操作浏览器,然后让浏览器完成自动化的操作。  

环境搭建

安装selenum:pip install selenium

获取某一款浏览器的驱动程序(以谷歌浏览器为例)

谷歌浏览器驱动下载地址:http://chromedriver.storage.googleapis.com/index.html

下载的驱动程序必须和浏览器的版本统一,大家可以根据http://blog.csdn.net/huilan_same/article/details/51896672中提供的版本映射表进行对应

 

#导包
from selenium import webdriver  
#创建浏览器对象,通过该对象可以操作浏览器
browser = webdriver.Chrome('驱动路径')
#使用浏览器发起指定请求
browser.get(url)

#使用下面的方法,查找指定的元素进行操作即可
    find_element_by_id            根据id找节点
    find_elements_by_name         根据name找
    find_elements_by_xpath        根据xpath查找
    find_elements_by_tag_name     根据标签名找
    find_elements_by_class_name   根据class名字查找
from selenium import webdriver
import time
#1.创建一个浏览器对象
bro = webdriver.Chrome(executable_path=r"C:\Users\Administrator\Desktop\爬虫02\chromedriver.exe")

#2.打开浏览器
url = 'https://www.baidu.com/'
bro.get(url=url)
time.sleep(3)

#3.调用seleniem提供的接口
#找到了指定搜索框
myInput = bro.find_element_by_id("kw")
#在对应的搜索框中录入指定的词条
myInput.send_keys("人民币")
time.sleep(5)
#定位到搜索按钮
myButton = bro.find_element_by_id('su')
myButton.click()

time.sleep(5)

#关闭浏览器
bro.quit()
示例1

三.phantomJs

  • PhantomJS是一款无界面的浏览器,其自动化操作流程和上述操作谷歌浏览器是一致的。由于是无界面的,为了能够展示自动化操作流程,PhantomJS为用户提供了一个截屏的功能,使用save_screenshot函数实现。
  • from selenium import webdriver
    import time
    
    # 1.创建一个浏览器对象
    # bro = webdriver.Chrome(executable_path=r"C:\Users\Administrator\Desktop\爬虫02\chromedriver.exe")
    bro = webdriver.PhantomJS(executable_path=r"F:\Python自动化21期\3.Django&项目\phantomjs-2.1.1-windows\bin\phantomjs.exe")
    # 2.打开浏览器
    url = 'https://www.baidu.com/'
    bro.get(url=url)
    time.sleep(3)
    # 截图
    bro.save_screenshot('./1.png')
    # 3.调用seleniem提供的接口
    # 找到了指定搜索框
    myInput = bro.find_element_by_id("kw")
    # 在对应的搜索框中录入指定的词条
    myInput.send_keys("人民币")
    time.sleep(5)
    bro.save_screenshot('./2.png')
    # 定位到搜索按钮
    myButton = bro.find_element_by_id('su')
    myButton.click()
    
    time.sleep(5)
    bro.save_screenshot('./3.png')
    # 关闭浏览器
    bro.quit()
    示例

    重点:selenium+phantomjs 就是爬虫终极解决方案:有些网站上的内容信息是通过动态加载js形成的,所以使用普通爬虫程序无法回去动态加载的js内容。例如豆瓣电影中的电影信息是通过下拉操作动态加载更多的电影信息。

    • 综合操作:需求是尽可能多的爬取豆瓣网中的电影信息

    • from selenium import webdriver
      from time import sleep
      import time
      
      if __name__ == '__main__':
          url = 'https://movie.douban.com/typerank?type_name=%E6%81%90%E6%80%96&type=20&interval_id=100:90&action='
          # 发起请求前,可以让url表示的页面动态加载出更多的数据
          path = r'C:\Users\Administrator\Desktop\爬虫授课\day05\ziliao\phantomjs-2.1.1-windows\bin\phantomjs.exe'
          # 创建无界面的浏览器对象
          bro = webdriver.PhantomJS(path)
          # 发起url请求
          bro.get(url)
          time.sleep(3)
          # 截图
          bro.save_screenshot('1.png')
      
          # 执行js代码(让滚动条向下偏移n个像素(作用:动态加载了更多的电影信息))
          js = 'window.scrollTo(0,document.body.scrollHeight)'
          bro.execute_script(js)  # 该函数可以执行一组字符串形式的js代码
          time.sleep(2)
      
          bro.execute_script(js)  # 该函数可以执行一组字符串形式的js代码
          time.sleep(2)
          bro.save_screenshot('2.png') 
          time.sleep(2) 
          # 使用爬虫程序爬去当前url中的内容 
          html_source = bro.page_source # 该属性可以获取当前浏览器的当前页的源码(html) 
          with open('./source.html', 'w', encoding='utf-8') as fp: 
              fp.write(html_source) 
          bro.quit()
      豆瓣
       
    • #需求:梨视频中爬取更多的视频数据(动态加载)
    • 思路:通过js加载出更多的数据,获取数据源码数据,对弹出的视频数据进行解析(对url发起请求,获取二级页面的页面数据),对获取的图片找到对应的js代码进行视频数据的加载(界面开发者模式打开输入mp4)!
    • #需求:爬取更多的视频数据(动态加载)
      import requests
      from selenium import webdriver
      from lxml import etree
      import re
      #1.创建一个无头浏览器
      bro = webdriver.PhantomJS(executable_path=r"F:\Python自动化21期\3.Django&项目\phantomjs-2.1.1-windows\bin\phantomjs.exe")
      
      #2.根据指定的url打开浏览器
      bro.get(url="http://www.pearvideo.com/category_6")
      
      #3.滚轮向下拖动,加载出更多的视频数据(执行js代码)
      js = "window.scrollTo(0,document.body.scrollHeight)"
      bro.execute_script(js) #让浏览器执行一组js代码
      
      #4.获取页面源码数据,进行解析操作
      page_text = bro.page_source#该属性可以获得当前浏览器对应的页面数据
      
      #使用xpath进行解析操作
      tree = etree.HTML(page_text)
      li_list = tree.xpath('//li[@class="categoryem"]')
      headers = {
          'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'
      }
      for li in li_list:
          secondPage_url = "http://www.pearvideo.com/"+li.xpath('./div/a/@href')[0]#./div 点表示定位到当前,一定要加
          #对上述url发起请求,获取二级页面的页面数据
          page_text = requests.get(url=secondPage_url,headers=headers).text#获取的图片路径
          video_url = re.findall('srcUrl="(.*?)",',page_text,re.S)[0] #S将整个页面源码当做一个字符串,正则作用于一整个大字符串! srcUrl中内容是想要数据,可以加一个括号进行分组!
          videoData = requests.get(url=video_url,headers=headers).content
          fileName = video_url.split('/')[-1]
          with open(fileName,'wb') as fp:
              fp.write(videoData)
              print(fileName+'已经被下载完毕')
          
      pear

      四.谷歌无头浏览器

      • 由于PhantomJs最近已经停止了更新和维护,所以推荐大家可以使用谷歌的无头浏览器,是一款无界面的谷歌浏览器。
      • 代码展示:
      • from selenium import webdriver
        from selenium.webdriver.chrome.options import Options
        import time
        
        # 创建一个参数对象,用来控制chrome以无界面模式打开
        chrome_options = Options()
        chrome_options.add_argument('--headless')
        chrome_options.add_argument('--disable-gpu')
        # 驱动路径
        path = r'F:\selenium周末精品班\安装包\chromedriver.exe'
        
        # 创建浏览器对象
        browser = webdriver.Chrome(executable_path=path, chrome_options=chrome_options)
        
        # 上网
        url = 'http://www.baidu.com/'
        browser.get(url)
        time.sleep(3)
        
        browser.save_screenshot('baidu.png')
        
        browser.quit()
        截取百度界面

         

        图片懒加载-倒数第四行多了一个'
        图片懒加载--自己练习!src2
        小结:selenium中注意page_source属性
        #获取页面源码数据,进行解析操作
        page_text = bro.page_source#该属性可以获得当前浏览器对应的页面数据
        # 创建无头的谷歌浏览器对象
        browser = webdriver.Chrome(executable_path=path, chrome_options=chrome_options)

       

转载于:https://www.cnblogs.com/lijie123/p/9932265.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值