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 中,updateByPrimaryKey和updateByPrimaryKeySelective主要有以下区别: 一、功能 updateByPrimaryKey: 会根据传入的实体对象,将数据库表中对应主键的记录所有字段全部更新为实体对象中的值。即使实体对象中的某些字段…...

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

Django 定义使用模型,并添加数据
教材: Python web企业级项目开发教程(黑马程序员)第三章 模型 实验步骤: 1.创建项目和应用 前置步骤可看前文,进入到指定文件位置后创建 django-admin startproject mysite python manage.py startapp app01 2.注册…...

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

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

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

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

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

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

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

【ShuQiHere】 AI与自我意识:能否创造真正的自觉机器人?
🤖【ShuQiHere】 📜 目录 引言人类意识的探索机器意识的五大理论 功能主义(Functionalism)信息整合(Information Integration)体现主义(Embodiment)行动主义(Enaction&…...

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

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

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

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

Java基础12-特殊文件和日志技术
十二、特殊文件和日志技术 1、特殊文件 properties:用来存储键值对数据。 xml:用来存储有关系的数据。 1.1 properties文件 特点:存储键值对,键不能重复,文件后缀一般是.properties结尾的。 properties:是…...

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

泛癌热门靶点TROP2及研究工具试剂
前 言 TROP2属于肿瘤相关抗原之一,在多种肿瘤中表达升高,促进肿瘤细胞生长、增殖和转移。TROP2已经成为近年来NEJM、肿瘤学期刊、药物研发的多重热点。通过PubMed检索到477篇相关文献,自2020年文献数量逐步增加,2022年达81篇&am…...

2848. 与车相交的点
2848. 与车相交的点 题目链接:2848. 与车相交的点 代码如下: class Solution { public:int numberOfPoints(vector<vector<int>>& nums){set<int> s;for (int i 0; i < nums.size(); i){for (int j nums[i][0]; j < nu…...

第1节 入门
文章目录 1. URL 组成部分详解2. 第一个 Django 项目2.1 项目结构2.2 project 和 app 的关系 3. URL 与视图函数的映射4. URL 的两种传参方式4.1 通过字符串查询4.2 在 path 中携带 5. path 函数详解6. 路由模块化7. 路由反转 1. URL 组成部分详解 URL 的基本组成格式 scheme…...

四数之和(medium)08
其实这道题就是求2数之和,和3数之和的衍生吧,核心算法还是双指针; 暴力解法就不再说了:排序暴力set去重; 直接上:排序双指针去重 大致思路如上图,如果要详细算法过程,可以就看看两数…...

TypeScript中 interface接口 type关键字 enum枚举类型
type interface总是傻傻分不清~~~ Type Aliases (type) type 关键字用于为类型定义一个别名。这可以是基本类型、联合类型、元组、数组、函数等。type 定义的类型在编译后的 JavaScript 代码中会被移除,不会留下任何运行时的代码。 //联合类型 type StringOrNumbe…...

vue3.2实现AES加密解密,秘钥通过API获取,并混淆秘钥,后端thinkphp
aes.ts文件 import CryptoJS from "crypto-js"; import axios from "axios";export const encrypt async(data: any) > {let storeKey sessionStorage.getItem(a)let storeIv:any sessionStorage.getItem(i)// 如果秘钥或 IV 不存在,尝试…...

简述微服务高可用之Sentinel、Seate
简述微服务高可用之Sentinel、Seate使用 下文主要讲述使用sentinel,如何降级限流熔断及如何使用seata管理分布式事务 sentinel服务端安装与使用 1、下载 进入https://github.com/alibaba/Sentinel/releases 根据你的需求进行下载对应版本 我这里是JDK17 下载的1.8.8版本&am…...

将爱传递 将“服务好”延伸
从泰康客户,转身成为泰康人,她直言是因为亲身感受了泰康“服务好”的魅力。 入司已8年的泰康养老浙江分公司HWP何英英,是泰康“服务好”的受益者。她从朋友的理赔中见证了泰康服务好的温度与力量,又被泰康养老的职域模式所吸引选择加入泰康。如今,她全身心投入在服务的第一线,…...

基于MinIO配置bucket,用于文件下载和浏览
文章目录 引言I 配置文件浏览安装MinIO配置自启动服务访问权限配置文件浏览访问地址文件下载地址II 知识扩展MinIO内置访问策略只读策略只写策略读写策略diagnosticsconsoleAdmin引言 需求:文件下载用于OTA升级,文件浏览用于产品展示。 实现方案:基于MinIO配置bucket访问权…...

Ubuntu 配置 ssh 免密连接、安装Docker、docker-compose
Ubuntu 配置 ssh 免密连接 本机 #生成密钥 ssh-keygen -t rsa -b 4096 #发送公钥到服务器 ssh-copy-id usernameremote_host #测试 ssh usernameremote_host全部回车,密钥存储路径默认是 ~/.ssh/id_rsa 服务器 确认服务器公钥配置允许远程公钥认证 sudo vim /et…...