Java爬虫之使用Selenium WebDriver 爬取数据_java selenium爬虫
这里写自定义目录标题
- 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://:5555/
就可以看到如下页面
sessions:代表创建了几个会话。
max.concurrentcy: 代表 你这个容器同时可以处理几个对话。
图中这种情况只能 同时模拟一个网页,也就是同时只能处理一个会话。
访问noVNC
http://: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(); //存储当前原始窗口或页签的ID String 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()); //从地址栏中读取当前 URL System.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定位方法提供了八种元素定位方法,所对应的方法、特性分别是:
(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();//从地址栏中读取当前 URLdriver.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\"); //设置一个Cookie driver.manage().addCookie(new Cookie(\"login\", \"fgflkshf&\")); // 获取key是 \'login\'的Cookie Cookie 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