htmlunit抓取动态网页(1.maven依赖引入2.Java代码3.其他功能总结(组图))
优采云 发布时间: 2022-02-04 06:12htmlunit抓取动态网页(1.maven依赖引入2.Java代码3.其他功能总结(组图))
通常我们使用Java提供的HttpURLConnection或者Apache的HttpClient来获取网页的源代码,直观可见,代码内容与网页内容一致通过浏览器右键->点击查看网页源代码。
但是现在越来越多的网站使用Js动态生成内容来提高相应的速度,而HttpClient只是在后端返回相应响应的请求体,并没有返回浏览器生成的网页,所以对于Js生成的内容HttpClient无法获取。
对于获取Js生成的网页,我们主要是模拟浏览器的操作,渲染响应的请求体,最后得到相应的内容。
我们在这里讨论的模拟方法大致有两种:
抓取目标
我们这次的目标是获取bilibili动态生成的*敏*感*词*列表。左上为抓取的目标列表,左下为浏览器渲染的HTML内容,右为服务器返回的响应正文。通过对比可以看出,目标列表是由Js生成的。
使用 Selenium 获取页面
Selenium 是一种用于自动测试 Web 应用程序的工具,更多的是在 Google 上。这里我们主要用它来模拟页面的操作并返回结果,对于网页截图的功能也是可行的。
Selenium 支持模拟很多浏览器,但是我们这里只模拟 PhantomJS,因为 PhantomJS 是一个脚本化的、无界面的 WebKit,它使用 JavaScript 作为脚本语言来实现各种功能。由于是无接口的,所以在速度性能方面会更好。
1.下载
使用PhantomJS需要从官网下载最新的客户端,这里使用phantomjs-2.1.1-windows.zip
2.maven依赖介绍:
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依赖介绍
net.sourceforge.htmlunit
htmlunit
2.25
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 可以获取页面并解析元素。不错的工具。
HtmlUnit遇到错误后,处理前后相差7分钟,可能我不会用QAQ
欢迎补充:)
转载于: