前言
爬虫常见的有以下几种
- 通过接口抓取
- 通过页面抓取
通过页面抓取的有只能爬静态页面的,当然也有可以模拟登录的。
这里说的selenium-java
就是使用浏览器访问,来爬取数据,所以可以做所有浏览器的行为,比如模拟登录。
它的原理就是使用驱动打开本地的浏览器并建立连接,浏览器进程和调用进程不在同一进程中,通过给浏览器各种指令获取和处理数据。
添加依赖
1 | <dependencies> |
爬取
基本示例
1 | import io.github.bonigarcia.wdm.WebDriverManager; |
登录示例
1 | driver.get("https://schooltest.xhkjedu.com/#/login"); |
常用API
自动下载配置驱动
这里使用了镜像来下载驱动。
注意驱动不是浏览器,而是连接浏览器的桥梁。
1 | // 自动下载并配置 ChromeDriver |
设置并加载页面
1 | // 配置Chrome选项(无头模式可选) |
其中options.addArguments("--headless");
是配置浏览器不可见。
开发过程中可以让浏览器显示出来,正式使用的时候可以隐藏。
获取元素
通过Name
1 | WebElement usernameField = driver.findElement(By.name("username")); |
通过样式
1 | List<WebElement> postTitleList = driver.findElements(By.cssSelector("a.post-title-link")); |
通过placeholder
1 | WebElement usernameField = driver.findElement(By.cssSelector("input[placeholder=\"请输入账号\"]")); |
通过Type获取
1 | WebElement submitButton = driver.findElement(By.cssSelector("button[type=submit]")); |
等待元素
1 | WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(2)); |
获取内容
1 | List<WebElement> postTitleList = driver.findElements(By.cssSelector("a.post-title-link")); |
注意
如果页面有JS动画,控制页面的内容,我们需要等待一定时间让页面渲染出来。
退出驱动
1 | driver.quit();// 关闭浏览器 |
截图
1 | // 执行截图操作 |
默认截图的大小受系统缩放比例的影响,所以截图的大小会是原始尺寸 * 缩放比例
。
为了不受缩放比例的影响可以设置:
1 | ChromeOptions options = new ChromeOptions(); |
获取元素的宽度
1 | WebElement baseElement = driver.findElement(By.tagName("body")); |
获取位置
1 | WebElement baseElement = driver.findElement(By.tagName("body")); |
其中
getLocation()
是返回的相对于浏览器窗口左上角 的位置。
模拟移动与点击
相对元素位置
1 | // 定位一个基础元素(这里以页面的 body 元素为例) |
注意
相对元素移动的时候,移动的位置对于元素来说必须是可见的。如果上面有个按钮挡着了是会报错的。
方法说明
moveToElement(WebElement target, int xOffset, int yOffset)
方法用于将鼠标移动到指定元素的特定位置。
这个方法的参数含义如下:
参数详解
参数 | 含义 |
---|---|
target |
目标元素(WebElement 对象),鼠标将以该元素为基准进行定位。 |
xOffset |
水平偏移量(像素),相对于元素左上角的 X 坐标。正值向右,负值向左。 |
yOffset |
垂直偏移量(像素),相对于元素左上角的 Y 坐标。正值向下,负值向上。 |
坐标系统说明
- 原点:元素的左上角 (
0, 0
) - 正方向:向右和向下为正
相对于窗口位置
1 | // 创建 Actions 对象 |
这个方法允许你从当前鼠标位置开始,按照指定的像素偏移量移动鼠标。
方法介绍
1 | Actions actions = new Actions(driver); |
参数
参数 | 含义 |
---|---|
xOffset |
水平偏移量(像素),正值向右,负值向左。 |
yOffset |
垂直偏移量(像素),正值向下,负值向上。 |
坐标系统说明
- 原点:浏览器窗口的左上角 (
0, 0
) - 正方向:向右和向下为正
- 注意:初始鼠标位置默认为浏览器窗口的左上角 (
0, 0
),除非你之前使用过moveToElement()
或其他鼠标操作