Java爬虫之利用Selenium WebDriver 爬取数据

打印 上一主题 下一主题

主题 872|帖子 872|积分 2616

Selenium WebDriver简介

Selenium WebDriver 是一种用于自动化测试 Web 应用程序的工具。它提供了一种编程接口,答应开辟职员编写代码以控制浏览器的运动和交互。这个工具在 Web 开辟和测试中非常流行,因为它支持多种浏览器并且可以在不同的操作系统上运行。Selenium WebDriver 答应开辟职员模仿用户在浏览器中的操作,例如点击按钮、填写表单和导航页面。
一、安装摆设

本文利用docker方式举行安装
  1. docker run -d -p 5555:4444 -p 7900:7900 -p 5900:5900 --shm-size="2g" selenium/standalone-chrome
复制代码
端口讲解:


  • 4444 WebDriver服务地址地址
  • 7900 noVNC端口,noVNC是一种基于Web的VNC客户端
  • 5900 答应通过 VNC 客户端连接到容器内的图形界面
如果遇到拉取问题自行百度docker最新镜像源然后配置 /etc/docker/daemon.json文件即可。

安装运行后
访问http://<ip地址>:5555/就可以看到如下页面

sessions:代表创建了几个会话。
max.concurrentcy: 代表 你这个容器同时可以处理几个对话。
图中这种情况只能 同时模仿一个网页,也就是同时只能处理一个会话。
访问noVNC
http://<ip地址>:7900/?autoconnect=1&resize=scale&password=secret

客户端连接可以下载VNC Viewer

二、Java项目中利用

1.引入依靠

  1. <dependency>
  2.      <groupId>org.seleniumhq.selenium</groupId>
  3.      <artifactId>selenium-java</artifactId>
  4.      <version>3.141.59</version>
  5. </dependency>
  6. <dependency>
  7.      <groupId>com.google.guava</groupId>
  8.      <artifactId>guava</artifactId>
  9.      <version>23.0</version>
  10. </dependency>
  11. <dependency>
  12.      <groupId>com.google.code.gson</groupId>
  13.      <artifactId>gson</artifactId>
  14.      <version>2.8.2</version>
  15. </dependency>
复制代码
2.示例代码

   以下代码实现了默认人利用google浏览器打开百度,在搜索框中输入了csdn 落魄实习生,点击了搜索按钮获取页面中所有文章标题及链接
  1. import org.openqa.selenium.By;
  2. import org.openqa.selenium.WebDriver;
  3. import org.openqa.selenium.WebElement;
  4. import org.openqa.selenium.remote.DesiredCapabilities;
  5. import org.openqa.selenium.remote.RemoteWebDriver;
  6. import org.openqa.selenium.support.ui.WebDriverWait;
  7. import java.net.URL;
  8. import java.util.List;
  9. import java.util.concurrent.TimeUnit;
  10. import static org.openqa.selenium.support.ui.ExpectedConditions.numberOfWindowsToBe;
  11. import static org.openqa.selenium.support.ui.ExpectedConditions.titleIs;
  12. public class MainClass {
  13.     public static void main(String[] args) {
  14.         WebDriver driver = null;
  15.         try {
  16.             //打开一个浏览器窗口
  17.             //加载 chromedriver 驱动
  18.             driver = new RemoteWebDriver(new URL("http://你的IP:5555/wd/hub"), DesiredCapabilities.chrome());
  19.             //打开百度链接
  20.             driver.navigate().to("http://www.baidu.com/");
  21.             //在搜索文本框输入"csdn 落魄实习生"
  22.             driver.findElement(By.id("kw")).sendKeys("csdn 落魄实习生");
  23.             //点击搜索按钮
  24.             driver.findElement(By.id("su")).click();
  25.             //存储当前原始窗口或页签的ID
  26.             String originalWindow = driver.getWindowHandle();
  27.             //获取当前打开的窗口或页签数
  28.             int windosSize = driver.getWindowHandles().size();
  29.             //等到百度搜索结果页面元素加载完(这里最多等5秒)
  30.             driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS);
  31.             //点击第一条搜索结果,会打开新页签,也就是第2个页签
  32.             driver.findElement(By.xpath("//*[@id='content_left']/div[@id='1']/div[@class='c-container']/div/h3/a")).click();
  33.             WebDriverWait wait = new WebDriverWait(driver, 10);
  34.             //这里不我建议用,因为我打开第二窗口打不开,可能是因为分配的资源大小的问题。我实际处理业务都是 单窗口操作的,先把第二个网页的链接保存到数据库
  35.             //等待第2个新窗口或新页签打开
  36.             wait.until(numberOfWindowsToBe(2));
  37.             //循环指导找到新窗口或页签的句柄
  38.             for (String windowHandle : driver.getWindowHandles()) {
  39.                 if (!originalWindow.contentEquals(windowHandle)) {
  40.                     //driver切换为新窗口或新页签的
  41.                     driver.switchTo().window(windowHandle);
  42.                     break;
  43.                 }
  44.             }
  45.             //等待新窗口或新页签的内容加载
  46.             wait.until(titleIs("落魄实习生-CSDN博客"));
  47.             //读取当前页面标题
  48.             System.out.println("当前网址的标题:" + driver.getTitle());
  49.             //从地址栏中读取当前 URL
  50.             System.out.println("当前网址的链接:" + driver.getCurrentUrl());
  51.             //获取文章标题和链接
  52.             List<WebElement> articleTitles = driver.findElements(By.xpath("//div[@class='article-item-box csdn-tracking-statistics']/h4/a"));
  53.             for (WebElement articleTitle : articleTitles) {
  54.                 //获取 h4 标签中的显示文本
  55.                 String text = articleTitle.getText();
  56.                 //获取 a 标签里的 href 属性的值
  57.                 String link = articleTitle.getAttribute("href");
  58.                 System.out.println("文章标题:" + text + " 链接:" + link);
  59.             }
  60.         } catch (Exception e) {
  61.             e.printStackTrace();
  62.         } finally {
  63.             driver.quit();
  64.         }
  65.     }
  66. }
