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

Java爬虫(一)

一、Java爬虫简介

1.1 Selenium

        Selenium爬虫是一种基于浏览器自动化的爬虫技术,可以模拟用户的操作行为,实现对动态网页的爬取。

1.2 jsoup

         Jsoup拥有十分方便的api来处理html文档,比如参考了DOM对象的文档遍历方法,参考了CSS选择器的用法等等。

1.3 浏览器驱动下载

        下载指定的浏览器驱动,需要和自己电脑上的浏览器版本一致。

  • Chrome驱动下载地址
  • Microsoft Edge驱动下载地址
  • Firefox驱动下载地址

二、引入依赖

        <jsoup.version>1.17.2</jsoup.version><selenium-java.vesion>4.21.0</selenium-java.vesion><dependency><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>${jsoup.version}</version></dependency><dependency><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-java</artifactId><version>${selenium-java.vesion}</version></dependency>

三、测试

import java.time.Duration;
import java.util.List;import lombok.extern.slf4j.Slf4j;import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.Dimension;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.interactions.Actions;@Slf4j
class WebCrawlerUtilTest {private static WebDriver driver;@BeforeAllpublic static void setUp() {String webdriverName = "webdriver.chrome.driver";String driverPath = "E:\\Java_Tools\\Browser_driver\\Chrome\\version_126\\chromedriver-win64\\chromedriver.exe";// 设置Chrome驱动位置System.getProperties().setProperty(webdriverName, driverPath);}@AfterEach()public void after() {ThreadUtils.sleep(Duration.ofSeconds(5));driver.quit();}@Testvoid test_open_browser() {// 加载 Chrome 浏览器驱动driver = new ChromeDriver();ThreadUtils.sleep(3);//设置访问地址String url = "https://www.baidu.com/";driver.get(url);// 新标签页打开百度新闻driver.findElement(By.linkText("新闻")).click();// 新标签页打开百度视频driver.findElement(By.linkText("地图")).click();}@Testvoid test_find_element() {// 加载 Chrome 浏览器驱动driver = new ChromeDriver();ThreadUtils.sleep(3);//设置访问地址String url = "https://www.baidu.com/";driver.get(url);// 新标签页打开百度新闻WebElement we = driver.findElement(By.xpath("//input[@id='kw']"));// 往搜索框里输入”五一“的搜索内容we.sendKeys("五一");we = driver.findElement(By.id("su"));we.click();}@Testpublic void test_find_element_2() {// 加载 Chrome 浏览器驱动driver = new ChromeDriver();ThreadUtils.sleep(3);//设置访问地址String url = "https://www.baidu.com/";driver.get(url);List<WebElement> wes = driver.findElements(By.className("title-content-title"));log.info("find_elements()返回的数据类型是:type({}})", wes);for (WebElement we : wes) {log.info(we.toString());log.info(we.getText());}}@Testpublic void test_mouse_action() {// 加载 Chrome 浏览器驱动driver = new ChromeDriver();ThreadUtils.sleep(3);//设置访问地址String url = "https://www.baidu.com/";driver.get(url);// 设置浏览器窗口的大小,driver.set_window_size(宽,高);driver.manage().window().setSize(new Dimension(1200, 800));WebElement we = driver.findElement(By.id("s-usersetting-top"));Actions action = new Actions(driver);action.moveToElement(we).perform();ThreadUtils.sleep(5);WebElement we2 = driver.findElement(By.linkText("图片"));action.contextClick(we2).perform();ThreadUtils.sleep(5);// 用于刷新当前页面driver.navigate().refresh();}@Testpublic void test_keyboard_action() {// 加载 Chrome 浏览器驱动driver = new ChromeDriver();ThreadUtils.sleep(3);//设置访问地址String url = "https://www.baidu.com/";driver.get(url);WebElement we = driver.findElement(By.id("kw"));// 模拟键盘操作we.sendKeys("五一");// 使用回车代替点击 driver.find_element(By.ID, "su")we.sendKeys(Keys.ENTER);}
}

相关文章:

  • OneNote for Windows 10 下载
  • input元素的oninput事件和onchange事件
  • RIP、OSPF、IS-IS学习
  • ViT:4 Pruning
  • 2024.06.22【读书笔记】丨生物信息学与功能基因组学(第十七章 人类基因组 第二部分)【AI测试版】
  • reflutter工具实践之--xx一番赏app
  • 卤货商家配送小程序商城是怎样的模式
  • docker desktop for mac os如何使用本地代理
  • SpringBoot Gradle和Vue 两个项目结构进行解释,说明其作用
  • MySQL支持的四种隔离级别
  • 【Linux】线程池
  • 【Linux】系统文件IO·文件描述符fd
  • Zookeeper 集群的应用场景
  • 【docker1】指令,docker-compose,Dockerfile
  • 刷题——比较版本号
  • [iOS]Core Data浅析一 -- 启用Core Data
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • AWS实战 - 利用IAM对S3做访问控制
  • C++入门教程(10):for 语句
  • ng6--错误信息小结(持续更新)
  • python 装饰器(一)
  • Sass 快速入门教程
  • Vue学习第二天
  • 后端_ThinkPHP5
  • 力扣(LeetCode)22
  • 每个JavaScript开发人员应阅读的书【1】 - JavaScript: The Good Parts
  • 让你的分享飞起来——极光推出社会化分享组件
  • 我有几个粽子,和一个故事
  • 译自由幺半群
  • d²y/dx²; 偏导数问题 请问f1 f2是什么意思
  • Hibernate主键生成策略及选择
  • ​十个常见的 Python 脚本 (详细介绍 + 代码举例)
  • ​学习笔记——动态路由——IS-IS中间系统到中间系统(报文/TLV)​
  • !!Dom4j 学习笔记
  • #我与Java虚拟机的故事#连载14:挑战高薪面试必看
  • $().each和$.each的区别
  • (1)常见O(n^2)排序算法解析
  • (145)光线追踪距离场柔和阴影
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (转)linux自定义开机启动服务和chkconfig使用方法
  • (转载)从 Java 代码到 Java 堆
  • .NET 4.0中使用内存映射文件实现进程通讯
  • .net redis定时_一场由fork引发的超时,让我们重新探讨了Redis的抖动问题
  • .NET 读取 JSON格式的数据
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)
  • .NET8使用VS2022打包Docker镜像
  • .NET轻量级ORM组件Dapper葵花宝典
  • .set 数据导入matlab,设置变量导入选项 - MATLAB setvaropts - MathWorks 中国
  • @property括号内属性讲解
  • @transaction 提交事务_【读源码】剖析TCCTransaction事务提交实现细节
  • [240727] Qt Creator 14 发布 | AMD 推迟 Ryzen 9000芯片发布
  • [AR]Vumark(下一代条形码)
  • [Asp.net MVC]Bundle合并,压缩js、css文件
  • [English]英语积累本
  • [ffmpeg] x264 配置参数解析