selenium 动态爬取页面使用教程以及使用案例(1)

发表于:2023-12-01 09:19

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:苍煜    来源:CSDN

  概述
  Selenium是一款功能强大的自动化Web浏览器交互工具。它可以模拟真实用户在网页上的操作,例如点击、滚动、输入等等。Selenium可以爬取其他库难以爬取的网站,特别是那些需要登录或使用JavaScript的网站。Selenium可以自动地从Web页面中提取数据,例如价格、评论、评分等等。Selenium是一款非常实用的工具,可以帮助用户更好地利用Web技术,提高工作效率和数据质量。
  优点
  ·强大的自动化Web浏览器交互工具
  · 可用于爬取其他框架难以爬取的网站
  · 多浏览器支持:FireFox、Chrome、IE、Opera、Edge;
  · 多平台支持:Linux、Windows、MAC;
  · 多语言支持:Java、PythonRuby、C#、JavaScript、C++;
  缺点
  · 使用起来可能比较复杂
  · 不如某些其他框架快速
  适用场景
  · 爬取其他框架难以爬取的网站
  · 爬取大量数据
  和jsoup比较
  jsoup很大程度是处理一些静态的网页,而Selenium很大程度上用作复杂动态交互的网页。
  Selenium 使用步骤
  1:下载浏览器和驱动-以eage为例
  因为使用Selenium 需要安装谷歌浏览器,以及程序中使用的驱动包。并且这两个必须保持版本一致;
  chrome驱动包下载地址:
  http://chromedriver.storage.googleapis.com/index.html
  或者
  https://registry.npmmirror.com/binary.html?path=chromedriver/
  Edge浏览器驱动:
  https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/
  Firefox浏览器驱动:
  https://github.com/mozilla/geckodriver/releases
  1:查看eage浏览器版本:
  2:下载对应驱动包-确保版本一致
  3:设置驱动,以下三种选项
  3-1:将eage驱动包放入jdk的bin文件夹中
  3-2:设置浏览器驱动
  设置浏览器的地址非常简单。 我们可以手动创建一个存放浏览器驱动的目录,如: D:\tools\HuanjingVariable\chromedriver , 将下载的浏览器驱动文件(例如:chromedriver、geckodriver)丢到该目录下。
  我的电脑–>属性–>系统设置–>高级–>环境变量–>系统变量–>Path,将“D:\tools\HuanjingVariable\chromedriver”目录添加到Path的值中。
  3-3:环境变量没设置好可以指定磁盘地址去访问浏览器驱动
  //设置系统属性指定谷歌驱动地址
  System.setProperty("webdriver.chrome.driver", "D:/tools/HuanjingVariable/chromedriver/chromedriver.exe");
  2:导包
  <!-- selenium 依赖 -->
          <dependency>
              <groupId>org.seleniumhq.selenium</groupId>
              <artifactId>selenium-java</artifactId>
              <version>4.5.0</version>
          </dependency>
  3:简单示例
  案例:打开百度页面,输入“java” 然后打印出页面的文本信息
  package com.example.seleniumdemo;
  import org.openqa.selenium.By;
  import org.openqa.selenium.WebDriver;
  import org.openqa.selenium.chrome.ChromeDriver;
  import org.openqa.selenium.edge.EdgeDriver;
  import org.openqa.selenium.edge.EdgeOptions;
  public class EageMain {
      public static void main(String[] args) {
          //引入eage驱动
          EdgeOptions options = new EdgeOptions();
          //允许所有请求
          options.addArguments("--remote-allow-origins=*");
          EdgeDriver driver = new EdgeDriver(options);
          //打开网页
          driver.get("http://www.baidu.com");
          //输入框中输入搜索词
          driver.findElement(By.id("kw")).sendKeys("java");
          //点击百度一下按钮
          driver.findElement(By.id("su")).click();
          //获取元素文本信息
          String data = driver.findElement(By.className("s_tab_inner_81iSw")).getText();
          System.out.println(data);
      }
  }
  Selenium API
  1:定位元素-得到WebElement 对象
  2:WebDriver 常用 API
  WebDriver 提供了一系列的 API 来和浏览器进行交互:
  3:WebElement 常用 API
  通过 WebElement 实现与网站页面上元素的交互,这些元素包含文本框、文本域、按钮、单选框、div等,WebElement提供了一系列的方法对这些元素进行操作。
  4:元素等待机制
  在对元素进行定位时,有时候网页加载时间比较长,元素还没有加载出来,这个时候去查找这个元素的话程序中就会抛出异常,所以我们在编写代码时需要考虑延时问题,在selenium中有几种延时机制可以使用如下:
  硬性等待
  硬性等待就是不管你浏览器元素是否加载完成,都要进行等待设置好的时间,利用 java 语言中的线程类 Thread 中的 sleep 方法,进行强制等待。
  Thread.sleep(long millis) 该方法会让线程进行休眠。
  如:Thread.sleep(3000) 表示程序执行的线程暂停 3 秒钟。
  这种方法在一定的程度上是可以解决元素加载过慢的情况,但是不建议使用该方法,因为一般情况下我们无法判断网页到底需要多长时间加载完成,如果我们设置的时间过长,非常影响效率。
  隐式等待
  隐式等待的理解,就是我们通过代码设置一个等待时间,如果在这个等待时间内,网页加载完成后就执行下一步,否则一直等待到时间截止。
  代码表示:
  driver.manage.timeouts.implicitlyWait(long time, TimeUtil unit);
  这种方法相对于硬性等待显的会灵活一点,但是隐式等待也有个弊端,因为这个设置是全局的,程序需要等待整个页面加载完成,直到超时,有时候我需要找的那个元素早就加载完成了,只是页面上有个别其他元素加载比较慢,程序还是会一直等待下去。直到所有的元素加载完成在执行下一步。
  显式等待
  显示等待是等待指定元素设置的等待时间,在设置时间内,默认每隔0.5s检测一次当前的页面这个元素是否存在,如果在规定的时间内找到了元素则执行相关操作,如果超过设置时间检测不到则抛出异常。默认抛出异常为:NoSuchElementException。推荐使用显示等待。
  代码表示:
  WebDriberWait wait = new WebDriverWait(dirver, timeOutInSeconds);
  wait.nutil(expectCondition);
  具体使用案例:
  1.查找元素是否已经加载出来
  WebDriverWait wait = new WebDriverWait(driver, 5);
  // 查找id为“kw"的元素是否加载出来了(已经在页面DOM中存在)
  wait.until(ExpectedConditions.presenceOfElementLocated(By.id("kw")));
  // 在设定时间内找到后就返回,超时直接抛异常
  2.查找元素是否可见
  WebDriverWait wait = new WebDriverWait(driver, 5);
  // 查找id为"kw"的元素是否可见
  wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("kw")));
  4. ExpectedConditions类中常用方法
  5. 页面加载超时设置
  通过TimeOuts 对象进行全局页面加载超时的设置,该设置必须放置get 方法之前。如下代码:
  driver.manage().timeouts().pageLoadTimeout(5, TimeUnit.SECONDS);
  driver.get("https://www.baidu.com");
  5:模拟鼠标键盘操作
  模拟鼠标
  在WebDriver中,关于鼠标的操作我们可以通过 Actions 类来模拟鼠标右击、双击、悬停、拖动等操作。
  Actions 类中鼠标操作常用方法:
  示例:百度首页设置悬停下拉菜单
  import org.openqa.selenium.By;
  import org.openqa.selenium.WebDriver;
  import org.openqa.selenium.WebElement;
  import org.openqa.selenium.chrome.ChromeDriver;
  import org.openqa.selenium.interactions.Actions;
  public class MouseDemo {
    public static void main(String[] args) {
      WebDriver driver = new ChromeDriver();
      driver.get("https://www.baidu.com/");
  // 定位元素
      WebElement search_setting = driver.findElement(By.linkText("设置"));
      // 创建actions对象
      Actions action = new Actions(driver);
      // 模拟鼠标悬停
      action.clickAndHold(search_setting).perform();
      driver.quit();
    }
  }
  模拟键盘
  在 selenium 中有个 Keys() 类(枚举类),提供了几乎键盘上所有按键的方法,在使用的过程中,我们可以通过 sendKeys() 方法来模拟键盘的输入,除此之外,我们还可以用它来输入键盘上的按键, 甚至是组合键, 如 Ctrl+A、 Ctrl+C 等。
  ·sendKeys(Keys.BACK_SPACE) 回格键(BackSpace)
  · sendKeys(Keys.SPACE) 空格键 (Space)
  · sendKeys(Keys.TAB) 制表键 (Tab)
  · sendKeys(Keys.ESCAPE) 回退键(Esc)
  · sendKeys(Keys.ENTER) 回车键(Enter)
  · sendKeys(Keys.CONTROL,‘a’) 全选(Ctrl+A)
  · sendKeys(Keys.CONTROL,‘c’) 复制(Ctrl+C)
  · sendKeys(Keys.CONTROL,‘x’) 剪切(Ctrl+X)
  · sendKeys(Keys.CONTROL,‘v’) 粘贴(Ctrl+V)
  · sendKeys(Keys.F1) 键盘 F1
  ……
  · sendKeys(Keys.F12) 键盘 F12
  import org.openqa.selenium.WebElement;
  import org.openqa.selenium.WebDriver;
  import org.openqa.selenium.chrome.ChromeDriver;
  import org.openqa.selenium.By;
  import org.openqa.selenium.Keys;
  public class Keyboard {
    public static void main(String[] args)throws InterruptedException {
      WebDriver driver = new ChromeDriver();
      driver.get("https://www.baidu.com");
      // 定位到对应的元素
      WebElement input = driver.findElement(By.id("kw"));
      //输入框输入内容
      input.sendKeys("seleniumm");
      Thread.sleep(2000);
      //删除多输入的一个 m
      input.sendKeys(Keys.BACK_SPACE);
      Thread.sleep(2000);
      //输入空格键+“教程”
      input.sendKeys(Keys.SPACE);
      input.sendKeys("教程");
      Thread.sleep(2000);
      //ctrl+a 全选输入框内容
      input.sendKeys(Keys.CONTROL,"a");
      Thread.sleep(2000);
      //ctrl+x 剪切输入框内容
      input.sendKeys(Keys.CONTROL,"x");
      Thread.sleep(2000);
      //ctrl+v 粘贴内容到输入框
      input.sendKeys(Keys.CONTROL,"v");
      Thread.sleep(2000);
      //通过回车键盘来代替点击操作
      input.sendKeys(Keys.ENTER);
      Thread.sleep(2000);
      driver.quit();
    }
  }
  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号