复制代码
实行效果如下:

三、WebDriver利用阐明

1.WebDriver定位器

WebDriver定位方法提供了八种元素定位方法,所对应的方法、特性分别是:
定位器形貌class name根据class 的值来搜索匹配元素css selector根据 css 的值来搜索匹配元素id根据 id 属性的值来搜索匹配元素name根据 name 属性的值来搜索匹配元素link text根据链接表现的全部文本搜索匹配元素partial link text根据链接表现的部分文本搜索匹配元素tag name根据html标署名搜索匹配元素xpath根据元素的层级位置搜索匹配元素 (1) class name 定位器
HTML 页面 Web 元素可以具有class属性,我们可以利用 Selenium 中可用的类名定位器来辨认这些元素。
  1. WebDriver driver = new ChromeDriver();
  2. driver.findElement(By.className("information"));
复制代码
(2) css selector 定位器
CSS 是用于设置 HTML 页面样式的语言。我们可以利用 css 选择器定位器策略来辨认页面上的元素。如果元素有一个 id,我们创建定位器为 css = #id。否则我们遵循的格式是 css =[attribute=value] 。下面利用 css 为名字文本框创建定位器。
  1. WebDriver driver = new ChromeDriver();
  2. driver.findElement(By.cssSelector("#fname"));
复制代码
(3) id 定位器
我们可以利用网页中元素可用的 ID 属性来定位它。通常,ID 属性对于网页上的元素应该是唯一的。
  1. WebDriver driver = new ChromeDriver();
  2. driver.findElement(By.id("lname"));
复制代码
(4) name 定位器
我们可以利用网页中元素可用的 NAME 属性来定位它。通常 NAME 属性对于网页上的元素应该是唯一的。
  1. WebDriver driver = new ChromeDriver();
  2. driver.findElement(By.name("newsletter"));
复制代码
(5) link text 定位器
如果我们要定位的元素是一个链接,我们可以利用链接文本定位器在网页上辨认它。链接文本是链接表现的文本。
  1. WebDriver driver = new ChromeDriver();
  2. driver.findElement(By.linkText("Selenium Official Page"));
复制代码
(6) partial link text 定位器
如果我们要定位的元素是一个链接,我们可以利用部分链接文本定位器在网页上辨认它。链接文本是链接表现的文本。我们可以将部分文本作为值传递。
  1. WebDriver driver = new ChromeDriver();
  2. driver.findElement(By.partialLinkText("Official Page"));
复制代码
(7) tag 定位器
我们可以利用 HTML TAG 自己作为定位器来辨认页面上的 Web 元素。利用tag 定位器来定位“a”标签。
  1. WebDriver driver = new ChromeDriver();
  2. driver.findElement(By.tagName("a"));
复制代码
(8) xpath 定位器
一个HTML文档可以看作是一个XML文档,然后我们就可以利用xpath来遍历到达感兴趣元素的路径来定位元素。XPath 可以是绝对 xpath,它是从文档的根目录创建的。示例 - /html/form/input[1]。这将返回男性单​​选按钮。或者 xpath 可能是相对的。示例: //输入[@name=‘fname’]。这将返回名字文本框。让我们利用 xpath 为女性单选按钮创建定位器。
  1. WebDriver driver = new ChromeDriver();
  2. driver.findElement(By.xpath("//input[@value='f']"));
