动态网页抓取( 前情介绍前段时间开发了一个功能,解决过程中遇到的问题)
优采云 发布时间: 2022-02-03 00:22动态网页抓取(
前情介绍前段时间开发了一个功能,解决过程中遇到的问题)
Java基于Selenium动态爬取页面
介绍
前段时间开发了一个功能,通过HttpClient访问某个页面,获取该页面的所有html内容;然后被抓取的整个页面显示在我自己的网页上;但是一段时间后,网页升级了,图片变成了动态加载,无法直接通过HttpClient获取完整的页面内容。图片处于延迟加载状态,无法显示正确的内容。
解决方案
由于没有办法直接爬取静态页面,可以尝试动态爬取页面;如何爬取动态页面,本文使用Selenium来动态爬取页面。Selenium 模拟正常打开浏览器并浏览网页的过程。当整个页面加载到页面底部,然后抓取整个网页的内容,就可以完整的获取到页面内容。
Selenium 的 WebDriver 可以模拟不同的浏览器。本文使用 Chrome 浏览器。对于其他支持的浏览器,可以通过查看WebDriver的实现类得到答案。
编码
引用 Selenium 库的 jar 包
org.seleniumhq.selenium
selenium-java
3.141.59
因为要模拟Chrome浏览器,所以需要下载chromedriver。基础工作做好了,接下来就是开发代码了。废话不多说,直接上代码吧。
<p>public String selenium(String url) throws InterruptedException {
// 设置 chromedirver 的存放位置
System.getProperties().setProperty("webdriver.chrome.driver", "D:/lingy/chromedriver_win32/chromedriver.exe");
// 设置无头浏览器,这样就不会弹出浏览器窗口
ChromeOptions chromeOptions = new ChromeOptions();
chromeOptions.addArguments("--headless");
Long scrollSize = 1000L;
WebDriver webDriver = new ChromeDriver(chromeOptions);
webDriver.get(url);
//设置浏览器的宽高
Dimension dimension = new Dimension(1000, scrollSize.intValue());
webDriver.manage().window().setSize(dimension);
String html = "";
//获取JS执行器,可以执行js代码来控制页面
JavascriptExecutor driver_js= ((JavascriptExecutor) webDriver);
//获取页面的高度
Long scrollHeight = (Long) driver_js.executeScript("return document.body.scrollHeight");
logger.info("article hight is : {}",scrollHeight);
//因为要模拟鼠标滚动浏览网页的效果,所以设置了每次滚动的高度,然后通过整个页面的高度计算出股东的次数
Long loopNum = scrollHeight/scrollSize;
loopNum = loopNum+1;
logger.info("page need scroll times : {}",loopNum);
for(int i =0 ; i