selenuim和phantonJs处理网页动态加载数据的爬取阅读量: 1203
动态数据加载处理

一.图片懒加载

  • 什么是图片懒加载?

    • 案例分析:抓取站长素材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表达式也没有问题,究其原因出在了哪里呢?

    • 图片懒加载概念:

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

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

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

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

      #!/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/@src2') #src2伪属性
      image_name = div.xpath('.//img/@alt')
      print(image_url) #打印图片链接
      print(image_name)#打印图片名称

二.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
    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()

爬虫开发6.selenuim和phantonJs处理网页动态加载数据的爬取的更多相关文章

  1. (五)selenuim和phantonJs处理网页动态加载数据的爬取

    selenuim和phantonJs处理网页动态加载数据的爬取 一 图片懒加载 自己理解------就是在打开一个页面的时候,图片数量特别多,图片加载会增加服务器的压力,所以我们在这个时候,就会用到- ...

  2. 爬虫--selenuim和phantonJs处理网页动态加载数据的爬取

    1.谷歌浏览器的使用 下载谷歌浏览器 安装谷歌访问助手 终于用上谷歌浏览器了.....激动 问题:处理页面动态加载数据的爬取 -1.selenium -2.phantomJs 1.selenium 二 ...

  3. selenuim和phantonJs处理网页动态加载数据的爬取

    一.图片懒加载 什么是图片懒加载? 案例分析:抓取站长素材http://sc.chinaz.com/中的图片数据 #!/usr/bin/env python # -*- coding:utf-8 -* ...

  4. 6-----selenuim和phantonJs处理网页动态加载数据的爬取

    动态数据加载处理 一.图片懒加载 什么是图片懒加载? 案例分析:抓取站长素材http://sc.chinaz.com/中的图片数据 #!/usr/bin/env python # -*- coding ...

  5. Python爬虫实例:爬取B站《工作细胞》短评——异步加载信息的爬取

    很多网页的信息都是通过异步加载的,本文就举例讨论下此类网页的抓取. <工作细胞>最近比较火,bilibili 上目前的短评已经有17000多条. 先看分析下页面 右边 li 标签中的就是短 ...

  6. python+selenium+PhantomJS爬取网页动态加载内容

    一般我们使用python的第三方库requests及框架scrapy来爬取网上的资源,但是设计javascript渲染的页面却不能抓取,此时,我们使用web自动化测试化工具Selenium+无界面浏览 ...

  7. [JS前端开发] js/jquery控制页面动态加载数据 滑动滚动条自动加载事件

    页面滚动动态加载数据,页面下拉自动加载内容 相信很多人都见过瀑布流图片布局,那些图片是动态加载出来的,效果很好,对服务器的压力相对来说也小了很多 有手机的相信都见过这样的效果:进入qq空间,向下拉动空 ...

  8. Android应用开发提高系列(4)——Android动态加载(上)——加载未安装APK中的类

    前言 近期做换肤功能,由于换肤程度较高,受限于平台本身,实现起来较复杂,暂时搁置了该功能,但也积累了一些经验,将分两篇文章来写这部分的内容,欢迎交流! 关键字:Android动态加载 声明 欢迎转载, ...

  9. 爬虫:获取动态加载数据(selenium)(某站)

    如果网站数据是动态加载,需要不停往下拉进度条才能显示数据,用selenium模拟浏览器下拉进度条可以实现动态数据的抓取. 本文希望找到某乎某话题下讨论较多的问题,以此再寻找每一问题涉及的话题关键词(侵 ...

随机推荐

  1. Spark中RDD的常用操作(Python)

    弹性分布式数据集(RDD) Spark是以RDD概念为中心运行的.RDD是一个容错的.可以被并行操作的元素集合.创建一个RDD有两个方法:在你的驱动程序中并行化一个已经存在的集合:从外部存储系统中引用 ...

  2. 团队作业4Alpha冲刺

    仓库地址:https://gitee.com/ILoveFunGame/game_strategy_network.git 第一天 2018/6/13 1.1 今日完成任务情况以及遇到的问题. 1.1 ...

  3. 微信小程序相关三、css写小黄人

    小程序上课第三天,因为今天院里有活动,所以没去上课,第四天上午又因为要召开入党转正大会,又耽误了一上午,下午去上课,要了资料.这两天讲了一些零零碎碎的东西,做的实例有上面这个小黄人 都是用的css,基 ...

  4. delete属性

     

  5. Nginx源码完全注释(6)core/murmurhash

    下面是摘自 Google Code 的 Murmurhash 开源项目主页上的 Murmurhash2,Nginx 就是采用的这个. uint32_t MurmurHash2 ( const void ...

  6. SQL 中怎么查询数据库中具有的表、存储过程、试图数目、总触发器数、作业数

    用户表:select count(*) 总表数 from sysobjects where xtype='u' 刚才那个是用户表,下面这个是系统表加用户表: select count(*) 总表数 f ...

  7. name相同获取值

    <html> <head> </head> <body> <form name="form1" method="po ...

  8. strtotime()

    date('Y-m-d H:i:s',time()) //24小时 date('Y-m-d h:i:s',time()) //12小时

  9. Spring获取HttpServletRequest对象

    <!-- WEB.XML中配置相关的监听机制 -->  <listener>   <listener-class>  org.springframework.web ...

  10. Centos6 hadoop2.6.0安装笔记

    系统环境: linux:Centos6-64bit hadoop:hadoop2.6.0 jdk:1.6.45 集群方式安装 一台master,3台slave master 192.168.111.1 ...