复制代码
关于 xpath 定位器你可以参考文章:
Selenium 中的 XPath
selenium 定位元素
XPath in Selenium: How to Find & Write
How to use XPath in Selenium
2.常用操作

1.打开一个新的浏览器页签
  1. //打开一个新的浏览器页签
  2. driver.switchTo().newWindow(WindowType.TAB);
复制代码
2.打开网址链接
  1. //方便的方式
  2. driver.get("http://www.baidu.com");
  3. //或者下面的方式,是一样的效果
  4. driver.navigate().to("http://www.baidu.com");
复制代码
3.获取当前网页的标题和链接
  1. //读取当前页面标题
  2. driver.getTitle();
  3. //从地址栏中读取当前 URL
  4. driver.getCurrentUrl();
复制代码
4.浏览器进步、退却、刷新、关闭
  1. //浏览器的后退
  2. driver.navigate().back();
  3. //浏览器的前进
  4. driver.navigate().forward();
  5. //浏览器的刷新
  6. driver.navigate().refresh();
  7. //关闭浏览器
  8. driver.quit();
复制代码
5.弹窗的警告、确认
(1)获取警告弹窗的文本并点击确认
  1. //使用link text定位器找到页面链接,并点击它来出发弹窗
  2. driver.findElement(By.linkText("See an example alert")).click();
  3. //等弹窗显示并获取弹窗对象
  4. Alert alert = wait.until(ExpectedConditions.alertIsPresent());
  5. //获取弹窗的文本内容
  6. String text = alert.getText();
  7. //点击弹窗的确认按钮
  8. alert.accept();
复制代码
(2)确认弹窗类似于警告弹窗,除了用户还可以选择取消消息。
此示例还展示了另一种获取弹窗对象的方法:
  1. //使用link text定位器找到链接,并点击它来出发弹窗
  2. driver.findElement(By.linkText("See a sample confirm")).click();
  3. //等弹窗显示
  4. wait.until(ExpectedConditions.alertIsPresent());
  5. //获取弹窗对象
  6. Alert alert = driver.switchTo().alert();
  7. //获取弹窗的文本内容
  8. String text = alert.getText();
  9. //点击弹窗的取消按钮
  10. alert.dismiss();
复制代码
(3)可输入的弹窗
提示类似于确认弹窗,可输入的弹窗还可以输入一些文本信息,与利用表单位素类似。
  1. //使用link text定位器找到链接,并点击它来出发弹窗
  2. driver.findElement(By.linkText("See a sample prompt")).click();
  3. //等弹窗显示并获取弹窗对象
  4. Alert alert = wait.until(ExpectedConditions.alertIsPresent());
  5. //在弹窗的输入框输入“你好啊”
  6. alert.sendKeys("你好啊");
  7. //按确定按钮
  8. alert.accept();
复制代码
6.判定页面的元素是否存在
  1. int headImage = driver.findElements(By.xpath("//*[@class='user_avatar']")).size();
  2. if (headImage == 0) {
  3.         System.out.println("页面上 class 为 user_avatar 的 html 元素不存在");
  4. }
复制代码
3.利用 cookie

1.添加cookie
  1. public static void main(String[] args) {
  2.         WebDriver driver = new ChromeDriver();
  3.         try {
  4.                 //打开网址
  5.             driver.get("http://www.example.com");
  6.             //添加cookie到当前浏览器网址的上下文中
  7.             driver.manage().addCookie(new Cookie("key", "value"));
  8.         } finally {
  9.                 //关闭浏览器
  10.             driver.quit();
  11.         }
  12. }
复制代码
2.获取与删除 Cookie
(1)获取指定 Cookie
  1. public static void main(String[] args) {
  2.        WebDriver driver = new ChromeDriver();
  3.         try {
  4.             driver.get("http://www.example.com");
  5.             //设置一个Cookie
  6.             driver.manage().addCookie(new Cookie("login", "fgflkshf&"));
  7.             // 获取key是 'login'的Cookie
  8.             Cookie cookie1 = driver.manage().getCookieNamed("login");
  9.             System.out.println(cookie1);
  10.         } finally {
  11.             driver.quit();
  12.         }
  13. }
复制代码
(2)获取所有 Cookie
  1. Set<Cookie> cookies = driver.manage().getCookies();
复制代码
(3)删除指定 Cookie
  1. driver.manage().deleteCookieNamed("login");
复制代码
(4)删除所有 Cookie
  1. driver.manage().deleteAllCookies();
复制代码
4.键盘与鼠标操作

键盘与鼠标操作可参考官网阐明:
1.键盘操作阐明
2.鼠标操作阐明
3.滚轮操作阐明

本文借鉴于:https://blog.csdn.net/qq_33697094/article/details/131292916

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

美丽的神话

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表