htmlunit抓取动态网页(1.依赖引入2.Java代码3.其余功能总结(组图))
优采云 发布时间: 2021-12-15 11:13htmlunit抓取动态网页(1.依赖引入2.Java代码3.其余功能总结(组图))
一般我们使用Java提供的HttpURLConnection或者Apache的HttpClient的网页源码是直观可见的,浏览器右键->点击查看源码,代码内容与网页内容一致网页的代码。html
但是现在越来越多的网站使用Js动态生成内容来提高相应的速度,而HttpClient在后端只返回相应响应的请求体,并没有返回浏览器生成的网页,所以对于 Js 生成的内容 HttpClient 是不可用的。爪哇
获取js生成的网页,我们主要是模拟浏览器的操作,渲染响应请求体,最终获取对应的内容,获取的内容与浏览器的内容一致右键网页->点击check/视图元素。网络
我们这里讲的模拟方法大概有两种:windows
抓取目标
我们这次的目标是获取bilibili动态生成的*敏*感*词*列表。左上角是获取到的目标列表,左下角是浏览器渲染的html内容,右边是服务器返回的响应正文。经过比较,我们可以看到目标列表是由Js生成的。
后端
使用 Selenium 获取页面
Selenium 是一种用于 Web 应用程序自动化测试的工具。更多介绍是谷歌。这里主要是用来模拟页面的操作并返回结果,对于网页截图的功能也是可行的。浏览器
Selenium 支持模拟很多浏览器,但这里我们只模拟 PhantomJS,因为 PhantomJS 是一个脚本化的、无界面的 WebKit,它使用 JavaScript 作为脚本语言来实现各种功能。因为它没有接口,所以速度表现会更好。服务器
1.下载
使用PhantomJS需要到官网下载最新的客户端,这里使用phantomjs-2.1.1-windows.zipmaven
2.maven 依赖介绍:ide
org.seleniumhq.selenium
selenium-java
2.53.0
com.codeborne
phantomjsdriver
1.2.1
org.seleniumhq.selenium
selenium-remote-driver
org.seleniumhq.selenium
selenium-java
3.示例代码工具
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.phantomjs.PhantomJSDriver;
import org.openqa.selenium.phantomjs.PhantomJSDriverService;
import org.openqa.selenium.remote.DesiredCapabilities;
import java.util.ArrayList;
/**
* @author GinPonson
*/
public class TestSelenium {
static final String HOST = "127.0.0.1";
static final String PORT = "80";
static final String USER = "gin";
static final String PWD = "12345";
public static void main(String[] args){
System.setProperty("phantomjs.binary.path", "D:\\phantomjs-2.1.1-windows\\bin\\phantomjs.exe");
DesiredCapabilities capabilities = DesiredCapabilities.phantomjs();
//设置代理或者其余参数
ArrayList cliArgsCap = new ArrayList();
//cliArgsCap.add("--proxy=http://"+HOST+":"+PORT);
//cliArgsCap.add("--proxy-auth=" + USER + ":" + PWD);
//cliArgsCap.add("--proxy-type=http");
capabilities.setCapability(PhantomJSDriverService.PHANTOMJS_CLI_ARGS, cliArgsCap);
//capabilities.setCapability("phantomjs.page.settings.userAgent", "");
WebDriver driver = new PhantomJSDriver(capabilities);
driver.get("http://www.bilibili.com/video/bangumi-two-1.html");
System.out.println(driver.getPageSource());
driver.quit();
}
}
4.其他功能
使用 HtmlUnit 获取页面
HtmlUnit 在功能上是 Selenium 的子集,Selenium 有相应的 HtmlUnit 实现。HtmlUnit 是一个用 Java 编写的无界面浏览器。因为没有接口,所以执行速度还是可以的。
1.maven 依赖介绍
2.Java 代码
/**
* @author GinPonson
*/
public class TestHtmlUnit {
static final String HOST = "127.0.0.1";
static final String PORT = "80";
static final String USER = "gin";
static final String PWD = "12345";
public static void main(String[] args) throws Exception{
WebClient webClient = new WebClient();
//设置代理
//ProxyConfig proxyConfig = webClient.getOptions().getProxyConfig();
//proxyConfig.setProxyHost(HOST);
//proxyConfig.setProxyPort(Integer.valueOf(PORT));
//DefaultCredentialsProvider credentialsProvider = (DefaultCredentialsProvider) webClient.getCredentialsProvider();
//credentialsProvider.addCredentials(USER, PWD);
//设置参数
//webClient.getOptions().setCssEnabled(false);
//webClient.getOptions().setJavaScriptEnabled(false);
webClient.getOptions().setThrowExceptionOnScriptError(false);
HtmlPage page = webClient.getPage("http://www.bilibili.com/video/bangumi-two-1.html");
System.out.println(page.asXml());
webClient.close();
}
}
3.其他功能
总结
PhantomJS 和 HtmlUnit 都模拟了浏览器页面生成功能。PhantomJS 是一个非接口的 WebKit。页面渲染功能完善,具有浏览器截图功能,可以模拟登录操作。HtmlUnit使用Rhino引擎解析Js,有时候解析速度很慢,就像上面的例子,需要很长时间,但是HtmlUnit可以拿到页面,解析一组元素(虽然用Jsoup还是不错的解析元素),是一个不错的工具。
HtmlUnit遇到错误后,处理有7分钟的差异,大部分不知道怎么用QAQ
欢迎补充:)