JAVA自动化/爬虫 ---- WebDriver的使用
使用它的原因
由于项目上需要用用户输入的地址抓取一部分其他网页的信息回填到表单中。但是有些信息是动态加载的,单纯使用httpClent请求获取到的页面信息是不完整的,那些动态加载的数据就拿不到。这样一来,你要不然就在js里面找他的api接口,自行获取,要不然就想办法等页面全部加载完成,你再获取页面信息。找他人api有点繁琐,找到了还不一定能请求成功。所以我就使用的等页面加载完成。
使用方法
一、maven信息
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>4.9.1</version>
</dependency>
二、下载匹配自己浏览器的驱动(本案例使用chromeDriver,你也可也使用其他的操作一致)
查看自己谷歌浏览器的版本
linux使用google-chrome --version 查看
进入驱动下载地址(https://chromedriver.chromium.org/downloads)
找和自己版本对应的驱动
放到你的文件夹下解压。
代码
这是yml文件 应为我本地是windows,服务器是linux的
webdriver:
windows: D:\迅雷下载\chromedriver_win32\chromedriver.exe
linux: /data/webDriver/chromedriver
主要代码
@Value("${webdriver.windows}")
private String WINDRIVER;
@Value("${webdriver.linux}")
private String LINUXDRIVER;
public void getInfo(@RequestParam("url")String url){
try {
String os = System.getProperty("os.name");
String drivers="";
//Windows操作系统
if (os != null && os.toLowerCase().startsWith("windows")) {
System.out.println(String.format("当前系统版本是:%s", os));
drivers=WINDRIVER;
} else if (os != null && os.toLowerCase().startsWith("linux")) {//Linux操作系统
System.out.println(String.format("当前系统版本是:%s", os));
drivers=LINUXDRIVER;
} else { //其它操作系统
System.out.println(String.format("当前系统版本是:%s", os));
}
System.out.println("drivers="+drivers);
// /data/webDriver/chromedriver
System.setProperty("webdriver.chrome.driver", drivers);
ChromeOptions chromeOptions = new ChromeOptions();
// 禁用沙箱 -- 这个Option很重要,不然linux可能就报错了
chromeOptions.addArguments("--no-sandbox");
chromeOptions.addArguments("--disable-dev-shm-usage");
chromeOptions.addArguments("--headless");
WebDriver driver = new ChromeDriver(chromeOptions);
driver.get(url);
// 等待页面标题包含 "Example" 字符串,最多等待 4 秒钟
WebDriverWait wait = new WebDriverWait(driver, 4);
//也可也当某个标签加载后返回
// wait.until(ExpectedConditions.titleContains("Example"));
List<String> txtList=new ArrayList<>();
//文字
//比如要获取<div class="a"><a><li>我是帅雷雷</li></a></div> 可以这样写driver.findElements(By.cssSelector(".a a li"));
List<WebElement> elements = driver.findElements(By.cssSelector("这个就是css选择的写法"));
for (int i = 0; i < elements.size(); i++) {
System.out.println(elements.get(i).getText());
}
//记得关闭资源
driver.quit();
} catch (Exception e) {
e.printStackTrace();
System.out.println("发生错误"+DateUtils.getCurrentTimeString());
return new Result().ok("");
}
}