当前位置: 首页 > news >正文

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

这里写自定义目录标题

  • Selenium WebDriver简介
  • 一、安装部署
  • 二、Java项目中使用
    • 1.引入依赖
    • 2.示例代码
  • 三、WebDriver使用说明
    • 1.WebDriver定位器
    • 2.常用操作
    • 3.使用 cookie
    • 4.键盘与鼠标操作

Selenium WebDriver简介

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

一、安装部署

本文使用docker方式进行安装

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.引入依赖

<dependency><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-java</artifactId><version>3.141.59</version></dependency><dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>23.0</version></dependency><dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId><version>2.8.2</version></dependency>

2.示例代码

以下代码实现了默认人使用google浏览器打开百度,在搜索框中输入了csdn 落魄实习生,点击了搜索按钮获取页面中所有文章标题及链接

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.openqa.selenium.support.ui.WebDriverWait;import java.net.URL;
import java.util.List;
import java.util.concurrent.TimeUnit;import static org.openqa.selenium.support.ui.ExpectedConditions.numberOfWindowsToBe;
import static org.openqa.selenium.support.ui.ExpectedConditions.titleIs;public class MainClass {public static void main(String[] args) {WebDriver driver = null;try {//打开一个浏览器窗口//加载 chromedriver 驱动driver = new RemoteWebDriver(new URL("http://你的IP:5555/wd/hub"), DesiredCapabilities.chrome());//打开百度链接driver.navigate().to("http://www.baidu.com/");//在搜索文本框输入"csdn 落魄实习生"driver.findElement(By.id("kw")).sendKeys("csdn 落魄实习生");//点击搜索按钮driver.findElement(By.id("su")).click();//存储当前原始窗口或页签的IDString originalWindow = driver.getWindowHandle();//获取当前打开的窗口或页签数int windosSize = driver.getWindowHandles().size();//等到百度搜索结果页面元素加载完(这里最多等5秒)driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS);//点击第一条搜索结果,会打开新页签,也就是第2个页签driver.findElement(By.xpath("//*[@id='content_left']/div[@id='1']/div[@class='c-container']/div/h3/a")).click();WebDriverWait wait = new WebDriverWait(driver, 10);//这里不我建议用,因为我打开第二窗口打不开,可能是因为分配的资源大小的问题。我实际处理业务都是 单窗口操作的,先把第二个网页的链接保存到数据库//等待第2个新窗口或新页签打开wait.until(numberOfWindowsToBe(2));//循环指导找到新窗口或页签的句柄for (String windowHandle : driver.getWindowHandles()) {if (!originalWindow.contentEquals(windowHandle)) {//driver切换为新窗口或新页签的driver.switchTo().window(windowHandle);break;}}//等待新窗口或新页签的内容加载wait.until(titleIs("落魄实习生-CSDN博客"));//读取当前页面标题System.out.println("当前网址的标题:" + driver.getTitle());//从地址栏中读取当前 URLSystem.out.println("当前网址的链接:" + driver.getCurrentUrl());//获取文章标题和链接List<WebElement> articleTitles = driver.findElements(By.xpath("//div[@class='article-item-box csdn-tracking-statistics']/h4/a"));for (WebElement articleTitle : articleTitles) {//获取 h4 标签中的显示文本String text = articleTitle.getText();//获取 a 标签里的 href 属性的值String link = articleTitle.getAttribute("href");System.out.println("文章标题:" + text + " 链接:" + link);}} catch (Exception e) {e.printStackTrace();} finally {driver.quit();}}
}

执行结果如下:
在这里插入图片描述

三、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 中可用的类名定位器来识别这些元素。

WebDriver driver = new ChromeDriver();
driver.findElement(By.className("information"));

(2) css selector 定位器
CSS 是用于设置 HTML 页面样式的语言。我们可以使用 css 选择器定位器策略来识别页面上的元素。如果元素有一个 id,我们创建定位器为 css = #id。否则我们遵循的格式是 css =[attribute=value] 。下面使用 css 为名字文本框创建定位器。

WebDriver driver = new ChromeDriver();
driver.findElement(By.cssSelector("#fname"));

(3) id 定位器
我们可以使用网页中元素可用的 ID 属性来定位它。通常,ID 属性对于网页上的元素应该是唯一的。

WebDriver driver = new ChromeDriver();
driver.findElement(By.id("lname"));

(4) name 定位器
我们可以使用网页中元素可用的 NAME 属性来定位它。通常 NAME 属性对于网页上的元素应该是唯一的。

WebDriver driver = new ChromeDriver();
driver.findElement(By.name("newsletter"));

(5) link text 定位器
如果我们要定位的元素是一个链接,我们可以使用链接文本定位器在网页上识别它。链接文本是链接显示的文本。

WebDriver driver = new ChromeDriver();
driver.findElement(By.linkText("Selenium Official Page"));

(6) partial link text 定位器
如果我们要定位的元素是一个链接,我们可以使用部分链接文本定位器在网页上识别它。链接文本是链接显示的文本。我们可以将部分文本作为值传递。

WebDriver driver = new ChromeDriver();
driver.findElement(By.partialLinkText("Official Page"));

(7) tag 定位器
我们可以使用 HTML TAG 本身作为定位器来识别页面上的 Web 元素。使用tag 定位器来定位“a”标签。

WebDriver driver = new ChromeDriver();
driver.findElement(By.tagName("a"));

(8) xpath 定位器
一个HTML文档可以看作是一个XML文档,然后我们就可以使用xpath来遍历到达感兴趣元素的路径来定位元素。XPath 可以是绝对 xpath,它是从文档的根目录创建的。示例 - /html/form/input[1]。这将返回男性单​​选按钮。或者 xpath 可能是相对的。示例: //输入[@name=‘fname’]。这将返回名字文本框。让我们使用 xpath 为女性单选按钮创建定位器。

WebDriver driver = new ChromeDriver();
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.打开一个新的浏览器页签

//打开一个新的浏览器页签
driver.switchTo().newWindow(WindowType.TAB);

2.打开网址链接

//方便的方式
driver.get("http://www.baidu.com");
//或者下面的方式,是一样的效果
driver.navigate().to("http://www.baidu.com");

3.获取当前网页的标题和链接

//读取当前页面标题
driver.getTitle();
//从地址栏中读取当前 URL
driver.getCurrentUrl();

4.浏览器前进、后退、刷新、关闭

//浏览器的后退
driver.navigate().back();
//浏览器的前进
driver.navigate().forward();
//浏览器的刷新
driver.navigate().refresh();
//关闭浏览器
driver.quit();

5.弹窗的警告、确认
(1)获取警告弹窗的文本并点击确认

//使用link text定位器找到页面链接,并点击它来出发弹窗 
driver.findElement(By.linkText("See an example alert")).click();
//等弹窗显示并获取弹窗对象
Alert alert = wait.until(ExpectedConditions.alertIsPresent());
//获取弹窗的文本内容
String text = alert.getText();
//点击弹窗的确认按钮
alert.accept();

(2)确认弹窗类似于警告弹窗,除了用户还可以选择取消消息。
此示例还展示了另一种获取弹窗对象的方法:

//使用link text定位器找到链接,并点击它来出发弹窗 
driver.findElement(By.linkText("See a sample confirm")).click();
//等弹窗显示
wait.until(ExpectedConditions.alertIsPresent());
//获取弹窗对象
Alert alert = driver.switchTo().alert();
//获取弹窗的文本内容
String text = alert.getText();
//点击弹窗的取消按钮
alert.dismiss();

(3)可输入的弹窗
提示类似于确认弹窗,可输入的弹窗还可以输入一些文本信息,与使用表单元素类似。

//使用link text定位器找到链接,并点击它来出发弹窗 
driver.findElement(By.linkText("See a sample prompt")).click();
//等弹窗显示并获取弹窗对象
Alert alert = wait.until(ExpectedConditions.alertIsPresent());
//在弹窗的输入框输入“你好啊”
alert.sendKeys("你好啊");
//按确定按钮
alert.accept();

6.判断页面的元素是否存在

int headImage = driver.findElements(By.xpath("//*[@class='user_avatar']")).size();
if (headImage == 0) {System.out.println("页面上 class 为 user_avatar 的 html 元素不存在");
}

3.使用 cookie

1.添加cookie

public static void main(String[] args) {WebDriver driver = new ChromeDriver();try {//打开网址driver.get("http://www.example.com");//添加cookie到当前浏览器网址的上下文中driver.manage().addCookie(new Cookie("key", "value"));} finally {//关闭浏览器driver.quit();}
}

2.获取与删除 Cookie
(1)获取指定 Cookie

public static void main(String[] args) {WebDriver driver = new ChromeDriver();try {driver.get("http://www.example.com");//设置一个Cookiedriver.manage().addCookie(new Cookie("login", "fgflkshf&"));// 获取key是 'login'的CookieCookie cookie1 = driver.manage().getCookieNamed("login");System.out.println(cookie1);} finally {driver.quit();}
}

(2)获取所有 Cookie

Set<Cookie> cookies = driver.manage().getCookies();

(3)删除指定 Cookie

driver.manage().deleteCookieNamed("login");

(4)删除所有 Cookie

driver.manage().deleteAllCookies();

4.键盘与鼠标操作

键盘与鼠标操作可参考官网说明:

1.键盘操作说明

2.鼠标操作说明

3.滚轮操作说明


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

相关文章:

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

这里写自定义目录标题 Selenium WebDriver简介一、安装部署二、Java项目中使用1.引入依赖2.示例代码 三、WebDriver使用说明1.WebDriver定位器2.常用操作3.使用 cookie4.键盘与鼠标操作 Selenium WebDriver简介 Selenium WebDriver 是一种用于自动化测试 Web 应用程序的工具。…...

MyBatis 中updateByPrimaryKey和updateByPrimaryKeySelective区别

在 MyBatis 中&#xff0c;updateByPrimaryKey和updateByPrimaryKeySelective主要有以下区别&#xff1a; 一、功能 updateByPrimaryKey&#xff1a; 会根据传入的实体对象&#xff0c;将数据库表中对应主键的记录所有字段全部更新为实体对象中的值。即使实体对象中的某些字段…...

JavaScript下载文件(简单模式、跨域问题、文件压缩)

文章目录 简介简单文件下载通过模拟form表单提交通过XMLHttpRequest方式 跨域(oss)下载并压缩文件完整示例文件压缩跨域设置 简介 相信各位开发朋友都遇到过下载的文件的需求&#xff0c;有的非常简单&#xff0c;基本链接的形式就可以。 有的就比较复杂&#xff0c;涉及跨域…...

Django 定义使用模型,并添加数据

教材&#xff1a; Python web企业级项目开发教程&#xff08;黑马程序员&#xff09;第三章 模型 实验步骤&#xff1a; 1.创建项目和应用 前置步骤可看前文&#xff0c;进入到指定文件位置后创建 django-admin startproject mysite python manage.py startapp app01 2.注册…...

联名物料常泄漏?一端叠满“安全buff”

前段时间&#xff0c;一则关于爆火影视剧与知名茶饮品牌联名的消息在社交平台上迅速传播&#xff0c;宣传物料的照片也随之曝光——门店尚未上新&#xff0c;“小道消息”便已被疯传。但这种情况并非首次发生&#xff0c;让众多网友不禁猜想&#xff1a;这究竟是一场精心策划的…...

Flutter UI组件库(JUI)

Flutter UI组件库 (JUI) 介绍 您是否正在寻找一种方法来简化Flutter开发过程&#xff0c;并创建美观、一致的用户界面&#xff1f;您的搜索到此为止&#xff01;我们的Flutter UI组件库&#xff08;JUI&#xff09;提供了广泛的预构建、可自定义组件&#xff0c;帮助您快速构建…...

国外电商系统开发-运维系统远程文件

设计初衷是为了让所有人都能方便的打开网页&#xff0c;就能查看Linux系统文件内容&#xff0c;而不再用cat、vim、more等命令去打开文件&#xff0c;这对于我们一个普通的研发或者是财务人员来说&#xff0c;显得太繁琐&#xff0c;因为他们很可能不会这些命令&#xff0c;其次…...

4. Node.js Path模块

2.3Path模块 2.3.1获取js文件的绝对路径 console.log(__dirname) //js文件所在的文件夹的绝对路径 console.log(__filename) //js文件的绝对路径输出&#xff1a; G:\py_project\nodejs_study G:\py_project\nodejs_study\file.js2.3.2拼接规范的绝对路径path.r…...

重构长方法之分解条件表达式

分解条件表达式 是一种重构长方法中常用的技术&#xff0c;它适用于复杂的条件逻辑。在方法中&#xff0c;条件分支&#xff08;if-else 或 switch&#xff09;有时会变得条件非常多&#xff0c;非常复杂&#xff0c;难以理解和维护。通过分解条件逻辑&#xff0c;可以让代码更…...

蚁群算法养老服务人员智能调度系统

养老行业近年来越发热门&#xff0c;如何有效调配服务人员成为许多机构的痛点。我们结合智能算法技术&#xff0c;开发出了一款专为养老行业量身打造的“蚁群算法养老服务人员调度系统”&#xff0c;能够精准、高效地为机构分配人员&#xff0c;从此告别人力资源调度难题。 系…...

java使用 IDEA自动补全功能 AI 插件

国内插件&#xff1a; CodeGeeX&#xff1a; 功能特性&#xff1a; 由国内团队开发&#xff0c;是一款智能编程助手插件。它集成了多种人工智能技术&#xff0c;能够在多个编程语言中提供智能代码补全、代码生成、代码优化和注释生成等功能。该插件特别适用于常见的编程任务…...

【ShuQiHere】 AI与自我意识:能否创造真正的自觉机器人?

&#x1f916;【ShuQiHere】 &#x1f4dc; 目录 引言人类意识的探索机器意识的五大理论 功能主义&#xff08;Functionalism&#xff09;信息整合&#xff08;Information Integration&#xff09;体现主义&#xff08;Embodiment&#xff09;行动主义&#xff08;Enaction&…...

【Linux 从基础到进阶】CPU性能调优与监控

CPU性能调优与监控 1. 引言 在计算机系统中&#xff0c;CPU是核心组件之一&#xff0c;其性能直接影响系统的整体表现和响应速度。无论是在企业服务器环境、虚拟化环境&#xff0c;还是大数据计算场景&#xff0c;优化和监控CPU性能都至关重要。通过合理的调优策略和监控工具…...

Centos基线自动化检查脚本

此脚本是一个用于检查Linux系统安全配置的Bash脚本。它通过多项安全标准对系统进行评估&#xff0c;主要检查以下内容&#xff1a; IP地址获取&#xff1a;脚本首先获取主机的IP地址&#xff0c;确保其以10.115开头。 密码策略检查&#xff1a; 检查最小密码长度&#xff08;P…...

OpenCV答题卡识别

文章目录 一、基本流程二、代码实现1.定义函数2.图像预处理&#xff08;1&#xff09;高斯模糊、边缘检测&#xff08;2&#xff09;轮廓检测&#xff08;3&#xff09;透视变换&#xff08;4&#xff09;阈值处理和轮廓检测 3.筛选和排序选项轮廓4.判断答案5.显示结果 三、总结…...

通用数据库对象设计

1. 公共属性 这里的数据模型以陈品山的实体-关系模型为基础&#xff0c;增加了两点修改。一是用“组”的概念表达实体间关系&#xff0c;并将组作为一种特殊实体。二是采用继承的思想&#xff0c;将实体的公共属性提取出来&#xff0c;放到统一表中。实体的特有属性保存在单独…...

Java基础12-特殊文件和日志技术

十二、特殊文件和日志技术 1、特殊文件 properties&#xff1a;用来存储键值对数据。 xml&#xff1a;用来存储有关系的数据。 1.1 properties文件 特点&#xff1a;存储键值对&#xff0c;键不能重复&#xff0c;文件后缀一般是.properties结尾的。 properties&#xff1a;是…...

2.4 STM32启动过程

目录 一,启动Flow 1.1 初始化MSP 1.2 初始化PC 1.3 设置堆栈大小 1.4初始化中断向量表 1.5 调用初始化函数(可选) 1.6 调用__main 二,Reset_Handler函数 一,启动Flow 下面是stm32在内部FLASH启动的启动建议流程图,在stm32复位到执行我们程序的main函数的过程中,…...

rm: cannot remove: Device or resource busy 解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…...

2024年的5款AI写作工具,你用过几个?

AI技术正逐渐渗透到我们生活的方方面面&#xff0c;其中就包括写作领域。今天&#xff0c;我要为大家介绍5款实用的AI写作助手&#xff0c;它们将帮助你提高写作效率&#xff0c;激发创作灵感&#xff0c;让你的写作之路更加顺畅。 1. 宙语Cosmos-全能写作助手 网址&#xff…...

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架&#xff0c;用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录&#xff0c;以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

【kafka】Golang实现分布式Masscan任务调度系统

要求&#xff1a; 输出两个程序&#xff0c;一个命令行程序&#xff08;命令行参数用flag&#xff09;和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽&#xff0c;然后将消息推送到kafka里面。 服务端程序&#xff1a; 从kafka消费者接收…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互

物理引擎&#xff08;Physics Engine&#xff09; 物理引擎 是一种通过计算机模拟物理规律&#xff08;如力学、碰撞、重力、流体动力学等&#xff09;的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互&#xff0c;广泛应用于 游戏开发、动画制作、虚…...

现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?

现有的 Redis 分布式锁库&#xff08;如 Redisson&#xff09;相比于开发者自己基于 Redis 命令&#xff08;如 SETNX, EXPIRE, DEL&#xff09;手动实现分布式锁&#xff0c;提供了巨大的便利性和健壮性。主要体现在以下几个方面&#xff1a; 原子性保证 (Atomicity)&#xff…...

【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案

目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后&#xff0c;迭代器会失效&#xff0c;因为顺序迭代器在内存中是连续存储的&#xff0c;元素删除后&#xff0c;后续元素会前移。 但一些场景中&#xff0c;我们又需要在执行删除操作…...

Python 高效图像帧提取与视频编码:实战指南

Python 高效图像帧提取与视频编码:实战指南 在音视频处理领域,图像帧提取与视频编码是基础但极具挑战性的任务。Python 结合强大的第三方库(如 OpenCV、FFmpeg、PyAV),可以高效处理视频流,实现快速帧提取、压缩编码等关键功能。本文将深入介绍如何优化这些流程,提高处理…...

自然语言处理——文本分类

文本分类 传统机器学习方法文本表示向量空间模型 特征选择文档频率互信息信息增益&#xff08;IG&#xff09; 分类器设计贝叶斯理论&#xff1a;线性判别函数 文本分类性能评估P-R曲线ROC曲线 将文本文档或句子分类为预定义的类或类别&#xff0c; 有单标签多类别文本分类和多…...

WEB3全栈开发——面试专业技能点P4数据库

一、mysql2 原生驱动及其连接机制 概念介绍 mysql2 是 Node.js 环境中广泛使用的 MySQL 客户端库&#xff0c;基于 mysql 库改进而来&#xff0c;具有更好的性能、Promise 支持、流式查询、二进制数据处理能力等。 主要特点&#xff1a; 支持 Promise / async-await&#xf…...

node.js的初步学习

那什么是node.js呢&#xff1f; 和JavaScript又是什么关系呢&#xff1f; node.js 提供了 JavaScript的运行环境。当JavaScript作为后端开发语言来说&#xff0c; 需要在node.js的环境上进行当JavaScript作为前端开发语言来说&#xff0c;需要在浏览器的环境上进行 Node.js 可…...