Python网络爬虫之图片懒加载技术、selenium和PhantomJS

 

动态数据加载处理方式

  • 图片懒加载
  • selenium
  • phantomJs
  • 谷歌无头浏览器

一.图片懒加载html

  • 什么是图片懒加载?
    • 案例分析:抓取站长素材http://sc.chinaz.com/中的图片数据
      #!/usr/bin/env python # -*- coding:utf-8 -*- import requests from lxml import etree if __name__ == "__main__": url = 'http://sc.chinaz.com/tupian/gudianmeinvtupian.html' headers = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36', } #获取页面文本数据 response = requests.get(url=url,headers=headers) response.encoding = 'utf-8' page_text = response.text #解析页面数据(获取页面中的图片连接) #建立etree对象 tree = etree.HTML(page_text) div_list = tree.xpath('//div[@id="container"]/div') #解析获取图片地址和图片的名称 for div in div_list: image_url = div.xpath('.//img/@src') image_name = div.xpath('.//img/@alt') print(image_url) #打印图片连接 print(image_name)#打印图片名称

       

    • - 运行结果观察发现,咱们能够获取图片的名称,可是连接获取的为空,检查后发现xpath表达式也没有问题,究其缘由出在了哪里呢?python

    • 图片懒加载概念:web

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

    • 网站通常如何实现图片懒加载技术呢?windows

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

    • 站长素材案例后续分析:经过细致观察页面的结构后发现,网页中图片的连接是存储在了src2这个伪属性中api

      #!/usr/bin/env python # -*- coding:utf-8 -*- import requests from lxml import etree if __name__ == "__main__": url = 'http://sc.chinaz.com/tupian/gudianmeinvtupian.html' headers = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36', } #获取页面文本数据 response = requests.get(url=url,headers=headers) response.encoding = 'utf-8' page_text = response.text #解析页面数据(获取页面中的图片连接) #建立etree对象 tree = etree.HTML(page_text) div_list = tree.xpath('//div[@id="container"]/div') #解析获取图片地址和图片的名称 for div in div_list: image_url = div.xpath('.//img/@src'2) #src2伪属性 image_name = div.xpath('.//img/@alt') print(image_url) #打印图片连接 print(image_name)#打印图片名称

       

二.selenium浏览器

  • 什么是selenium?
    • 是Python的一个第三方库,对外提供的接口能够操做浏览器,而后让浏览器完成自动化的操做。  网络

  • 环境搭建app

    • 安装selenum:pip install selenium

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

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

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

               效果展现:

from selenium import webdriver from time import sleep # 后面是你的浏览器驱动位置,记得前面加r'','r'是防止字符转义的 driver = webdriver.Chrome(r'驱动程序路径') # 用get打开百度页面 driver.get("http://www.baidu.com") # 查找页面的“设置”选项,并进行点击 driver.find_elements_by_link_text('设置')[0].click() sleep(2) # # 打开设置后找到“搜索设置”选项,设置为每页显示50条 driver.find_elements_by_link_text('搜索设置')[0].click() sleep(2) # 选中每页显示50条 m = driver.find_element_by_id('nr') sleep(2) m.find_element_by_xpath('//*[@id="nr"]/option[3]').click() m.find_element_by_xpath('.//option[3]').click() sleep(2) # 点击保存设置 driver.find_elements_by_class_name("prefpanelgo")[0].click() sleep(2) # 处理弹出的警告页面 肯定accept() 和 取消dismiss() driver.switch_to_alert().accept() sleep(2) # 找到百度的输入框,并输入 美女 driver.find_element_by_id('kw').send_keys('美女') sleep(2) # 点击搜索按钮 driver.find_element_by_id('su').click() sleep(2) # 在打开的页面中找到“Selenium - 开源中国社区”,并打开这个页面 driver.find_elements_by_link_text('美女_百度图片')[0].click() sleep(3) # 关闭浏览器 driver.quit()

代码介绍:

#导包
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名字查找

 

 

三.phantomJs

  • PhantomJS是一款无界面的浏览器,其自动化操做流程和上述操做谷歌浏览器是一致的。因为是无界面的,为了可以展现自动化操做流程,PhantomJS为用户提供了一个截屏的功能,使用save_screenshot函数实现。
  • 代码演示:
    from selenium import webdriver
    import time
    
    # phantomjs路径
    path = r'PhantomJS驱动路径'
    browser = webdriver.PhantomJS(path)
    
    # 打开百度
    url = 'http://www.baidu.com/'
    browser.get(url)
    
    time.sleep(3)
    
    browser.save_screenshot(r'phantomjs\baidu.png')
    
    # 查找input输入框
    my_input = browser.find_element_by_id('kw')
    # 往框里面写文字
    my_input.send_keys('美女')
    time.sleep(3)
    #截屏
    browser.save_screenshot(r'phantomjs\meinv.png')
    
    # 查找搜索按钮
    button = browser.find_elements_by_class_name('s_btn')[0]
    button.click()
    
    time.sleep(3)
    
    browser.save_screenshot(r'phantomjs\show.png')
    
    time.sleep(3)
    
    browser.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()

       

四.谷歌无头浏览器

  • 因为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'C:\Users\ZBLi\Desktop\1801\day05\ziliao\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()

做业

  • 爬取网易新闻国内板块下的新闻标题和新闻内容
相关文章
相关标签/搜索