htmlunit抓取动态网页(1.maven依赖引入2.Java代码3.其他功能总结(组图))

优采云 发布时间: 2022-02-04 06:12

  htmlunit抓取动态网页(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

  

  欢迎补充:)

  转载于:

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线