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

优采云 发布时间: 2021-12-15 11:13

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

  

  欢迎补充:)

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线