htmlunit 抓取网页(1.maven依赖引入2.Java代码3.其他功能总结(组图))
优采云 发布时间: 2021-10-17 18:20htmlunit 抓取网页(1.maven依赖引入2.Java代码3.其他功能总结(组图))
通常,我们使用Java提供的HttpURLConnection或者Apache的HttpClient来获取直观可见的网页源代码,通过浏览器右键->点击,代码内容与网页内容一致查看网页的源代码。
但是现在越来越多的网站使用Js动态生成内容来提高相应的速度,而HttpClient只返回后端对应的响应请求体,不返回浏览器生成的网页,所以对于js 生成的内容 HttpClient 不可用。
获取js生成的网页,我们主要是模拟浏览器的操作,渲染响应请求体,最终得到对应的内容。通过浏览器右键->点击查看/查看元素,获取的内容与网页内容一致。
我们这里讲的模拟方法大致有两种:
抓取目标
我们这次的目标是获取bilibili动态生成的*敏*感*词*列表。左上角是获取到的目标列表,左下角是浏览器渲染的html内容,右边是服务器返回的响应正文。通过对比,我们可以看到目标列表是由Js生成的。
使用 Selenium 获取页面
Selenium 是一种用于 Web 应用程序自动化测试的工具。更多介绍是谷歌。这里我们主要用来模拟页面的操作并返回结果。网页截图的功能也是可行的。
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可以获取页面并解析一组元素(当然最好使用Jsoup来解析元素)。不错的工具。
HtmlUnit遇到错误后,处理前后相差7分钟。可能是我不使用QAQ
欢迎补充:)