
htmlunit 抓取网页
htmlunit 抓取网页(的java程序是什么?答案是有哪些??)
网站优化 • 优采云 发表了文章 • 0 个评论 • 61 次浏览 • 2021-10-20 21:00
1.HtmlUnit1.1 简介
HtmlUnit是一个用java编写的无界面浏览器,建模html文档,通过API调用页面,填写表单,点击链接等。像普通浏览器一样操作。通常用于测试和从网页中获取信息。
官方简介翻译
HtmlUnit是一个无界面浏览器Java程序。它为HTML文档建模,提供了调用页面、填写表单、单击链接等操作的API。就跟你在浏览器里做的操作一样。
HtmlUnit不错的JavaScript支持(不断改进),甚至可以使用相当复杂的AJAX库,根据配置的不同模拟Chrome、Firefox或Internet Explorer等浏览器。
HtmlUnit通常用于测试或从web站点检索信息。
1.2使用场景
对于使用java实现的网络爬虫程序,我们一般可以使用Apache的HttpClient组件来获取HTML页面信息。HttpClient实现的http请求返回的响应一般是纯文本文档页面,也就是最原创的html页面。
对于一个静态的html页面,使用httpClient就足以爬出我们需要的信息。但是对于越来越多的动态网页,更多的数据是通过异步JS代码获取和渲染的。原来的html页面不收录这部分数据。
在上图我们看到的网页中,初始文件加载完成后,红框中的数据列表是看不到的。浏览器通过执行异步JS请求,将获取到的动态数据渲染到原创文档页面,最终成为我们看到的网页。对于这部分需要JS代码执行的数据,httpClient显得力不从心。虽然我们可以拿到JS执行的请求路径,然后用java代码拿到我们需要的那部分数据,更别说从JS脚本中能不能分析出请求路径和请求参数,只分析这部分源码代码价格已经很高了。
通过上面的介绍,我们了解到目前动态网页中有很大一部分是通过异步JS请求获取,然后通过JS渲染页面的。那么我们可以做这样的假设吗,假设我们的爬虫程序模拟了一个浏览器,在获取到html页面后,像浏览器一样执行异步JS代码,在JS渲染完html页面后,就可以愉快的获取到页面上的节点信息了页面不见了。那么有没有这样的java程序呢?
答案是肯定的。
HtmlUnit就是这样一个库,用来让界面意外地展示所有异步工作。由于没有需要显示的耗时工作,HtmlUnit 加载的比实际浏览器块更多,以完成一个完整的网页。并且根据不同的配置,HtmlUnit可以模拟市面上常用的浏览器,如Chrome、Firefox、IE浏览器等。
通过HtmlUnit库,加载一个完整的Html页面(图片和视频除外),然后就可以将其转换为我们常用的字符串格式,并使用Jsoup等其他工具获取元素。当然,你也可以直接从HtmlUnit提供的对象中获取网页元素,甚至可以操作按钮、表单等控件。除了不能像可见浏览器那样使用鼠标和键盘来浏览网页之外,我们还可以使用HtmlUnit来模拟和操作所有其他操作,比如登录网站、写博客等都可以完成。当然,网页内容抓取是最简单的应用。
2.J4L2.1官方简介
J4L OCR 工具是一组可用于在 Java 应用程序中收录 OCR 功能的组件。这意味着您可以接收传真、PDF 文件或扫描文档并从图像中提取业务信息。主要的3个组件是:
j4l工具的详细使用步骤请参考这篇文章文章:Java使用J4L识别验证码
本文文章主要介绍使用HtmlUnit模拟登录
3.实际案例3.1.场景
一个登录页面,包括一个表单,需要填写用户名、登录密码和验证码才能实现用户登录。
3.2 操作步骤
使用htmlunit模拟登录是一个获取登录页面->找到输入框->填写用户名和密码->填写验证码->模拟点击登录的过程。
4.实现代码4.1maven引入HtmlUnit依赖
net.sourceforge.htmlunit
htmlunit
2.18
4.2 主要方法
登录.java
public static void main(String[] args) throws Exception {
login();
}
public static void login() throws Exception {
WebClient webClient = new WebClient(BrowserVersion.CHROME);//设置浏览器内核
webClient.getOptions().setJavaScriptEnabled(true);// js是否可用
webClient.getOptions().setCssEnabled(true);//css 一般设置false因为影响运行速度
webClient.getOptions().setThrowExceptionOnScriptError(false);//设置js抛出异常:false
webClient.getOptions().setActiveXNative(false);
//ajax
webClient.setAjaxController(new NicelyResynchronizingAjaxController());
webClient.getOptions().setUseInsecureSSL(false);
//允许重定向
webClient.getOptions().setRedirectEnabled(true);
//连接超时
webClient.getOptions().setTimeout(5000);
//js执行超时
webClient.setJavaScriptTimeout(10000 * 3);
//允许cookie
webClient.getCookieManager().setCookiesEnabled(true);
String url = "http://hrportalneu.cs/HRPortal ... 3B%3B
HtmlPage page = webClient.getPage(url);
webClient.waitForBackgroundJavaScript(5000);
HtmlPage newPage;
newPage = readyPage(page, webClient, "btnCheckIn1");
System.out.println("url----------------" + newPage.getUrl());
System.out.println("Login执行后页面:" + newPage.asXml());
IOUtils.write(newPage.asXml().getBytes(), new FileWriter(new File("D:/checkIn.txt")));
if (!newPage.asXml().contains("登录成功")) {
login();
}
webClient.close();
}
public static HtmlPage readyPage(HtmlPage page, WebClient webClient, String type) throws Exception {
//封装页面元素
HtmlForm form = page.getHtmlElementById("form1");
HtmlTextInput tbxUsername = form.getInputByName("tbxUsername");
tbxUsername.setValueAttribute("用户名*******");
HtmlPasswordInput tbxPassword = form.getInputByName("tbxPassword");
tbxPassword.setValueAttribute("密码*******");
//获取验证码图片
HtmlImage verify_img = (HtmlImage) page.getElementById("AuthCode1$codeText$img");
File file = new File("D:\\" + "check" + ".png");
//保存验证码图片
verify_img.saveAs(file);
System.out.println("验证码图片已保存!");
//保存路径
String filePath = file.getPath();
//裁剪验证码 这里使用原始的图片文件识别成功率不高 可以先进行裁剪
ImageUtil.cutImage(filePath, 1, 1, 96, 34);
//自动识别验证码
OCRFacade facade = new OCRFacade();
//识别验证码
String code = facade.recognizeFile(filePath, "eng");
//处理字符串
code = code.replaceAll(" ", "");
code = code.replaceAll("\\n", "");
System.out.println("验证码:" + code);
//定位验证码输入框
HtmlTextInput verify_code = form.getInputByName("AuthCode1$codeText");
//填入自动识别出来的验证码
verify_code.setValueAttribute(code);
System.out.println("原始页面:" + page.asXml());
HtmlPage newPage = null;
//操作按钮
if (type.equals("btnCheckIn1")) {
DomElement btnCheckIn1 = page.getElementById("btnCheckIn1");
System.out.println("doCheckIn");
newPage = btnCheckIn1.click();
}
//等待js加载
webClient.waitForBackgroundJavaScript(5000);
return newPage;
}
图像实用程序
public class ImageUtil {
public static void cutImage(String filePath, int x, int y, int w, int h)
throws Exception {
// 首先通过ImageIo中的方法,创建一个Image + InputStream到内存
ImageInputStream iis = ImageIO
.createImageInputStream(new FileInputStream(filePath));
// 再按照指定格式构造一个Reader(Reader不能new的)
Iterator it = ImageIO.getImageReadersByFormatName("gif");
ImageReader imagereader = (ImageReader) it.next();
// 再通过ImageReader绑定 InputStream
imagereader.setInput(iis);
// 设置感兴趣的源区域。
ImageReadParam par = imagereader.getDefaultReadParam();
par.setSourceRegion(new Rectangle(x, y, w, h));
// 从 reader得到BufferImage
BufferedImage bi = imagereader.read(0, par);
// 将BuffeerImage写出通过ImageIO
ImageIO.write(bi, "png", new File(filePath));
}
}
在控制台中,查看执行登录后的页面,查看是否登录成功。 查看全部
htmlunit 抓取网页(的java程序是什么?答案是有哪些??)
1.HtmlUnit1.1 简介
HtmlUnit是一个用java编写的无界面浏览器,建模html文档,通过API调用页面,填写表单,点击链接等。像普通浏览器一样操作。通常用于测试和从网页中获取信息。
官方简介翻译
HtmlUnit是一个无界面浏览器Java程序。它为HTML文档建模,提供了调用页面、填写表单、单击链接等操作的API。就跟你在浏览器里做的操作一样。
HtmlUnit不错的JavaScript支持(不断改进),甚至可以使用相当复杂的AJAX库,根据配置的不同模拟Chrome、Firefox或Internet Explorer等浏览器。
HtmlUnit通常用于测试或从web站点检索信息。
1.2使用场景
对于使用java实现的网络爬虫程序,我们一般可以使用Apache的HttpClient组件来获取HTML页面信息。HttpClient实现的http请求返回的响应一般是纯文本文档页面,也就是最原创的html页面。
对于一个静态的html页面,使用httpClient就足以爬出我们需要的信息。但是对于越来越多的动态网页,更多的数据是通过异步JS代码获取和渲染的。原来的html页面不收录这部分数据。
在上图我们看到的网页中,初始文件加载完成后,红框中的数据列表是看不到的。浏览器通过执行异步JS请求,将获取到的动态数据渲染到原创文档页面,最终成为我们看到的网页。对于这部分需要JS代码执行的数据,httpClient显得力不从心。虽然我们可以拿到JS执行的请求路径,然后用java代码拿到我们需要的那部分数据,更别说从JS脚本中能不能分析出请求路径和请求参数,只分析这部分源码代码价格已经很高了。
通过上面的介绍,我们了解到目前动态网页中有很大一部分是通过异步JS请求获取,然后通过JS渲染页面的。那么我们可以做这样的假设吗,假设我们的爬虫程序模拟了一个浏览器,在获取到html页面后,像浏览器一样执行异步JS代码,在JS渲染完html页面后,就可以愉快的获取到页面上的节点信息了页面不见了。那么有没有这样的java程序呢?
答案是肯定的。
HtmlUnit就是这样一个库,用来让界面意外地展示所有异步工作。由于没有需要显示的耗时工作,HtmlUnit 加载的比实际浏览器块更多,以完成一个完整的网页。并且根据不同的配置,HtmlUnit可以模拟市面上常用的浏览器,如Chrome、Firefox、IE浏览器等。
通过HtmlUnit库,加载一个完整的Html页面(图片和视频除外),然后就可以将其转换为我们常用的字符串格式,并使用Jsoup等其他工具获取元素。当然,你也可以直接从HtmlUnit提供的对象中获取网页元素,甚至可以操作按钮、表单等控件。除了不能像可见浏览器那样使用鼠标和键盘来浏览网页之外,我们还可以使用HtmlUnit来模拟和操作所有其他操作,比如登录网站、写博客等都可以完成。当然,网页内容抓取是最简单的应用。
2.J4L2.1官方简介
J4L OCR 工具是一组可用于在 Java 应用程序中收录 OCR 功能的组件。这意味着您可以接收传真、PDF 文件或扫描文档并从图像中提取业务信息。主要的3个组件是:
j4l工具的详细使用步骤请参考这篇文章文章:Java使用J4L识别验证码
本文文章主要介绍使用HtmlUnit模拟登录
3.实际案例3.1.场景
一个登录页面,包括一个表单,需要填写用户名、登录密码和验证码才能实现用户登录。
3.2 操作步骤
使用htmlunit模拟登录是一个获取登录页面->找到输入框->填写用户名和密码->填写验证码->模拟点击登录的过程。
4.实现代码4.1maven引入HtmlUnit依赖
net.sourceforge.htmlunit
htmlunit
2.18
4.2 主要方法
登录.java
public static void main(String[] args) throws Exception {
login();
}
public static void login() throws Exception {
WebClient webClient = new WebClient(BrowserVersion.CHROME);//设置浏览器内核
webClient.getOptions().setJavaScriptEnabled(true);// js是否可用
webClient.getOptions().setCssEnabled(true);//css 一般设置false因为影响运行速度
webClient.getOptions().setThrowExceptionOnScriptError(false);//设置js抛出异常:false
webClient.getOptions().setActiveXNative(false);
//ajax
webClient.setAjaxController(new NicelyResynchronizingAjaxController());
webClient.getOptions().setUseInsecureSSL(false);
//允许重定向
webClient.getOptions().setRedirectEnabled(true);
//连接超时
webClient.getOptions().setTimeout(5000);
//js执行超时
webClient.setJavaScriptTimeout(10000 * 3);
//允许cookie
webClient.getCookieManager().setCookiesEnabled(true);
String url = "http://hrportalneu.cs/HRPortal ... 3B%3B
HtmlPage page = webClient.getPage(url);
webClient.waitForBackgroundJavaScript(5000);
HtmlPage newPage;
newPage = readyPage(page, webClient, "btnCheckIn1");
System.out.println("url----------------" + newPage.getUrl());
System.out.println("Login执行后页面:" + newPage.asXml());
IOUtils.write(newPage.asXml().getBytes(), new FileWriter(new File("D:/checkIn.txt")));
if (!newPage.asXml().contains("登录成功")) {
login();
}
webClient.close();
}
public static HtmlPage readyPage(HtmlPage page, WebClient webClient, String type) throws Exception {
//封装页面元素
HtmlForm form = page.getHtmlElementById("form1");
HtmlTextInput tbxUsername = form.getInputByName("tbxUsername");
tbxUsername.setValueAttribute("用户名*******");
HtmlPasswordInput tbxPassword = form.getInputByName("tbxPassword");
tbxPassword.setValueAttribute("密码*******");
//获取验证码图片
HtmlImage verify_img = (HtmlImage) page.getElementById("AuthCode1$codeText$img");
File file = new File("D:\\" + "check" + ".png");
//保存验证码图片
verify_img.saveAs(file);
System.out.println("验证码图片已保存!");
//保存路径
String filePath = file.getPath();
//裁剪验证码 这里使用原始的图片文件识别成功率不高 可以先进行裁剪
ImageUtil.cutImage(filePath, 1, 1, 96, 34);
//自动识别验证码
OCRFacade facade = new OCRFacade();
//识别验证码
String code = facade.recognizeFile(filePath, "eng");
//处理字符串
code = code.replaceAll(" ", "");
code = code.replaceAll("\\n", "");
System.out.println("验证码:" + code);
//定位验证码输入框
HtmlTextInput verify_code = form.getInputByName("AuthCode1$codeText");
//填入自动识别出来的验证码
verify_code.setValueAttribute(code);
System.out.println("原始页面:" + page.asXml());
HtmlPage newPage = null;
//操作按钮
if (type.equals("btnCheckIn1")) {
DomElement btnCheckIn1 = page.getElementById("btnCheckIn1");
System.out.println("doCheckIn");
newPage = btnCheckIn1.click();
}
//等待js加载
webClient.waitForBackgroundJavaScript(5000);
return newPage;
}
图像实用程序
public class ImageUtil {
public static void cutImage(String filePath, int x, int y, int w, int h)
throws Exception {
// 首先通过ImageIo中的方法,创建一个Image + InputStream到内存
ImageInputStream iis = ImageIO
.createImageInputStream(new FileInputStream(filePath));
// 再按照指定格式构造一个Reader(Reader不能new的)
Iterator it = ImageIO.getImageReadersByFormatName("gif");
ImageReader imagereader = (ImageReader) it.next();
// 再通过ImageReader绑定 InputStream
imagereader.setInput(iis);
// 设置感兴趣的源区域。
ImageReadParam par = imagereader.getDefaultReadParam();
par.setSourceRegion(new Rectangle(x, y, w, h));
// 从 reader得到BufferImage
BufferedImage bi = imagereader.read(0, par);
// 将BuffeerImage写出通过ImageIO
ImageIO.write(bi, "png", new File(filePath));
}
}
在控制台中,查看执行登录后的页面,查看是否登录成功。
htmlunit 抓取网页(1.maven依赖引入2.Java代码3.其他功能总结(组图))
网站优化 • 优采云 发表了文章 • 0 个评论 • 99 次浏览 • 2021-10-17 18:20
通常,我们使用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/ ... 6quot;);
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/ ... 6quot;);
System.out.println(page.asXml());
webClient.close();
}
}
3.其他功能
总结
PhantomJS 和 HtmlUnit 都模拟了浏览器页面生成功能。PhantomJS 是一个非接口的 WebKit。渲染页面的功能非常齐全,并且有浏览器截图功能,可以模拟登录操作。HtmlUnit 使用 Rhino 引擎解析 Js。有时解析速度很慢。就像上面的例子一样,需要很长时间,但是HtmlUnit可以获取页面并解析一组元素(当然最好使用Jsoup来解析元素)。不错的工具。
HtmlUnit遇到错误后,处理前后相差7分钟。可能是我不使用QAQ
欢迎补充:) 查看全部
htmlunit 抓取网页(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/ ... 6quot;);
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/ ... 6quot;);
System.out.println(page.asXml());
webClient.close();
}
}
3.其他功能
总结
PhantomJS 和 HtmlUnit 都模拟了浏览器页面生成功能。PhantomJS 是一个非接口的 WebKit。渲染页面的功能非常齐全,并且有浏览器截图功能,可以模拟登录操作。HtmlUnit 使用 Rhino 引擎解析 Js。有时解析速度很慢。就像上面的例子一样,需要很长时间,但是HtmlUnit可以获取页面并解析一组元素(当然最好使用Jsoup来解析元素)。不错的工具。
HtmlUnit遇到错误后,处理前后相差7分钟。可能是我不使用QAQ

欢迎补充:)
htmlunit 抓取网页(使用本文中推荐的开源工具——HtmlUnit,一款能够模拟浏览器的抓包神器!)
网站优化 • 优采云 发表了文章 • 0 个评论 • 72 次浏览 • 2021-10-15 08:02
之前一峰写过一篇关于使用Jsoup爬取网页内容的文章文章:
[Jsoup] HTML解析器,轻松访问网页内容
Jsoup提供的api非常方便,完全类似于JQuery操作,轻松抓取网页数据。但是像Jsoup这样的普通爬虫工具的缺点是无法处理js生成的内容。
做过Html开发的都知道,现在很多网站都大量使用ajax和JavaScript来获取和处理数据,普通的爬虫工具已经无法处理js中的内容了。
比如我们在本地新建一个测试web文件text.html,源码如下:
main.html
a {
line-height: 30px;
margin: 20px;
}
var datas = [ {
href : "http://www.jianshu.com/p/8d8edf25850d",
title : "推荐一款编程字体,让代码看着更美"
}, {
href : "http://www.jianshu.com/p/153d9f31288d",
title : "Android 利用Camera实现中轴3D卡牌翻转效果"
}, {
href : "http://www.jianshu.com/p/d6fb0c9c9c26",
title : "【Eclipse】挖掘专属最有用的快捷键组合"
}, {
href : "http://www.jianshu.com/p/72d69b49d135",
title : "【IIS】Windows下利用IIS建立网站并实现局域网共享"
} ];
window.onload = function() {
var infos = document.getElementById("infos");
for( var i = 0 ; i < datas.length ; i++)
{
var a = document.createElement("a");
a.href = datas[i].href ;
a.innerText = datas[i].title;
infos.appendChild(a);
infos.appendChild(document.createElement("br"))
}
}
HtmlUnit 测试网页内容!
通过IIS发布本地网站(参考易峰之前写的文章:
【IIS】Windows下,使用IIS建立网站,实现局域网共享),
网页在浏览器中显示的效果如下:
网页展示效果.jpg
虽然通过网页评论元素可以看到body收录了网页显示中的文本内容:
网络评论元素.jpg
但是,它根本无法通过 Jsoup 工具使用!从网页源码中可以看出,我们需要抓取的内容是在页面显示后通过ajax和JavaScript加载的。
那么该怎么办?使用本文推荐的开源工具——HtmlUnit,一款可以模拟浏览器的抓包神器!
在官网下载对应的jar包,添加到工程项目的lib中。简单的测试代码如下:
import java.io.IOException;
import java.net.MalformedURLException;
import java.text.ParseException;
import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.DomElement;
import com.gargoylesoftware.htmlunit.html.DomNodeList;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
/**
* @author 亦枫
* @created_time 2016年1月12日
* @file_user_todo Java测试类
* @blog http://www.jianshu.com/users/1 ... icles
*/
public class JavaTest {
/**
* 入口函数
* @param args
* @throws ParseException
*/
public static void main(String[] args) throws ParseException {
try {
WebClient webClient = new WebClient(BrowserVersion.CHROME);
HtmlPage htmlPage = (HtmlPage) webClient.getPage("http://localhost/test.html");
DomNodeList domNodeList = htmlPage.getElementsByTagName("a");
for (int i = 0; i < domNodeList.size(); i++) {
DomElement domElement = (DomElement) domNodeList.get(i);
System.out.println(domElement.asText());
}
webClient.close();
} catch (FailingHttpStatusCodeException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
运行后,控制台打印结果:
HtmlUnit 测试结果.jpg
可见HtmlUnit可以抓取AJAX和JavaScript加载的内容。
HtmlUnit的介绍在官网上很详细。以下内容为易峰翻译的部分内容,供大家参考:
HtmlUnit 是一个基于 Java 的浏览器程序,没有图形界面。它可以调用 HTML 文档并提供 API,使开发人员可以像在普通浏览器上操作一样访问 Web 内容、填写表单、单击超链接等。
它可以很好地支持 JavaScript,并且仍在改进中。同时,它可以解析非常复杂的AJAX库,模拟不同配置下的Chrome、Firefox和IE浏览器。
HtmlUnit 通常用于测试目的和检索 网站 信息。
HtmlUnit 提供了很多用于测试网络请求和抓取网页内容的功能。可以到官网或者其他网站学习使用。 查看全部
htmlunit 抓取网页(使用本文中推荐的开源工具——HtmlUnit,一款能够模拟浏览器的抓包神器!)
之前一峰写过一篇关于使用Jsoup爬取网页内容的文章文章:
[Jsoup] HTML解析器,轻松访问网页内容
Jsoup提供的api非常方便,完全类似于JQuery操作,轻松抓取网页数据。但是像Jsoup这样的普通爬虫工具的缺点是无法处理js生成的内容。
做过Html开发的都知道,现在很多网站都大量使用ajax和JavaScript来获取和处理数据,普通的爬虫工具已经无法处理js中的内容了。
比如我们在本地新建一个测试web文件text.html,源码如下:
main.html
a {
line-height: 30px;
margin: 20px;
}
var datas = [ {
href : "http://www.jianshu.com/p/8d8edf25850d",
title : "推荐一款编程字体,让代码看着更美"
}, {
href : "http://www.jianshu.com/p/153d9f31288d",
title : "Android 利用Camera实现中轴3D卡牌翻转效果"
}, {
href : "http://www.jianshu.com/p/d6fb0c9c9c26",
title : "【Eclipse】挖掘专属最有用的快捷键组合"
}, {
href : "http://www.jianshu.com/p/72d69b49d135",
title : "【IIS】Windows下利用IIS建立网站并实现局域网共享"
} ];
window.onload = function() {
var infos = document.getElementById("infos");
for( var i = 0 ; i < datas.length ; i++)
{
var a = document.createElement("a");
a.href = datas[i].href ;
a.innerText = datas[i].title;
infos.appendChild(a);
infos.appendChild(document.createElement("br"))
}
}
HtmlUnit 测试网页内容!
通过IIS发布本地网站(参考易峰之前写的文章:
【IIS】Windows下,使用IIS建立网站,实现局域网共享),
网页在浏览器中显示的效果如下:
网页展示效果.jpg
虽然通过网页评论元素可以看到body收录了网页显示中的文本内容:
网络评论元素.jpg
但是,它根本无法通过 Jsoup 工具使用!从网页源码中可以看出,我们需要抓取的内容是在页面显示后通过ajax和JavaScript加载的。
那么该怎么办?使用本文推荐的开源工具——HtmlUnit,一款可以模拟浏览器的抓包神器!
在官网下载对应的jar包,添加到工程项目的lib中。简单的测试代码如下:
import java.io.IOException;
import java.net.MalformedURLException;
import java.text.ParseException;
import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.DomElement;
import com.gargoylesoftware.htmlunit.html.DomNodeList;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
/**
* @author 亦枫
* @created_time 2016年1月12日
* @file_user_todo Java测试类
* @blog http://www.jianshu.com/users/1 ... icles
*/
public class JavaTest {
/**
* 入口函数
* @param args
* @throws ParseException
*/
public static void main(String[] args) throws ParseException {
try {
WebClient webClient = new WebClient(BrowserVersion.CHROME);
HtmlPage htmlPage = (HtmlPage) webClient.getPage("http://localhost/test.html");
DomNodeList domNodeList = htmlPage.getElementsByTagName("a");
for (int i = 0; i < domNodeList.size(); i++) {
DomElement domElement = (DomElement) domNodeList.get(i);
System.out.println(domElement.asText());
}
webClient.close();
} catch (FailingHttpStatusCodeException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
运行后,控制台打印结果:
HtmlUnit 测试结果.jpg
可见HtmlUnit可以抓取AJAX和JavaScript加载的内容。
HtmlUnit的介绍在官网上很详细。以下内容为易峰翻译的部分内容,供大家参考:
HtmlUnit 是一个基于 Java 的浏览器程序,没有图形界面。它可以调用 HTML 文档并提供 API,使开发人员可以像在普通浏览器上操作一样访问 Web 内容、填写表单、单击超链接等。
它可以很好地支持 JavaScript,并且仍在改进中。同时,它可以解析非常复杂的AJAX库,模拟不同配置下的Chrome、Firefox和IE浏览器。
HtmlUnit 通常用于测试目的和检索 网站 信息。
HtmlUnit 提供了很多用于测试网络请求和抓取网页内容的功能。可以到官网或者其他网站学习使用。
htmlunit 抓取网页(1.maven依赖引入2.Java代码3.其他功能总结(组图))
网站优化 • 优采云 发表了文章 • 0 个评论 • 56 次浏览 • 2021-10-13 16:27
通常我们使用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/ ... 6quot;);
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/ ... 6quot;);
System.out.println(page.asXml());
webClient.close();
}
}
3.其他功能
总结
PhantomJS 和 HtmlUnit 都模拟了浏览器页面生成功能。PhantomJS 是一个非接口的 WebKit。渲染页面的功能非常齐全,并且有浏览器截图功能,可以模拟登录操作。HtmlUnit 使用 Rhino 引擎解析 Js。有时解析速度很慢。就像上面的例子一样,需要很长时间,但是HtmlUnit可以获取页面并解析一组元素。(当然最好用Jsoup来解析元素)。不错的工具。
HtmlUnit遇到错误后,处理前后相差7分钟。可能是我不使用QAQ
欢迎补充:) 查看全部
htmlunit 抓取网页(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/ ... 6quot;);
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/ ... 6quot;);
System.out.println(page.asXml());
webClient.close();
}
}
3.其他功能
总结
PhantomJS 和 HtmlUnit 都模拟了浏览器页面生成功能。PhantomJS 是一个非接口的 WebKit。渲染页面的功能非常齐全,并且有浏览器截图功能,可以模拟登录操作。HtmlUnit 使用 Rhino 引擎解析 Js。有时解析速度很慢。就像上面的例子一样,需要很长时间,但是HtmlUnit可以获取页面并解析一组元素。(当然最好用Jsoup来解析元素)。不错的工具。
HtmlUnit遇到错误后,处理前后相差7分钟。可能是我不使用QAQ

欢迎补充:)
htmlunit 抓取网页(java编写的无界面浏览器,点赞数4219,值得推荐!)
网站优化 • 优采云 发表了文章 • 0 个评论 • 71 次浏览 • 2021-10-13 16:25
介绍本文文章主要介绍使用HtmlUnit动态获取网页数据(示例代码)及相关经验和技巧。文章约13349字,浏览量421,点赞数9,值得推荐!
1.HtmlUnit是一个用java编写的无界面浏览器,建模html文档,通过API调用页面,填写表单,点击链接等,像普通浏览器一样操作。通常用于测试和从网页中获取信息。而且HtmlUnit兼有HttpClient和soup的功能,但是速度比较慢,但是如果取消它解析css和js的功能,速度会有所提升,默认开启。
2. 这里选择HtmlUnit爬取数据的主要目的是为了获取他的js和css。
3.主要代码如下
package com.los;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.DomElement;
import com.gargoylesoftware.htmlunit.html.DomNodeList;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import com.los.util.DownlandPic;
import java.io.IOException;
import java.util.regex.Pattern;
public class HtmlUnitTest {
public static void main(String[] args) throws IOException {
DownlandPic dd = new DownlandPic();
WebClient webClient = new WebClient();//实例化web客户端
//http://www.bdqn.cn/ https://www.baidu.com/?tn=78000241_22_hao_pg
String url = "http://www.bdqn.cn/";
HtmlPage page = webClient.getPage(url);
webClient.waitForBackgroundJavaScript(10000); //等侍js脚本执行完成
System.out.println(page.asXml());
DomNodeList img = page.getElementsByTagName("script");
for (int i=0;i 0) {
output.write(buffer, 0, length);
}
fileOutputStream.write(output.toByteArray());
dataInputStream.close();
fileOutputStream.close();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public static int getCharacterPosition3(String string){
//这里是获取"""符号的位置
Matcher slashMatcher = Pattern.compile(""").matcher(string);
int mIdx = 0;
while(slashMatcher.find()) {
mIdx++;
//当"/"符号第三次出现的位置
if(mIdx == 2){
break;
}
}
return slashMatcher.start();
}
public static int getCharacterPosition4(String string){
//这里是获取"""符号的位置
Matcher slashMatcher = Pattern.compile(""").matcher(string);
int mIdx = 0;
while(slashMatcher.find()) {
mIdx++;
//当"/"符号第三次出现的位置
if(mIdx == 3){
break;
}
}
return slashMatcher.start();
}
public static void main(String[] args) {
String content = "/img/newImg/news2.jpg";
System.out.println(getCharacterPosition3(content));
System.out.println(getCharacterPosition4(content));
String substring = content.substring(getCharacterPosition3(content), getCharacterPosition4(content));
System.out.println(substring);
}
}
3.因为这里的网页中的图片地址是相对路径,所以下载的时候在下载地址中找到了页面的绝对路径并拼接。下载的路径必须与抓取后存储在本地页面的image标签中的地址相对应,否则找不到。
3.匹配时写2和3的原因”是根据这里爬取的数据
4.与其他爬取网页的方式相比,这可能更简单,但更容易展示效果。如有错误,请指教。至于页面,则不会显示,涉及隐私。
5.学习HtmlUnit请参考:地址 查看全部
htmlunit 抓取网页(java编写的无界面浏览器,点赞数4219,值得推荐!)
介绍本文文章主要介绍使用HtmlUnit动态获取网页数据(示例代码)及相关经验和技巧。文章约13349字,浏览量421,点赞数9,值得推荐!
1.HtmlUnit是一个用java编写的无界面浏览器,建模html文档,通过API调用页面,填写表单,点击链接等,像普通浏览器一样操作。通常用于测试和从网页中获取信息。而且HtmlUnit兼有HttpClient和soup的功能,但是速度比较慢,但是如果取消它解析css和js的功能,速度会有所提升,默认开启。
2. 这里选择HtmlUnit爬取数据的主要目的是为了获取他的js和css。
3.主要代码如下
package com.los;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.DomElement;
import com.gargoylesoftware.htmlunit.html.DomNodeList;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import com.los.util.DownlandPic;
import java.io.IOException;
import java.util.regex.Pattern;
public class HtmlUnitTest {
public static void main(String[] args) throws IOException {
DownlandPic dd = new DownlandPic();
WebClient webClient = new WebClient();//实例化web客户端
//http://www.bdqn.cn/ https://www.baidu.com/?tn=78000241_22_hao_pg
String url = "http://www.bdqn.cn/";
HtmlPage page = webClient.getPage(url);
webClient.waitForBackgroundJavaScript(10000); //等侍js脚本执行完成
System.out.println(page.asXml());
DomNodeList img = page.getElementsByTagName("script");
for (int i=0;i 0) {
output.write(buffer, 0, length);
}
fileOutputStream.write(output.toByteArray());
dataInputStream.close();
fileOutputStream.close();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public static int getCharacterPosition3(String string){
//这里是获取"""符号的位置
Matcher slashMatcher = Pattern.compile(""").matcher(string);
int mIdx = 0;
while(slashMatcher.find()) {
mIdx++;
//当"/"符号第三次出现的位置
if(mIdx == 2){
break;
}
}
return slashMatcher.start();
}
public static int getCharacterPosition4(String string){
//这里是获取"""符号的位置
Matcher slashMatcher = Pattern.compile(""").matcher(string);
int mIdx = 0;
while(slashMatcher.find()) {
mIdx++;
//当"/"符号第三次出现的位置
if(mIdx == 3){
break;
}
}
return slashMatcher.start();
}
public static void main(String[] args) {
String content = "/img/newImg/news2.jpg";
System.out.println(getCharacterPosition3(content));
System.out.println(getCharacterPosition4(content));
String substring = content.substring(getCharacterPosition3(content), getCharacterPosition4(content));
System.out.println(substring);
}
}
3.因为这里的网页中的图片地址是相对路径,所以下载的时候在下载地址中找到了页面的绝对路径并拼接。下载的路径必须与抓取后存储在本地页面的image标签中的地址相对应,否则找不到。
3.匹配时写2和3的原因”是根据这里爬取的数据

4.与其他爬取网页的方式相比,这可能更简单,但更容易展示效果。如有错误,请指教。至于页面,则不会显示,涉及隐私。
5.学习HtmlUnit请参考:地址
htmlunit 抓取网页(1.HtmlUnit的学习方法是什么?怎么样?HtmlUnit)
网站优化 • 优采云 发表了文章 • 0 个评论 • 114 次浏览 • 2021-10-13 03:28
1.HtmlUnit是一个用java编写的无界面浏览器,建模html文档,通过API调用页面,填写表单,点击链接等,像普通浏览器一样操作。通常用于测试和从网页中获取信息。而且HtmlUnit兼有HttpClient和soup的功能,但是速度比较慢,但是如果取消它解析css和js的功能,速度会有所提升,默认开启。
2. 这里选择HtmlUnit爬取数据的主要目的是为了获取他的js和css。
3.主要代码如下
package com.los;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.DomElement;
import com.gargoylesoftware.htmlunit.html.DomNodeList;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import com.los.util.DownlandPic;
import java.io.IOException;
import java.util.regex.Pattern;
public class HtmlUnitTest {
public static void main(String[] args) throws IOException {
DownlandPic dd = new DownlandPic();
WebClient webClient = new WebClient();//实例化web客户端
//http://www.bdqn.cn/ https://www.baidu.com/?tn=78000241_22_hao_pg
String url = "http://www.bdqn.cn/";
HtmlPage page = webClient.getPage(url);
webClient.waitForBackgroundJavaScript(10000); //等侍js脚本执行完成
System.out.println(page.asXml());
DomNodeList img = page.getElementsByTagName("script");
for (int i=0;i 0) {
output.write(buffer, 0, length);
}
fileOutputStream.write(output.toByteArray());
dataInputStream.close();
fileOutputStream.close();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public static int getCharacterPosition3(String string){
//这里是获取"\""符号的位置
Matcher slashMatcher = Pattern.compile("\"").matcher(string);
int mIdx = 0;
while(slashMatcher.find()) {
mIdx++;
//当"/"符号第三次出现的位置
if(mIdx == 2){
break;
}
}
return slashMatcher.start();
}
public static int getCharacterPosition4(String string){
//这里是获取"\""符号的位置
Matcher slashMatcher = Pattern.compile("\"").matcher(string);
int mIdx = 0;
while(slashMatcher.find()) {
mIdx++;
//当"/"符号第三次出现的位置
if(mIdx == 3){
break;
}
}
return slashMatcher.start();
}
public static void main(String[] args) {
String content = "<img class=\"lazy\" data-original=\"/img/newImg/news_img2.jpg\" src=\"/img/newImg/news2.jpg\" style=\"display: block;\"/>";
System.out.println(getCharacterPosition3(content));
System.out.println(getCharacterPosition4(content));
String substring = content.substring(getCharacterPosition3(content), getCharacterPosition4(content));
System.out.println(substring);
}
}
3.因为这里的网页中的图片地址是相对路径,所以下载的时候在下载地址中找到了页面的绝对路径并拼接。下载的路径必须与抓取后存储在本地页面的image标签中的地址相对应,否则找不到。
3.匹配时写2和3的原因”是根据这里爬取的数据
4.与其他爬取网页的方式相比,这可能更简单,但更容易展示效果。如有错误,请指教。至于页面,则不会显示,涉及隐私。
5.学习HtmlUnit请参考:地址 查看全部
htmlunit 抓取网页(1.HtmlUnit的学习方法是什么?怎么样?HtmlUnit)
1.HtmlUnit是一个用java编写的无界面浏览器,建模html文档,通过API调用页面,填写表单,点击链接等,像普通浏览器一样操作。通常用于测试和从网页中获取信息。而且HtmlUnit兼有HttpClient和soup的功能,但是速度比较慢,但是如果取消它解析css和js的功能,速度会有所提升,默认开启。
2. 这里选择HtmlUnit爬取数据的主要目的是为了获取他的js和css。
3.主要代码如下
package com.los;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.DomElement;
import com.gargoylesoftware.htmlunit.html.DomNodeList;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import com.los.util.DownlandPic;
import java.io.IOException;
import java.util.regex.Pattern;
public class HtmlUnitTest {
public static void main(String[] args) throws IOException {
DownlandPic dd = new DownlandPic();
WebClient webClient = new WebClient();//实例化web客户端
//http://www.bdqn.cn/ https://www.baidu.com/?tn=78000241_22_hao_pg
String url = "http://www.bdqn.cn/";
HtmlPage page = webClient.getPage(url);
webClient.waitForBackgroundJavaScript(10000); //等侍js脚本执行完成
System.out.println(page.asXml());
DomNodeList img = page.getElementsByTagName("script");
for (int i=0;i 0) {
output.write(buffer, 0, length);
}
fileOutputStream.write(output.toByteArray());
dataInputStream.close();
fileOutputStream.close();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public static int getCharacterPosition3(String string){
//这里是获取"\""符号的位置
Matcher slashMatcher = Pattern.compile("\"").matcher(string);
int mIdx = 0;
while(slashMatcher.find()) {
mIdx++;
//当"/"符号第三次出现的位置
if(mIdx == 2){
break;
}
}
return slashMatcher.start();
}
public static int getCharacterPosition4(String string){
//这里是获取"\""符号的位置
Matcher slashMatcher = Pattern.compile("\"").matcher(string);
int mIdx = 0;
while(slashMatcher.find()) {
mIdx++;
//当"/"符号第三次出现的位置
if(mIdx == 3){
break;
}
}
return slashMatcher.start();
}
public static void main(String[] args) {
String content = "<img class=\"lazy\" data-original=\"/img/newImg/news_img2.jpg\" src=\"/img/newImg/news2.jpg\" style=\"display: block;\"/>";
System.out.println(getCharacterPosition3(content));
System.out.println(getCharacterPosition4(content));
String substring = content.substring(getCharacterPosition3(content), getCharacterPosition4(content));
System.out.println(substring);
}
}
3.因为这里的网页中的图片地址是相对路径,所以下载的时候在下载地址中找到了页面的绝对路径并拼接。下载的路径必须与抓取后存储在本地页面的image标签中的地址相对应,否则找不到。
3.匹配时写2和3的原因”是根据这里爬取的数据

4.与其他爬取网页的方式相比,这可能更简单,但更容易展示效果。如有错误,请指教。至于页面,则不会显示,涉及隐私。
5.学习HtmlUnit请参考:地址
htmlunit 抓取网页(1.HtmlUnit中文文档获取页面中特定的元素tips:1.)
网站优化 • 优采云 发表了文章 • 0 个评论 • 535 次浏览 • 2021-10-09 07:17
1.HtmlUnit 简介
HtmlUnit 是一个 Java 无界面浏览器库。它模拟 HTML 文档并提供相应的 API,让您可以像在“普通”浏览器中一样调用页面、填写表单、单击链接等。它有很好的 JavaScript 支持(仍在改进),甚至可以处理相当复杂的 AJAX 库,根据使用的配置模拟 Chrome、Firefox 或 Internet Explorer。它通常用于测试目的或从 网站 检索信息。
HtmlUnit 不是通用的单元测试框架。它是一种模拟浏览器以进行测试的方法,旨在用于另一个测试框架(例如 JUnit 或 TestNG)。有关介绍,请参阅文档“HtmlUnit 入门”。HtmlUnit 用作不同的开源工具,例如 Canoo WebTest、JWebUnit、WebDriver、JSFUnit、WETATOR、Celerity、Spring MVC Test HtmlUnit 作为底层“浏览器”。
HtmlUnit 最初由 Gargoyle Software 的 Mike Bowler 编写,并在 Apache 2 许可下发布。从那以后,它收到了许多其他开发者的贡献,今天也将得到他们的帮助。
几年前,在做购物网站的数据采集工作时,我偶然遇到了HtmlUnit。我记得我如何无法捕获页面上的价格数据,并且 httpfox 无法跟踪价格数据的 URL。就在我不知所措的时候,HtmlUnit出现了,帮我解决了问题。所以今天我想说声谢谢,并向大家推荐HtmlUnit。
2.htmlUnit中文文档
3.1 获取页面的 TITLE、XML 代码和文本
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.html.HtmlDivision;
import com.gargoylesoftware.htmlunit.html.HtmlAnchor;
import com.gargoylesoftware.htmlunit.*;
import com.gargoylesoftware.htmlunit.WebClientOptions;
import com.gargoylesoftware.htmlunit.html.HtmlInput;
import com.gargoylesoftware.htmlunit.html.HtmlBody;
import java.util.List;
public class helloHtmlUnit{
public static void main(String[] args) throws Exception{
String str;
//创建一个webclient
WebClient webClient = new WebClient();
//htmlunit 对css和javascript的支持不好,所以请关闭之
webClient.getOptions().setJavaScriptEnabled(false);
webClient.getOptions().setCssEnabled(false);
//获取页面
HtmlPage page = webClient.getPage("http://www.baidu.com/");
//获取页面的TITLE
str = page.getTitleText();
System.out.println(str);
//获取页面的XML代码
str = page.asXml();
System.out.println(str);
//获取页面的文本
str = page.asText();
System.out.println(str);
//关闭webclient
webClient.closeAllWindows();
}
}
3.2 使用不同版本的浏览器打开
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.html.HtmlDivision;
import com.gargoylesoftware.htmlunit.html.HtmlAnchor;
import com.gargoylesoftware.htmlunit.*;
import com.gargoylesoftware.htmlunit.WebClientOptions;
import com.gargoylesoftware.htmlunit.html.HtmlInput;
import com.gargoylesoftware.htmlunit.html.HtmlBody;
import java.util.List;
public class helloHtmlUnit{
public static void main(String[] args) throws Exception{
String str;
//使用FireFox读取网页
WebClient webClient = new WebClient(BrowserVersion.FIREFOX_24);
//htmlunit 对css和javascript的支持不好,所以请关闭之
webClient.getOptions().setJavaScriptEnabled(false);
webClient.getOptions().setCssEnabled(false);
HtmlPage page = webClient.getPage("http://www.baidu.com/");
str = page.getTitleText();
System.out.println(str);
//关闭webclient
webClient.closeAllWindows();
}
}
3.3 在页面上查找特定元素
public class helloHtmlUnit{
public static void main(String[] args) throws Exception{
//创建webclient
WebClient webClient = new WebClient(BrowserVersion.CHROME);
//htmlunit 对css和javascript的支持不好,所以请关闭之
webClient.getOptions().setJavaScriptEnabled(false);
webClient.getOptions().setCssEnabled(false);
HtmlPage page = (HtmlPage)webClient.getPage("http://www.baidu.com/");
//通过id获得"百度一下"按钮
HtmlInput btn = (HtmlInput)page.getHtmlElementById("su");
System.out.println(btn.getDefaultValue());
//关闭webclient
webClient.closeAllWindows();
}
}
提示:某些元素中没有id和name或其他节点。您可以通过查找其子节点和父节点之间的规则来获取元素。具体方法请参考:
核心代码是:
final HtmlPage nextPage = ((DomElement)(htmlpage.getElementByName("key").getParentNode().getParentNode())).getLastElementChild().click();
3.4 元素搜索
public class helloHtmlUnit{
public static void main(String[] args) throws Exception{
//创建webclient
WebClient webClient = new WebClient(BrowserVersion.CHROME);
//htmlunit 对css和javascript的支持不好,所以请关闭之
webClient.getOptions().setJavaScriptEnabled(false);
webClient.getOptions().setCssEnabled(false);
HtmlPage page = (HtmlPage)webClient.getPage("http://www.baidu.com/");
//查找所有div
List hbList = page.getByXPath("//div");
HtmlDivision hb = (HtmlDivision)hbList.get(0);
System.out.println(hb.toString());
//查找并获取特定input
List inputList = page.getByXPath("//input[@id=\'su\']");
HtmlInput input = (HtmlInput)inputList.get(0);
System.out.println(input.toString());
//关闭webclient
webClient.closeAllWindows();
}
}
3.5 提交搜索
public class helloHtmlUnit{
public static void main(String[] args) throws Exception{
//创建webclient
WebClient webClient = new WebClient(BrowserVersion.CHROME);
//htmlunit 对css和javascript的支持不好,所以请关闭之
webClient.getOptions().setJavaScriptEnabled(false);
webClient.getOptions().setCssEnabled(false);
HtmlPage page = (HtmlPage)webClient.getPage("http://www.baidu.com/");
//获取搜索输入框并提交搜索内容
HtmlInput input = (HtmlInput)page.getHtmlElementById("kw");
System.out.println(input.toString());
input.setValueAttribute("ymd");
System.out.println(input.toString());
//获取搜索按钮并点击
HtmlInput btn = (HtmlInput)page.getHtmlElementById("su");
HtmlPage page2 = btn.click();
//输出新页面的文本
System.out.println(page2.asText());
}
}
3.htmlUnit方法介绍
一、环境介绍
因为是在自己的spring boot项目中引入的,所以只是在pom文件中添加了依赖。
net.sourceforge.htmlunit
htmlunit
2.41.0
如果你只是爬一个网站 js不多,建议改下下面的依赖
net.sourceforge.htmlunit
htmlunit
2.23
后面我会讲到两者的区别。当然,如果你不是使用maven项目(没有pom),可以到官网下载源码库
二、使用
HtmlUnit使用起来非常简单,使用的时候可以去官网手册查一下语法。其实说明书只是介绍的介绍,下面听我说就够了;
1、创建客户端并配置客户端
final String url ="https:****";//大家这可以填自己爬虫的地址
WebClient webClient = new WebClient(BrowserVersion.FIREFOX_68);//创建火狐浏览器 2.23版本是FIREFOX_45 new不写参数是默认浏览器
webClient.getOptions().setCssEnabled(false);//(屏蔽)css 因为css并不影响我们抓取数据 反而影响网页渲染效率
webClient.getOptions().setThrowExceptionOnScriptError(false);//(屏蔽)异常
webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);//(屏蔽)日志
webClient.getOptions().setJavaScriptEnabled(true);//加载js脚本
webClient.getOptions().setTimeout(50000);//设置超时时间
webClient.setAjaxController(new NicelyResynchronizingAjaxController());//设置ajax
HtmlPage htmlPage = webClient.getPage(url);//将客户端获取的树形结构转化为HtmlPage
Thread.sleep(10000);//主线程休眠10秒 让客户端有时间执行js代码 也可以写成webClient.waitForBackgroundJavaScript(1000)
这里是一个等待js执行的情况,2.41.0很适合很多js情况,但是2.3总是有问题,无法刷新网页,2.4< @1.0 打印的也很详细,执行的过程也比较慢,可能会比较慢产生详细的作品
远程地址页面在此处获取。我们现在需要做的是解析dom节点并填写数据来模拟点击等事件。如果要打印 htmlPage.asText() 输出 htmlPage 节点的文本 htmlPage.asXml() 输出 htmlPage 节点的 xml 代码
2、 获取节点
建议在这个链接准备一些前端知识
HtmlUnit给出了两种获取节点的方式
XPath 查询:
更详细的xpath解释:
final HtmlPage page = webClient.getPage("http://htmlunit.sourceforge.net");
//get list of all divs
final List divs = htmlPage .getByXPath("//div");
//get div which has a \'name\' attribute of \'John\'
final HtmlDivision div = (HtmlDivision) htmlPage .getByXPath("//div[@name=\'John\']").get(0);
css 选择器:(我更喜欢它)
final DomNodeList divs = htmlPage .querySelectorAll("div");
for (DomNode div : divs) {
....
}
//get div which has the id \'breadcrumbs\'
final DomNode div = htmlPage .querySelector("div#breadcrumbs");
css 提供了一个集合查询 querySelectorAll 和一个单一查询 querySelector。如果你没有基础,我给你举个例子:
htmlPage .querySelectorAll("div") 返回 htmlPage 下的一组 div 标签
htmlPage .querySelector("div:nth-child(1)") 返回htmlPage下div的第一个div
htmlPage .querySelector(".submit") 返回htmlPage下的第一个class=submit标签
htmlPage .querySelector("#submit") 返回 htmlPage 下 id=submit 的第一个标签
htmlPage .querySelector("div.submit") 返回类为submit的htmlPage下的第一个div标签
htmlPage .querySelector("div[id='submit']") 返回htmlPage下第一个id为submit的div标签
上面的枚举方法相信已经足够了,如果还不够,可以参考css选择器
下面列出常见的html标签与HtmlUnit类的对应关系
div -> HtmlDivision
div集合 -> DomNodeList
fieldSet -> HtmlFieldSet
form -> HtmlForm
button -> HtmlButton
a -> HtmlAnchor
-> HtmlXxxInput
( -> HtmlTextInput)
table -> HtmlTable
tr -> HtmlTableRow
td -> TableDataCell
setAttribute()方法有节点的属性样式,setNodeValue()设置节点的值。你的英语一下子提高了吗?几乎所有的标签都能找到对应的类别。来看看我的实战:这是一个在线填写温度的excel文档。如果访问更改地址,他会在登录页面提示登录按钮。登录按钮,我们现在模拟打开自动登录框:
//这段代码是为了让网页的的某个按钮加载出来之后再执行下面的代码
while (htmlPage.querySelector("#header-login-btn")==null) {
synchronized (htmlPage) {
htmlPage.wait(1000);
}
}
HtmlButton login = htmlPage.querySelector("#header-login-btn");//获取到登陆按钮
if (login!=null){//如果网页上没这个按钮你还要去获取他只会得到一个空对象,所以我们用空的方式可以判断网页上是否有这个按钮
System.out.println("-----未登录测试-----");
htmlPage=login.click();//模拟按钮点击后要将网页返回回来方便动态更新数据
System.out.println(htmlPage.asText());
HtmlAnchor switcher_plogin = htmlPage.querySelector("a[id=\'switcher_plogin\']");
if (switcher_plogin!=null) {//帐号密码登录
System.out.println("-----点击了帐号密码登陆-----");
htmlPage = switcher_plogin.click();
System.out.println(htmlPage.asText());
}
}
System.out.println(htmlPage.asText());
webClient.close();
爬虫最重要的一步就是我们首先调试网页,有哪些按钮,点击哪些,设置哪些值。毕竟,我们必须用代码来安排代码。
**扩展:** 如果你想从网页中获取数据或者下载文件,HtmlUnit 解析是不够的。推荐使用 Jsoup 库,可以和 HtmlUnit 一起使用。使用起来比较方便,这里就不一一列举了。
三、实现一个小demo
注意:htmlunit引用的jar包不完整会导致奇怪的错误
使用maven方法更方便
参考: 查看全部
htmlunit 抓取网页(1.HtmlUnit中文文档获取页面中特定的元素tips:1.)
1.HtmlUnit 简介
HtmlUnit 是一个 Java 无界面浏览器库。它模拟 HTML 文档并提供相应的 API,让您可以像在“普通”浏览器中一样调用页面、填写表单、单击链接等。它有很好的 JavaScript 支持(仍在改进),甚至可以处理相当复杂的 AJAX 库,根据使用的配置模拟 Chrome、Firefox 或 Internet Explorer。它通常用于测试目的或从 网站 检索信息。
HtmlUnit 不是通用的单元测试框架。它是一种模拟浏览器以进行测试的方法,旨在用于另一个测试框架(例如 JUnit 或 TestNG)。有关介绍,请参阅文档“HtmlUnit 入门”。HtmlUnit 用作不同的开源工具,例如 Canoo WebTest、JWebUnit、WebDriver、JSFUnit、WETATOR、Celerity、Spring MVC Test HtmlUnit 作为底层“浏览器”。
HtmlUnit 最初由 Gargoyle Software 的 Mike Bowler 编写,并在 Apache 2 许可下发布。从那以后,它收到了许多其他开发者的贡献,今天也将得到他们的帮助。
几年前,在做购物网站的数据采集工作时,我偶然遇到了HtmlUnit。我记得我如何无法捕获页面上的价格数据,并且 httpfox 无法跟踪价格数据的 URL。就在我不知所措的时候,HtmlUnit出现了,帮我解决了问题。所以今天我想说声谢谢,并向大家推荐HtmlUnit。
2.htmlUnit中文文档
3.1 获取页面的 TITLE、XML 代码和文本
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.html.HtmlDivision;
import com.gargoylesoftware.htmlunit.html.HtmlAnchor;
import com.gargoylesoftware.htmlunit.*;
import com.gargoylesoftware.htmlunit.WebClientOptions;
import com.gargoylesoftware.htmlunit.html.HtmlInput;
import com.gargoylesoftware.htmlunit.html.HtmlBody;
import java.util.List;
public class helloHtmlUnit{
public static void main(String[] args) throws Exception{
String str;
//创建一个webclient
WebClient webClient = new WebClient();
//htmlunit 对css和javascript的支持不好,所以请关闭之
webClient.getOptions().setJavaScriptEnabled(false);
webClient.getOptions().setCssEnabled(false);
//获取页面
HtmlPage page = webClient.getPage("http://www.baidu.com/");
//获取页面的TITLE
str = page.getTitleText();
System.out.println(str);
//获取页面的XML代码
str = page.asXml();
System.out.println(str);
//获取页面的文本
str = page.asText();
System.out.println(str);
//关闭webclient
webClient.closeAllWindows();
}
}
3.2 使用不同版本的浏览器打开
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.html.HtmlDivision;
import com.gargoylesoftware.htmlunit.html.HtmlAnchor;
import com.gargoylesoftware.htmlunit.*;
import com.gargoylesoftware.htmlunit.WebClientOptions;
import com.gargoylesoftware.htmlunit.html.HtmlInput;
import com.gargoylesoftware.htmlunit.html.HtmlBody;
import java.util.List;
public class helloHtmlUnit{
public static void main(String[] args) throws Exception{
String str;
//使用FireFox读取网页
WebClient webClient = new WebClient(BrowserVersion.FIREFOX_24);
//htmlunit 对css和javascript的支持不好,所以请关闭之
webClient.getOptions().setJavaScriptEnabled(false);
webClient.getOptions().setCssEnabled(false);
HtmlPage page = webClient.getPage("http://www.baidu.com/");
str = page.getTitleText();
System.out.println(str);
//关闭webclient
webClient.closeAllWindows();
}
}
3.3 在页面上查找特定元素
public class helloHtmlUnit{
public static void main(String[] args) throws Exception{
//创建webclient
WebClient webClient = new WebClient(BrowserVersion.CHROME);
//htmlunit 对css和javascript的支持不好,所以请关闭之
webClient.getOptions().setJavaScriptEnabled(false);
webClient.getOptions().setCssEnabled(false);
HtmlPage page = (HtmlPage)webClient.getPage("http://www.baidu.com/");
//通过id获得"百度一下"按钮
HtmlInput btn = (HtmlInput)page.getHtmlElementById("su");
System.out.println(btn.getDefaultValue());
//关闭webclient
webClient.closeAllWindows();
}
}
提示:某些元素中没有id和name或其他节点。您可以通过查找其子节点和父节点之间的规则来获取元素。具体方法请参考:
核心代码是:
final HtmlPage nextPage = ((DomElement)(htmlpage.getElementByName("key").getParentNode().getParentNode())).getLastElementChild().click();
3.4 元素搜索
public class helloHtmlUnit{
public static void main(String[] args) throws Exception{
//创建webclient
WebClient webClient = new WebClient(BrowserVersion.CHROME);
//htmlunit 对css和javascript的支持不好,所以请关闭之
webClient.getOptions().setJavaScriptEnabled(false);
webClient.getOptions().setCssEnabled(false);
HtmlPage page = (HtmlPage)webClient.getPage("http://www.baidu.com/");
//查找所有div
List hbList = page.getByXPath("//div");
HtmlDivision hb = (HtmlDivision)hbList.get(0);
System.out.println(hb.toString());
//查找并获取特定input
List inputList = page.getByXPath("//input[@id=\'su\']");
HtmlInput input = (HtmlInput)inputList.get(0);
System.out.println(input.toString());
//关闭webclient
webClient.closeAllWindows();
}
}
3.5 提交搜索
public class helloHtmlUnit{
public static void main(String[] args) throws Exception{
//创建webclient
WebClient webClient = new WebClient(BrowserVersion.CHROME);
//htmlunit 对css和javascript的支持不好,所以请关闭之
webClient.getOptions().setJavaScriptEnabled(false);
webClient.getOptions().setCssEnabled(false);
HtmlPage page = (HtmlPage)webClient.getPage("http://www.baidu.com/");
//获取搜索输入框并提交搜索内容
HtmlInput input = (HtmlInput)page.getHtmlElementById("kw");
System.out.println(input.toString());
input.setValueAttribute("ymd");
System.out.println(input.toString());
//获取搜索按钮并点击
HtmlInput btn = (HtmlInput)page.getHtmlElementById("su");
HtmlPage page2 = btn.click();
//输出新页面的文本
System.out.println(page2.asText());
}
}
3.htmlUnit方法介绍
一、环境介绍
因为是在自己的spring boot项目中引入的,所以只是在pom文件中添加了依赖。
net.sourceforge.htmlunit
htmlunit
2.41.0
如果你只是爬一个网站 js不多,建议改下下面的依赖
net.sourceforge.htmlunit
htmlunit
2.23
后面我会讲到两者的区别。当然,如果你不是使用maven项目(没有pom),可以到官网下载源码库
二、使用
HtmlUnit使用起来非常简单,使用的时候可以去官网手册查一下语法。其实说明书只是介绍的介绍,下面听我说就够了;
1、创建客户端并配置客户端
final String url ="https:****";//大家这可以填自己爬虫的地址
WebClient webClient = new WebClient(BrowserVersion.FIREFOX_68);//创建火狐浏览器 2.23版本是FIREFOX_45 new不写参数是默认浏览器
webClient.getOptions().setCssEnabled(false);//(屏蔽)css 因为css并不影响我们抓取数据 反而影响网页渲染效率
webClient.getOptions().setThrowExceptionOnScriptError(false);//(屏蔽)异常
webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);//(屏蔽)日志
webClient.getOptions().setJavaScriptEnabled(true);//加载js脚本
webClient.getOptions().setTimeout(50000);//设置超时时间
webClient.setAjaxController(new NicelyResynchronizingAjaxController());//设置ajax
HtmlPage htmlPage = webClient.getPage(url);//将客户端获取的树形结构转化为HtmlPage
Thread.sleep(10000);//主线程休眠10秒 让客户端有时间执行js代码 也可以写成webClient.waitForBackgroundJavaScript(1000)
这里是一个等待js执行的情况,2.41.0很适合很多js情况,但是2.3总是有问题,无法刷新网页,2.4< @1.0 打印的也很详细,执行的过程也比较慢,可能会比较慢产生详细的作品
远程地址页面在此处获取。我们现在需要做的是解析dom节点并填写数据来模拟点击等事件。如果要打印 htmlPage.asText() 输出 htmlPage 节点的文本 htmlPage.asXml() 输出 htmlPage 节点的 xml 代码
2、 获取节点
建议在这个链接准备一些前端知识
HtmlUnit给出了两种获取节点的方式
XPath 查询:
更详细的xpath解释:
final HtmlPage page = webClient.getPage("http://htmlunit.sourceforge.net");
//get list of all divs
final List divs = htmlPage .getByXPath("//div");
//get div which has a \'name\' attribute of \'John\'
final HtmlDivision div = (HtmlDivision) htmlPage .getByXPath("//div[@name=\'John\']").get(0);
css 选择器:(我更喜欢它)
final DomNodeList divs = htmlPage .querySelectorAll("div");
for (DomNode div : divs) {
....
}
//get div which has the id \'breadcrumbs\'
final DomNode div = htmlPage .querySelector("div#breadcrumbs");
css 提供了一个集合查询 querySelectorAll 和一个单一查询 querySelector。如果你没有基础,我给你举个例子:
htmlPage .querySelectorAll("div") 返回 htmlPage 下的一组 div 标签
htmlPage .querySelector("div:nth-child(1)") 返回htmlPage下div的第一个div
htmlPage .querySelector(".submit") 返回htmlPage下的第一个class=submit标签
htmlPage .querySelector("#submit") 返回 htmlPage 下 id=submit 的第一个标签
htmlPage .querySelector("div.submit") 返回类为submit的htmlPage下的第一个div标签
htmlPage .querySelector("div[id='submit']") 返回htmlPage下第一个id为submit的div标签
上面的枚举方法相信已经足够了,如果还不够,可以参考css选择器
下面列出常见的html标签与HtmlUnit类的对应关系
div -> HtmlDivision
div集合 -> DomNodeList
fieldSet -> HtmlFieldSet
form -> HtmlForm
button -> HtmlButton
a -> HtmlAnchor
-> HtmlXxxInput
( -> HtmlTextInput)
table -> HtmlTable
tr -> HtmlTableRow
td -> TableDataCell
setAttribute()方法有节点的属性样式,setNodeValue()设置节点的值。你的英语一下子提高了吗?几乎所有的标签都能找到对应的类别。来看看我的实战:这是一个在线填写温度的excel文档。如果访问更改地址,他会在登录页面提示登录按钮。登录按钮,我们现在模拟打开自动登录框:
//这段代码是为了让网页的的某个按钮加载出来之后再执行下面的代码
while (htmlPage.querySelector("#header-login-btn")==null) {
synchronized (htmlPage) {
htmlPage.wait(1000);
}
}
HtmlButton login = htmlPage.querySelector("#header-login-btn");//获取到登陆按钮
if (login!=null){//如果网页上没这个按钮你还要去获取他只会得到一个空对象,所以我们用空的方式可以判断网页上是否有这个按钮
System.out.println("-----未登录测试-----");
htmlPage=login.click();//模拟按钮点击后要将网页返回回来方便动态更新数据
System.out.println(htmlPage.asText());
HtmlAnchor switcher_plogin = htmlPage.querySelector("a[id=\'switcher_plogin\']");
if (switcher_plogin!=null) {//帐号密码登录
System.out.println("-----点击了帐号密码登陆-----");
htmlPage = switcher_plogin.click();
System.out.println(htmlPage.asText());
}
}
System.out.println(htmlPage.asText());
webClient.close();
爬虫最重要的一步就是我们首先调试网页,有哪些按钮,点击哪些,设置哪些值。毕竟,我们必须用代码来安排代码。
**扩展:** 如果你想从网页中获取数据或者下载文件,HtmlUnit 解析是不够的。推荐使用 Jsoup 库,可以和 HtmlUnit 一起使用。使用起来比较方便,这里就不一一列举了。
三、实现一个小demo
注意:htmlunit引用的jar包不完整会导致奇怪的错误
使用maven方法更方便
参考:
htmlunit 抓取网页( 2018-09-27栏目我正在使用动态网页中的HtmlUnit数据,)
网站优化 • 优采云 发表了文章 • 0 个评论 • 59 次浏览 • 2021-10-05 14:21
2018-09-27栏目我正在使用动态网页中的HtmlUnit数据,)
javascript-使用htmlunit获取动态网页
时间2018-09-27
柱子
我在动态网页中使用 HtmlUnit 来抓取数据。动态网页使用无限滚动来动态获取数据,就像Facebook的新闻提要一样。我用下面这句话来模拟向下滚动事件:
webclient.setJavaScriptEnabled(true);
webclient.setAjaxController(new NicelyResynchronizingAjaxController());
ScriptResult sr=myHtmlPage.executeJavaScript("window.scrollBy(0,600)");
webclient.waitForBackgroundJavaScript(10000);
myHtmlPage=(HtmlPage)sr.getNewPage();
但是好像myHtmlPage还是和上一个一样,就是myHtmlPage没有附加新的数据,所以只能抓取页面的前几条数据。感谢您的帮助!
我正在寻找同样的东西。我只能发现它不是滚动事件(90% 确定)。有一个 JS 负责加载页面,可能对你有帮助。
相关文章 查看全部
htmlunit 抓取网页(
2018-09-27栏目我正在使用动态网页中的HtmlUnit数据,)
javascript-使用htmlunit获取动态网页
时间2018-09-27
柱子
我在动态网页中使用 HtmlUnit 来抓取数据。动态网页使用无限滚动来动态获取数据,就像Facebook的新闻提要一样。我用下面这句话来模拟向下滚动事件:
webclient.setJavaScriptEnabled(true);
webclient.setAjaxController(new NicelyResynchronizingAjaxController());
ScriptResult sr=myHtmlPage.executeJavaScript("window.scrollBy(0,600)");
webclient.waitForBackgroundJavaScript(10000);
myHtmlPage=(HtmlPage)sr.getNewPage();
但是好像myHtmlPage还是和上一个一样,就是myHtmlPage没有附加新的数据,所以只能抓取页面的前几条数据。感谢您的帮助!
我正在寻找同样的东西。我只能发现它不是滚动事件(90% 确定)。有一个 JS 负责加载页面,可能对你有帮助。
相关文章
htmlunit 抓取网页(抓一个今日头条的首页内容解决方案-苏州安嘉)
网站优化 • 优采云 发表了文章 • 0 个评论 • 94 次浏览 • 2021-10-02 15:12
不知道大家在使用jsoup的过程中是否遇到过爬取内容的情况,发现有些网页的内容是通过JavaScript异步加载的,导致我们的爬虫空手返回(只抓到了一个网页) 。
遇到这个问题首先想到的有两种解决方案:
在网页的异步加载完成后,使用类似于Python中的延迟加载的方法对异步加载的网页进行爬取。使用特殊的方法让被爬取的网页的外框模拟里面的JavaScript代码的执行,最终到达完整的网页。
在搜索引擎的帮助下,我决定使用选项2来解决问题。选项 1 没有搜索更好的第三方库。在java中使用Option 1解决这个问题的朋友希望能和下一个一起讨论,太好了。
案例很简单,抓取今日头条的首页内容。你可以看看今日头条的主页。里面的内容是异步加载的。
添加jsoup和htmlunit的依赖
org.jsoup
jsoup
1.10.2
net.sourceforge.htmlunit
htmlunit
2.25
12345678910
首先我们单独使用jsoup解析今日头条首页
String url = "https://www.toutiao.com/";
Connection connect = Jsoup.connect(url);
Document document = connect.get();
System.out.println(document);
1234
↑ 这里只能获取网页的frame内容,不能获取首页的新闻内容
接下来我们用htmlunit试试
//构造一个webClient 模拟Chrome 浏览器
WebClient webClient = new WebClient(BrowserVersion.CHROME);
//屏蔽日志信息
LogFactory.getFactory().setAttribute("org.apache.commons.logging.Log",
"org.apache.commons.logging.impl.NoOpLog");
java.util.logging.Logger.getLogger("com.gargoylesoftware").setLevel(Level.OFF);
//支持JavaScript
webClient.getOptions().setJavaScriptEnabled(true);
webClient.getOptions().setCssEnabled(false);
webClient.getOptions().setActiveXNative(false);
webClient.getOptions().setCssEnabled(false);
webClient.getOptions().setThrowExceptionOnScriptError(false);
webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
webClient.getOptions().setTimeout(5000);
HtmlPage rootPage = webClient.getPage(url);
//设置一个运行JavaScript的时间
webClient.waitForBackgroundJavaScript(5000);
String html = rootPage.asXml();
Document document = Jsoup.parse(html);
12345678910111213141516171819
<a target="_blank" style="box-sizing: border-box; color: rgb(12, 137, 207);"></a>
这样我们就可以在运行后得到一个收录JavaScript的完整源码网页 查看全部
htmlunit 抓取网页(抓一个今日头条的首页内容解决方案-苏州安嘉)
不知道大家在使用jsoup的过程中是否遇到过爬取内容的情况,发现有些网页的内容是通过JavaScript异步加载的,导致我们的爬虫空手返回(只抓到了一个网页) 。
遇到这个问题首先想到的有两种解决方案:
在网页的异步加载完成后,使用类似于Python中的延迟加载的方法对异步加载的网页进行爬取。使用特殊的方法让被爬取的网页的外框模拟里面的JavaScript代码的执行,最终到达完整的网页。
在搜索引擎的帮助下,我决定使用选项2来解决问题。选项 1 没有搜索更好的第三方库。在java中使用Option 1解决这个问题的朋友希望能和下一个一起讨论,太好了。
案例很简单,抓取今日头条的首页内容。你可以看看今日头条的主页。里面的内容是异步加载的。
添加jsoup和htmlunit的依赖
org.jsoup
jsoup
1.10.2
net.sourceforge.htmlunit
htmlunit
2.25
12345678910
首先我们单独使用jsoup解析今日头条首页
String url = "https://www.toutiao.com/";
Connection connect = Jsoup.connect(url);
Document document = connect.get();
System.out.println(document);
1234
↑ 这里只能获取网页的frame内容,不能获取首页的新闻内容
接下来我们用htmlunit试试
//构造一个webClient 模拟Chrome 浏览器
WebClient webClient = new WebClient(BrowserVersion.CHROME);
//屏蔽日志信息
LogFactory.getFactory().setAttribute("org.apache.commons.logging.Log",
"org.apache.commons.logging.impl.NoOpLog");
java.util.logging.Logger.getLogger("com.gargoylesoftware").setLevel(Level.OFF);
//支持JavaScript
webClient.getOptions().setJavaScriptEnabled(true);
webClient.getOptions().setCssEnabled(false);
webClient.getOptions().setActiveXNative(false);
webClient.getOptions().setCssEnabled(false);
webClient.getOptions().setThrowExceptionOnScriptError(false);
webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
webClient.getOptions().setTimeout(5000);
HtmlPage rootPage = webClient.getPage(url);
//设置一个运行JavaScript的时间
webClient.waitForBackgroundJavaScript(5000);
String html = rootPage.asXml();
Document document = Jsoup.parse(html);
12345678910111213141516171819
<a target="_blank" style="box-sizing: border-box; color: rgb(12, 137, 207);">

这样我们就可以在运行后得到一个收录JavaScript的完整源码网页
htmlunit 抓取网页(网页获取和解析速度和性能的应用场景详解! )
网站优化 • 优采云 发表了文章 • 0 个评论 • 193 次浏览 • 2021-09-27 10:15
)
(4)支持代理服务器
(5) 支持自动cookies管理等。
Java爬虫开发中应用最广泛的网页获取技术之一。它具有一流的速度和性能。它在功能支持方面相对较低。不支持JS脚本执行、CSS解析、渲染等准浏览器功能。推荐给需要快速获取网页的用户。无需解析脚本和 CSS 场景。
示例代码如下:
package cn.ysh.studio.crawler.httpclient;import org.apache.http.client.HttpClient;import org.apache.http.client.ResponseHandler;import org.apache.http.client.methods.HttpGet;import org.apache.http.impl.client.BasicResponseHandler;import org.apache.http.impl.client.DefaultHttpClient;/**
* 基于HtmlClient抓取网页内容
*
* @author www.yshjava.cn
*/publicclassHttpClientTest{publicstaticvoid main(String[] args)throwsException{//目标页面String url ="http://www.yshjava.cn";//创建一个默认的HttpClientHttpClient httpclient =newDefaultHttpClient();try{//以get方式请求网页http://www.yshjava.cnHttpGet httpget =newHttpGet(url);//打印请求地址System.out.println("executing request "+ httpget.getURI());//创建响应处理器处理服务器响应内容ResponseHandlerresponseHandler=newBasicResponseHandler();//执行请求并获取结果String responseBody = httpclient.execute(httpget, responseHandler);System.out.println("----------------------------------------");System.out.println(responseBody);System.out.println("----------------------------------------");}finally{//关闭连接管理器
httpclient.getConnectionManager().shutdown();}}}
汤
jsoup 是一个 Java HTML 解析器,可以直接解析 URL 地址和 HTML 文本内容。它提供了一个非常省力的API,可以通过DOM、CSS和类似jQuery的操作方法来检索和操作数据。
网页获取和分析速度非常快,推荐使用。
主要功能如下:
1. 从 URL、文件或字符串解析 HTML;
2. 使用 DOM 或 CSS 选择器来查找和检索数据;
3. 可操作的 HTML 元素、属性和文本;
示例代码如下:
package cn.ysh.studio.crawler.jsoup;import java.io.IOException;import org.jsoup.Jsoup;/**
* 基于Jsoup抓取网页内容
* @author www.yshjava.cn
*/publicclassJsoupTest{publicstaticvoid main(String[] args)throwsIOException{//目标页面String url ="http://www.yshjava.cn";//使用Jsoup连接目标页面,并执行请求,获取服务器响应内容String html =Jsoup.connect(url).execute().body();//打印页面内容System.out.println(html);}}
单位
htmlunit 是一个开源的java 页面分析工具。阅读完页面后,您可以有效地使用 htmlunit 来分析页面上的内容。该项目可以模拟浏览器操作,被称为java浏览器的开源实现。这个没有界面的浏览器也非常快。使用 Rhinojs 引擎。模拟js操作。
网页获取和解析速度更快,性能更好。推荐用于需要解析网页脚本的应用场景。
示例代码如下:
package cn.ysh.studio.crawler.htmlunit;import com.gargoylesoftware.htmlunit.BrowserVersion;import com.gargoylesoftware.htmlunit.Page;import com.gargoylesoftware.htmlunit.WebClient;/**
* 基于HtmlUnit抓取网页内容
*
* @author www.yshjava.cn
*/publicclassHtmlUnitSpider{publicstaticvoid main(String[] s)throwsException{//目标网页String url ="http://www.yshjava.cn";//模拟特定浏览器FIREFOX_3WebClient spider =newWebClient(BrowserVersion.FIREFOX_3);//获取目标网页Page page = spider.getPage(url);//打印网页内容System.out.println(page.getWebResponse().getContentAsString());//关闭所有窗口
spider.closeAllWindows();}}
瓦蒂
Watij(读作 wattage)是一种使用 Java 开发的 Web 应用程序测试工具。鉴于 Watij 的简单性和 Java 语言的强大功能,Watij 可以让您在真实浏览器中完成 Web 应用程序的自动化测试。因为调用了本地浏览器,所以支持CSS渲染和JS执行。
网页抓取速度一般,IE版本过低(6/7)可能导致内存泄漏。
示例代码如下:
package cn.ysh.studio.crawler.ie;import watij.runtime.ie.IE;/**
* 基于Watij抓取网页内容,仅限Windows平台
*
* @author www.yshjava.cn
*/publicclassWatijTest{publicstaticvoid main(String[] s){//目标页面String url ="http://www.yshjava.cn";//实例化IE浏览器对象
IE ie =new IE();try{//启动浏览器
ie.start();//转到目标网页
ie.goTo(url);//等待网页加载就绪
ie.waitUntilReady();//打印页面内容System.out.println(ie.html());}catch(Exception e){
e.printStackTrace();}finally{try{//关闭IE浏览器
ie.close();}catch(Exception e){}}}}
硒
Selenium 也是 Web 应用程序测试的工具。Selenium 测试直接在浏览器中运行,就像真正的用户在操作一样。支持的浏览器包括 IE、Mozilla Firefox、Mozilla Suite 等。该工具的主要功能包括: 测试浏览器兼容性——测试您的应用程序是否可以在不同浏览器和操作系统上正常运行。测试系统功能——创建回归测试以验证软件功能和用户需求。支持自动录制动作和自动生成。测试Net、Java、Perl等不同语言的脚本。Selenium是ThoughtWorks专门为web应用编写的验收测试工具。
网页抓取速度较慢,对于爬虫来说不是一个好的选择。
示例代码如下:
package cn.ysh.studio.crawler.selenium;import org.openqa.selenium.htmlunit.HtmlUnitDriver;/**
* 基于HtmlDriver抓取网页内容
*
* @author www.yshjava.cn
*/publicclassHtmlDriverTest{publicstaticvoid main(String[] s){//目标网页String url ="http://www.yshjava.cn";HtmlUnitDriver driver =newHtmlUnitDriver();try{//禁用JS脚本功能
driver.setJavascriptEnabled(false);//打开目标网页
driver.get(url);//获取当前网页源码String html = driver.getPageSource();//打印网页源码System.out.println(html);}catch(Exception e){//打印堆栈信息
e.printStackTrace();}finally{try{//关闭并退出
driver.close();
driver.quit();}catch(Exception e){}}}}
网络规范
具有支持脚本执行和 CSS 渲染的接口的开源 Java 浏览器。速度是平均的。
示例代码如下:
package cn.ysh.studio.crawler.webspec;import org.watij.webspec.dsl.WebSpec;/**
* 基于WebSpec抓取网页内容
*
* @author www.yshjava.cn
*/publicclassWebspecTest{publicstaticvoid main(String[] s){//目标网页String url ="http://www.yshjava.cn";//实例化浏览器对象WebSpec spec =newWebSpec().mozilla();//隐藏浏览器窗体
spec.hide();//打开目标页面
spec.open(url);//打印网页源码System.out.println(spec.source());//关闭所有窗口
spec.closeAll();}} 查看全部
htmlunit 抓取网页(网页获取和解析速度和性能的应用场景详解!
)
(4)支持代理服务器
(5) 支持自动cookies管理等。
Java爬虫开发中应用最广泛的网页获取技术之一。它具有一流的速度和性能。它在功能支持方面相对较低。不支持JS脚本执行、CSS解析、渲染等准浏览器功能。推荐给需要快速获取网页的用户。无需解析脚本和 CSS 场景。
示例代码如下:
package cn.ysh.studio.crawler.httpclient;import org.apache.http.client.HttpClient;import org.apache.http.client.ResponseHandler;import org.apache.http.client.methods.HttpGet;import org.apache.http.impl.client.BasicResponseHandler;import org.apache.http.impl.client.DefaultHttpClient;/**
* 基于HtmlClient抓取网页内容
*
* @author www.yshjava.cn
*/publicclassHttpClientTest{publicstaticvoid main(String[] args)throwsException{//目标页面String url ="http://www.yshjava.cn";//创建一个默认的HttpClientHttpClient httpclient =newDefaultHttpClient();try{//以get方式请求网页http://www.yshjava.cnHttpGet httpget =newHttpGet(url);//打印请求地址System.out.println("executing request "+ httpget.getURI());//创建响应处理器处理服务器响应内容ResponseHandlerresponseHandler=newBasicResponseHandler();//执行请求并获取结果String responseBody = httpclient.execute(httpget, responseHandler);System.out.println("----------------------------------------");System.out.println(responseBody);System.out.println("----------------------------------------");}finally{//关闭连接管理器
httpclient.getConnectionManager().shutdown();}}}
汤
jsoup 是一个 Java HTML 解析器,可以直接解析 URL 地址和 HTML 文本内容。它提供了一个非常省力的API,可以通过DOM、CSS和类似jQuery的操作方法来检索和操作数据。
网页获取和分析速度非常快,推荐使用。
主要功能如下:
1. 从 URL、文件或字符串解析 HTML;
2. 使用 DOM 或 CSS 选择器来查找和检索数据;
3. 可操作的 HTML 元素、属性和文本;
示例代码如下:
package cn.ysh.studio.crawler.jsoup;import java.io.IOException;import org.jsoup.Jsoup;/**
* 基于Jsoup抓取网页内容
* @author www.yshjava.cn
*/publicclassJsoupTest{publicstaticvoid main(String[] args)throwsIOException{//目标页面String url ="http://www.yshjava.cn";//使用Jsoup连接目标页面,并执行请求,获取服务器响应内容String html =Jsoup.connect(url).execute().body();//打印页面内容System.out.println(html);}}
单位
htmlunit 是一个开源的java 页面分析工具。阅读完页面后,您可以有效地使用 htmlunit 来分析页面上的内容。该项目可以模拟浏览器操作,被称为java浏览器的开源实现。这个没有界面的浏览器也非常快。使用 Rhinojs 引擎。模拟js操作。
网页获取和解析速度更快,性能更好。推荐用于需要解析网页脚本的应用场景。
示例代码如下:
package cn.ysh.studio.crawler.htmlunit;import com.gargoylesoftware.htmlunit.BrowserVersion;import com.gargoylesoftware.htmlunit.Page;import com.gargoylesoftware.htmlunit.WebClient;/**
* 基于HtmlUnit抓取网页内容
*
* @author www.yshjava.cn
*/publicclassHtmlUnitSpider{publicstaticvoid main(String[] s)throwsException{//目标网页String url ="http://www.yshjava.cn";//模拟特定浏览器FIREFOX_3WebClient spider =newWebClient(BrowserVersion.FIREFOX_3);//获取目标网页Page page = spider.getPage(url);//打印网页内容System.out.println(page.getWebResponse().getContentAsString());//关闭所有窗口
spider.closeAllWindows();}}
瓦蒂
Watij(读作 wattage)是一种使用 Java 开发的 Web 应用程序测试工具。鉴于 Watij 的简单性和 Java 语言的强大功能,Watij 可以让您在真实浏览器中完成 Web 应用程序的自动化测试。因为调用了本地浏览器,所以支持CSS渲染和JS执行。
网页抓取速度一般,IE版本过低(6/7)可能导致内存泄漏。
示例代码如下:
package cn.ysh.studio.crawler.ie;import watij.runtime.ie.IE;/**
* 基于Watij抓取网页内容,仅限Windows平台
*
* @author www.yshjava.cn
*/publicclassWatijTest{publicstaticvoid main(String[] s){//目标页面String url ="http://www.yshjava.cn";//实例化IE浏览器对象
IE ie =new IE();try{//启动浏览器
ie.start();//转到目标网页
ie.goTo(url);//等待网页加载就绪
ie.waitUntilReady();//打印页面内容System.out.println(ie.html());}catch(Exception e){
e.printStackTrace();}finally{try{//关闭IE浏览器
ie.close();}catch(Exception e){}}}}
硒
Selenium 也是 Web 应用程序测试的工具。Selenium 测试直接在浏览器中运行,就像真正的用户在操作一样。支持的浏览器包括 IE、Mozilla Firefox、Mozilla Suite 等。该工具的主要功能包括: 测试浏览器兼容性——测试您的应用程序是否可以在不同浏览器和操作系统上正常运行。测试系统功能——创建回归测试以验证软件功能和用户需求。支持自动录制动作和自动生成。测试Net、Java、Perl等不同语言的脚本。Selenium是ThoughtWorks专门为web应用编写的验收测试工具。
网页抓取速度较慢,对于爬虫来说不是一个好的选择。
示例代码如下:
package cn.ysh.studio.crawler.selenium;import org.openqa.selenium.htmlunit.HtmlUnitDriver;/**
* 基于HtmlDriver抓取网页内容
*
* @author www.yshjava.cn
*/publicclassHtmlDriverTest{publicstaticvoid main(String[] s){//目标网页String url ="http://www.yshjava.cn";HtmlUnitDriver driver =newHtmlUnitDriver();try{//禁用JS脚本功能
driver.setJavascriptEnabled(false);//打开目标网页
driver.get(url);//获取当前网页源码String html = driver.getPageSource();//打印网页源码System.out.println(html);}catch(Exception e){//打印堆栈信息
e.printStackTrace();}finally{try{//关闭并退出
driver.close();
driver.quit();}catch(Exception e){}}}}
网络规范
具有支持脚本执行和 CSS 渲染的接口的开源 Java 浏览器。速度是平均的。
示例代码如下:
package cn.ysh.studio.crawler.webspec;import org.watij.webspec.dsl.WebSpec;/**
* 基于WebSpec抓取网页内容
*
* @author www.yshjava.cn
*/publicclassWebspecTest{publicstaticvoid main(String[] s){//目标网页String url ="http://www.yshjava.cn";//实例化浏览器对象WebSpec spec =newWebSpec().mozilla();//隐藏浏览器窗体
spec.hide();//打开目标页面
spec.open(url);//打印网页源码System.out.println(spec.source());//关闭所有窗口
spec.closeAll();}}
htmlunit 抓取网页(使用本文中推荐的开源工具——HtmlUnit,一款能够模拟浏览器的抓包神器!)
网站优化 • 优采云 发表了文章 • 0 个评论 • 53 次浏览 • 2021-09-27 10:12
之前一峰写过一篇关于使用Jsoup爬取网页内容的文章文章:
[Jsoup] HTML 解析器,轻松访问网页内容
Jsoup提供的api非常方便,完全类似于JQuery操作,轻松抓取网页数据。但是像Jsoup这样的普通爬虫工具的缺点是无法处理js生成的内容。
做过Html开发的都知道,现在很多网站都大量使用ajax和JavaScript来获取和处理数据,普通的爬虫工具已经无法处理js中的内容了。
比如我们在本地新建一个测试web文件text.html,源码如下:
main.html a { line-height: 30px; margin: 20px; } var datas = [ { href : "http://www.jianshu.com/p/8d8edf25850d", title : "推荐一款编程字体,让代码看着更美"}, { href : "http://www.jianshu.com/p/153d9f31288d", title : "Android 利用Camera实现中轴3D卡牌翻转效果"}, { href : "http://www.jianshu.com/p/d6fb0c9c9c26", title : "【Eclipse】挖掘专属最有用的快捷键组合"}, { href : "http://www.jianshu.com/p/72d69b49d135", title : "【IIS】Windows下利用IIS建立网站并实现局域网共享"} ];window.onload = function() { var infos = document.getElementById("infos"); for( var i = 0 ; i < datas.length ; i++) { var a = document.createElement("a"); a.href = datas[i].href ; a.innerText = datas[i].title; infos.appendChild(a); infos.appendChild(document.createElement("br")) }} HtmlUnit 测试网页内容!
通过IIS发布本地网站(参考易峰之前写的文章:【IIS】Windows下使用IIS建立网站,实现局域网共享),显示网页效果在浏览器中如下:
网页展示效果.jpg
虽然通过网页评论元素可以看到body收录了网页显示中的文本内容:
网络评论元素.jpg
但是,它根本无法通过 Jsoup 工具使用!从网页源码中可以看出,我们需要抓取的内容是在页面显示后通过ajax和JavaScript加载的。
那么该怎么办?使用本文推荐的开源工具——HtmlUnit,一款可以模拟浏览器的抓包神器!
在官网下载对应的jar包,添加到工程项目的lib中。简单的测试代码如下:
import java.io.IOException;import java.net.MalformedURLException;import java.text.ParseException;import com.gargoylesoftware.htmlunit.BrowserVersion;import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;import com.gargoylesoftware.htmlunit.WebClient;import com.gargoylesoftware.htmlunit.html.DomElement;import com.gargoylesoftware.htmlunit.html.DomNodeList;import com.gargoylesoftware.htmlunit.html.HtmlPage;/** * @author 亦枫 * @created_time 2016年1月12日 * @file_user_todo Java测试类 * @blog http://www.jianshu.com/users/1 ... icles */public class JavaTest { /** * 入口函数 * @param args * @throws ParseException */ public static void main(String[] args) throws ParseException { try { WebClient webClient = new WebClient(BrowserVersion.CHROME); HtmlPage htmlPage = (HtmlPage) webClient.getPage("http://localhost/test.html"); DomNodeList domNodeList = htmlPage.getElementsByTagName("a"); for (int i = 0; i < domNodeList.size(); i++) { DomElement domElement = (DomElement) domNodeList.get(i); System.out.println(domElement.asText()); } webClient.close(); } catch (FailingHttpStatusCodeException e) { e.printStackTrace(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }}
运行后,控制台打印结果:
HtmlUnit 测试结果.jpg
可见HtmlUnit可以抓取AJAX和JavaScript加载的内容。
HtmlUnit的介绍在官网上很详细。以下内容为易峰翻译的部分内容,供大家参考:
HtmlUnit 是一个基于 Java 的浏览器程序,没有图形界面。它可以调用HTML文档并提供API,让开发者可以像在普通浏览器上操作一样访问网页内容、填写表格、点击超链接等。
它可以很好地支持 JavaScript,并且仍在改进中。同时,它可以解析非常复杂的AJAX库,模拟不同配置下的Chrome、Firefox和IE浏览器。
HtmlUnit 通常用于测试目的和检索 网站 信息。
HtmlUnit 提供了很多用于测试网络请求和抓取网页内容的功能。可以到官网或者其他网站学习使用。 查看全部
htmlunit 抓取网页(使用本文中推荐的开源工具——HtmlUnit,一款能够模拟浏览器的抓包神器!)
之前一峰写过一篇关于使用Jsoup爬取网页内容的文章文章:
[Jsoup] HTML 解析器,轻松访问网页内容
Jsoup提供的api非常方便,完全类似于JQuery操作,轻松抓取网页数据。但是像Jsoup这样的普通爬虫工具的缺点是无法处理js生成的内容。
做过Html开发的都知道,现在很多网站都大量使用ajax和JavaScript来获取和处理数据,普通的爬虫工具已经无法处理js中的内容了。
比如我们在本地新建一个测试web文件text.html,源码如下:
main.html a { line-height: 30px; margin: 20px; } var datas = [ { href : "http://www.jianshu.com/p/8d8edf25850d", title : "推荐一款编程字体,让代码看着更美"}, { href : "http://www.jianshu.com/p/153d9f31288d", title : "Android 利用Camera实现中轴3D卡牌翻转效果"}, { href : "http://www.jianshu.com/p/d6fb0c9c9c26", title : "【Eclipse】挖掘专属最有用的快捷键组合"}, { href : "http://www.jianshu.com/p/72d69b49d135", title : "【IIS】Windows下利用IIS建立网站并实现局域网共享"} ];window.onload = function() { var infos = document.getElementById("infos"); for( var i = 0 ; i < datas.length ; i++) { var a = document.createElement("a"); a.href = datas[i].href ; a.innerText = datas[i].title; infos.appendChild(a); infos.appendChild(document.createElement("br")) }} HtmlUnit 测试网页内容!
通过IIS发布本地网站(参考易峰之前写的文章:【IIS】Windows下使用IIS建立网站,实现局域网共享),显示网页效果在浏览器中如下:
网页展示效果.jpg
虽然通过网页评论元素可以看到body收录了网页显示中的文本内容:
网络评论元素.jpg
但是,它根本无法通过 Jsoup 工具使用!从网页源码中可以看出,我们需要抓取的内容是在页面显示后通过ajax和JavaScript加载的。
那么该怎么办?使用本文推荐的开源工具——HtmlUnit,一款可以模拟浏览器的抓包神器!
在官网下载对应的jar包,添加到工程项目的lib中。简单的测试代码如下:
import java.io.IOException;import java.net.MalformedURLException;import java.text.ParseException;import com.gargoylesoftware.htmlunit.BrowserVersion;import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;import com.gargoylesoftware.htmlunit.WebClient;import com.gargoylesoftware.htmlunit.html.DomElement;import com.gargoylesoftware.htmlunit.html.DomNodeList;import com.gargoylesoftware.htmlunit.html.HtmlPage;/** * @author 亦枫 * @created_time 2016年1月12日 * @file_user_todo Java测试类 * @blog http://www.jianshu.com/users/1 ... icles */public class JavaTest { /** * 入口函数 * @param args * @throws ParseException */ public static void main(String[] args) throws ParseException { try { WebClient webClient = new WebClient(BrowserVersion.CHROME); HtmlPage htmlPage = (HtmlPage) webClient.getPage("http://localhost/test.html"); DomNodeList domNodeList = htmlPage.getElementsByTagName("a"); for (int i = 0; i < domNodeList.size(); i++) { DomElement domElement = (DomElement) domNodeList.get(i); System.out.println(domElement.asText()); } webClient.close(); } catch (FailingHttpStatusCodeException e) { e.printStackTrace(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }}
运行后,控制台打印结果:
HtmlUnit 测试结果.jpg
可见HtmlUnit可以抓取AJAX和JavaScript加载的内容。
HtmlUnit的介绍在官网上很详细。以下内容为易峰翻译的部分内容,供大家参考:
HtmlUnit 是一个基于 Java 的浏览器程序,没有图形界面。它可以调用HTML文档并提供API,让开发者可以像在普通浏览器上操作一样访问网页内容、填写表格、点击超链接等。
它可以很好地支持 JavaScript,并且仍在改进中。同时,它可以解析非常复杂的AJAX库,模拟不同配置下的Chrome、Firefox和IE浏览器。
HtmlUnit 通常用于测试目的和检索 网站 信息。
HtmlUnit 提供了很多用于测试网络请求和抓取网页内容的功能。可以到官网或者其他网站学习使用。
htmlunit 抓取网页(抓一个今日头条的首页内容解决方案-苏州安嘉)
网站优化 • 优采云 发表了文章 • 0 个评论 • 84 次浏览 • 2021-09-27 00:09
不知道大家在使用jsoup的过程中是否遇到过爬取内容的情况,发现有些网页的内容是通过JavaScript异步加载的,导致我们的爬虫空手返回(只抓到了一个网页) 。
遇到这个问题首先想到的有两种解决方案:
在网页的异步加载完成后,使用类似于Python中的延迟加载的方法对异步加载的网页进行爬取。使用特殊的方法让被爬取的网页的外框模拟里面的JavaScript代码的执行,最终到达完整的网页。
在搜索引擎的帮助下,我决定使用选项2来解决问题。选项 1 没有搜索更好的第三方库。在java中使用Option 1解决这个问题的朋友希望能和下一个一起讨论,太好了。
案例很简单,抓取今日头条的首页内容。你可以看看今日头条的主页。里面的内容是异步加载的。
添加jsoup和htmlunit的依赖
org.jsoup
jsoup
1.10.2
net.sourceforge.htmlunit
htmlunit
2.25
首先我们单独使用jsoup解析今日头条首页
String url = "https://www.toutiao.com/";
Connection connect = Jsoup.connect(url);
Document document = connect.get();
System.out.println(document);
↑ 这里只能获取网页的frame内容,不能获取首页的新闻内容
接下来我们用htmlunit试试
//构造一个webClient 模拟Chrome 浏览器
WebClient webClient = new WebClient(BrowserVersion.CHROME);
//屏蔽日志信息
LogFactory.getFactory().setAttribute("org.apache.commons.logging.Log",
"org.apache.commons.logging.impl.NoOpLog");
java.util.logging.Logger.getLogger("com.gargoylesoftware").setLevel(Level.OFF);
//支持JavaScript
webClient.getOptions().setJavaScriptEnabled(true);
webClient.getOptions().setCssEnabled(false);
webClient.getOptions().setActiveXNative(false);
webClient.getOptions().setCssEnabled(false);
webClient.getOptions().setThrowExceptionOnScriptError(false);
webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
webClient.getOptions().setTimeout(5000);
HtmlPage rootPage = webClient.getPage(url);
//设置一个运行JavaScript的时间
webClient.waitForBackgroundJavaScript(5000);
String html = rootPage.asXml();
Document document = Jsoup.parse(html);
/imgrdrct/http://static.blog.csdn.net/im ... s.png
这样我们就可以在运行后得到一个收录JavaScript的完整源码网页 查看全部
htmlunit 抓取网页(抓一个今日头条的首页内容解决方案-苏州安嘉)
不知道大家在使用jsoup的过程中是否遇到过爬取内容的情况,发现有些网页的内容是通过JavaScript异步加载的,导致我们的爬虫空手返回(只抓到了一个网页) 。
遇到这个问题首先想到的有两种解决方案:
在网页的异步加载完成后,使用类似于Python中的延迟加载的方法对异步加载的网页进行爬取。使用特殊的方法让被爬取的网页的外框模拟里面的JavaScript代码的执行,最终到达完整的网页。
在搜索引擎的帮助下,我决定使用选项2来解决问题。选项 1 没有搜索更好的第三方库。在java中使用Option 1解决这个问题的朋友希望能和下一个一起讨论,太好了。
案例很简单,抓取今日头条的首页内容。你可以看看今日头条的主页。里面的内容是异步加载的。
添加jsoup和htmlunit的依赖
org.jsoup
jsoup
1.10.2
net.sourceforge.htmlunit
htmlunit
2.25
首先我们单独使用jsoup解析今日头条首页
String url = "https://www.toutiao.com/";
Connection connect = Jsoup.connect(url);
Document document = connect.get();
System.out.println(document);
↑ 这里只能获取网页的frame内容,不能获取首页的新闻内容
接下来我们用htmlunit试试
//构造一个webClient 模拟Chrome 浏览器
WebClient webClient = new WebClient(BrowserVersion.CHROME);
//屏蔽日志信息
LogFactory.getFactory().setAttribute("org.apache.commons.logging.Log",
"org.apache.commons.logging.impl.NoOpLog");
java.util.logging.Logger.getLogger("com.gargoylesoftware").setLevel(Level.OFF);
//支持JavaScript
webClient.getOptions().setJavaScriptEnabled(true);
webClient.getOptions().setCssEnabled(false);
webClient.getOptions().setActiveXNative(false);
webClient.getOptions().setCssEnabled(false);
webClient.getOptions().setThrowExceptionOnScriptError(false);
webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
webClient.getOptions().setTimeout(5000);
HtmlPage rootPage = webClient.getPage(url);
//设置一个运行JavaScript的时间
webClient.waitForBackgroundJavaScript(5000);
String html = rootPage.asXml();
Document document = Jsoup.parse(html);
/imgrdrct/http://static.blog.csdn.net/im ... s.png
这样我们就可以在运行后得到一个收录JavaScript的完整源码网页
htmlunit 抓取网页(,一个)
网站优化 • 优采云 发表了文章 • 0 个评论 • 53 次浏览 • 2021-09-24 17:04
标签:styleblogclasscodejaext
最近,在编写爬虫程序时,使用httpclient捕获某些网页时出现了一些问题,即捕获的内容收录大量加密文本(通过JavaScript脚本),而无法获取真实内容(即通过浏览器打开网页呈现的内容)。因此,您通常需要与JS引擎合作来解决这个问题。搜索后,您可以找到帮助的工具htmlunit。在理解和使用的过程中,我发现这是一个非常强大的开源工具。尽管它不如httpclient出名,但其实力不应低估
不要说闲话。目前,htmlunit的最新版本为2.14,可在此处下载:
只需下载htmlunit-2.14 bin.zip,解压并将所有jar包导入到项目中
以下是一个相对完整的代码:
String url="http://news.cnblogs.com/";//想采集的网址
String refer="http://www.cnblogs.com/";
URL link=new URL(url);
WebClient wc=new WebClient();
WebRequest request=new WebRequest(link);
request.setCharset("UTF-8");
request.setProxyHost("120.120.120.x");
request.setProxyPort(8080);
request.setAdditionalHeader("Referer", refer);//设置请求报文头里的refer字段
////设置请求报文头里的User-Agent字段
request.setAdditionalHeader("User-Agent", "Mozilla/5.0 (Windows NT 5.1; rv:6.0.2) Gecko/20100101 Firefox/6.0.2");
//wc.addRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 5.1; rv:6.0.2) Gecko/20100101 Firefox/6.0.2");
//wc.addRequestHeader和request.setAdditionalHeader功能应该是一样的。选择一个即可。
//其他报文头字段可以根据需要添加
wc.getCookieManager().setCookiesEnabled(true);//开启cookie管理
wc.getOptions().setJavaScriptEnabled(true);//开启js解析。对于变态网页,这个是必须的
wc.getOptions().setCssEnabled(true);//开启css解析。对于变态网页,这个是必须的。
wc.getOptions().setThrowExceptionOnFailingStatusCode(false);
wc.getOptions().setThrowExceptionOnScriptError(false);
wc.getOptions().setTimeout(10000);
//设置cookie。如果你有cookie,可以在这里设置
Set cookies=null;
Iterator i = cookies.iterator();
while (i.hasNext())
{
wc.getCookieManager().addCookie(i.next());
}
//准备工作已经做好了
HtmlPage page=null;
page = wc.getPage(request);
if(page==null)
{
System.out.println("采集 "+url+" 失败!!!");
return ;
}
String content=page.asText();//网页内容保存在content里
if(content==null)
{
System.out.println("采集 "+url+" 失败!!!");
return ;
}
//搞定了
CookieManager CM = wc.getCookieManager(); //WC = Your WebClient‘s name
Set cookies_ret = CM.getCookies();//返回的Cookie在这里,下次请求的时候可能可以用上啦。
说明:
一,。在htmlunit的操作过程中会引发许多异常。你必须做好准备。哈哈
二,。对于异常的网页,有时候你不能用htmlunit获得完整和正确的内容,但是没有压力获得大致正确的内容。下面是如何用jsup之类的东西提取它
三,。Htmlunit功能非常强大,有很大的研究空间
Htmlunit教程,布扣
Htmlunit教程
标签:styleblogclasscodejaext 查看全部
htmlunit 抓取网页(,一个)
标签:styleblogclasscodejaext
最近,在编写爬虫程序时,使用httpclient捕获某些网页时出现了一些问题,即捕获的内容收录大量加密文本(通过JavaScript脚本),而无法获取真实内容(即通过浏览器打开网页呈现的内容)。因此,您通常需要与JS引擎合作来解决这个问题。搜索后,您可以找到帮助的工具htmlunit。在理解和使用的过程中,我发现这是一个非常强大的开源工具。尽管它不如httpclient出名,但其实力不应低估
不要说闲话。目前,htmlunit的最新版本为2.14,可在此处下载:
只需下载htmlunit-2.14 bin.zip,解压并将所有jar包导入到项目中
以下是一个相对完整的代码:
String url="http://news.cnblogs.com/";//想采集的网址
String refer="http://www.cnblogs.com/";
URL link=new URL(url);
WebClient wc=new WebClient();
WebRequest request=new WebRequest(link);
request.setCharset("UTF-8");
request.setProxyHost("120.120.120.x");
request.setProxyPort(8080);
request.setAdditionalHeader("Referer", refer);//设置请求报文头里的refer字段
////设置请求报文头里的User-Agent字段
request.setAdditionalHeader("User-Agent", "Mozilla/5.0 (Windows NT 5.1; rv:6.0.2) Gecko/20100101 Firefox/6.0.2");
//wc.addRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 5.1; rv:6.0.2) Gecko/20100101 Firefox/6.0.2");
//wc.addRequestHeader和request.setAdditionalHeader功能应该是一样的。选择一个即可。
//其他报文头字段可以根据需要添加
wc.getCookieManager().setCookiesEnabled(true);//开启cookie管理
wc.getOptions().setJavaScriptEnabled(true);//开启js解析。对于变态网页,这个是必须的
wc.getOptions().setCssEnabled(true);//开启css解析。对于变态网页,这个是必须的。
wc.getOptions().setThrowExceptionOnFailingStatusCode(false);
wc.getOptions().setThrowExceptionOnScriptError(false);
wc.getOptions().setTimeout(10000);
//设置cookie。如果你有cookie,可以在这里设置
Set cookies=null;
Iterator i = cookies.iterator();
while (i.hasNext())
{
wc.getCookieManager().addCookie(i.next());
}
//准备工作已经做好了
HtmlPage page=null;
page = wc.getPage(request);
if(page==null)
{
System.out.println("采集 "+url+" 失败!!!");
return ;
}
String content=page.asText();//网页内容保存在content里
if(content==null)
{
System.out.println("采集 "+url+" 失败!!!");
return ;
}
//搞定了
CookieManager CM = wc.getCookieManager(); //WC = Your WebClient‘s name
Set cookies_ret = CM.getCookies();//返回的Cookie在这里,下次请求的时候可能可以用上啦。
说明:
一,。在htmlunit的操作过程中会引发许多异常。你必须做好准备。哈哈
二,。对于异常的网页,有时候你不能用htmlunit获得完整和正确的内容,但是没有压力获得大致正确的内容。下面是如何用jsup之类的东西提取它
三,。Htmlunit功能非常强大,有很大的研究空间
Htmlunit教程,布扣
Htmlunit教程
标签:styleblogclasscodejaext
htmlunit 抓取网页(做过j2ee或android开发的童鞋,应该或多或少都使用过Apeache)
网站优化 • 优采云 发表了文章 • 0 个评论 • 77 次浏览 • 2021-09-22 11:07
由J2EE或Android开发的坟墓应该或多或少地使用了Apheach的Httpclient库。此类库为我们提供了一个非常强大的服务器HTTP请求操作。在开发中使用非常方便。
最近做PHP开发,还需要在服务器上发送HTTP请求,然后处理返回客户端,如果使用套接字,您可能不会太麻烦,我想看看是否有任何问题Httpclient在PHP中。类库。
谷歌,我发现PHP中有这样的类库,名称称为Httpclient,非常兴奋,看官方网站,发现它尚未更新多年,并且该功能似乎是有限,损失是什么。然后我找到了另一个类库史努比,我不知道这个类库,但我仍然看到在线响应不错,所以我决定用他。他的API使用和Apheach的Httpclient差异,但它仍然很容易使用。此外,还有许多特殊用途的方法,例如只抓住页面中的表单形式,或所有链接等。
include 'Snoopy.class.php';
$snoopy = new Snoopy();
$snoopy->fetch("http://www.baidu.com");
echo $snoopy->results;
上面的代码很容易轻松抓住百度页面。
当然,当你需要发送帖子表单时,可以使用提交方法提交数据。
他还提供了Cookie的请求标题,响应头和相关操作功能,非常强大。
\ n“;} else {echo”错误获取文档:“$ snoopy-&gt;错误。” \ n“;}
更多操作方法,您可以转到Snoopy的官方查看文档,或直接查看源代码。
在这里,snoopy只是将页面返回。如果要提取页面,则无法帮助它。在这里我发现另一个PHP解析HTML工具:PHPQuery,它提供了操作方法和jQuery几乎完全,并提供了一些PHP特性,熟悉jQuery儿童鞋,使用phpquery应该是相当的,甚至不需要文档。
使用史努比+ PhpQuery,它是实现网页,非常实用很方便,我也是最近在这方面,我发现这两个很好的类库,我有很多的Java可以做到这一点。事情,PHP也可以这样做。
兴趣的同学,您也可以尝试将它们成为一个简单的Web爬升。 查看全部
htmlunit 抓取网页(做过j2ee或android开发的童鞋,应该或多或少都使用过Apeache)
由J2EE或Android开发的坟墓应该或多或少地使用了Apheach的Httpclient库。此类库为我们提供了一个非常强大的服务器HTTP请求操作。在开发中使用非常方便。
最近做PHP开发,还需要在服务器上发送HTTP请求,然后处理返回客户端,如果使用套接字,您可能不会太麻烦,我想看看是否有任何问题Httpclient在PHP中。类库。
谷歌,我发现PHP中有这样的类库,名称称为Httpclient,非常兴奋,看官方网站,发现它尚未更新多年,并且该功能似乎是有限,损失是什么。然后我找到了另一个类库史努比,我不知道这个类库,但我仍然看到在线响应不错,所以我决定用他。他的API使用和Apheach的Httpclient差异,但它仍然很容易使用。此外,还有许多特殊用途的方法,例如只抓住页面中的表单形式,或所有链接等。
include 'Snoopy.class.php';
$snoopy = new Snoopy();
$snoopy->fetch("http://www.baidu.com");
echo $snoopy->results;
上面的代码很容易轻松抓住百度页面。
当然,当你需要发送帖子表单时,可以使用提交方法提交数据。
他还提供了Cookie的请求标题,响应头和相关操作功能,非常强大。
\ n“;} else {echo”错误获取文档:“$ snoopy-&gt;错误。” \ n“;}
更多操作方法,您可以转到Snoopy的官方查看文档,或直接查看源代码。
在这里,snoopy只是将页面返回。如果要提取页面,则无法帮助它。在这里我发现另一个PHP解析HTML工具:PHPQuery,它提供了操作方法和jQuery几乎完全,并提供了一些PHP特性,熟悉jQuery儿童鞋,使用phpquery应该是相当的,甚至不需要文档。
使用史努比+ PhpQuery,它是实现网页,非常实用很方便,我也是最近在这方面,我发现这两个很好的类库,我有很多的Java可以做到这一点。事情,PHP也可以这样做。
兴趣的同学,您也可以尝试将它们成为一个简单的Web爬升。
htmlunit 抓取网页(爬虫抓取网页的例子是什么?如何下载网页?)
网站优化 • 优采云 发表了文章 • 0 个评论 • 72 次浏览 • 2021-09-22 11:06
当最近由httpclient编写时,httpclient的一些问题将逮捕一些问题,该问题是捕获收录大量加密文本的内容(通过JavaScript脚本),无法获得真实内容(即打开网页使用浏览器)呈现内容)。因此,它通常需要与JS引擎合作来解决这个问题,搜索,发现HTMLUnit可以提供帮助。这是一个非常糟糕的开源工具。虽然着名的傲慢小于httpclient,但实力绝对不低估。戈斯少。从这里下载:
以下是爬虫抓取页面的示例:
String url="http://outofmemory.cn/";//想采集的网址
String refer="http://open-open.com/";
URL link=new URL(url);
WebClient wc=new WebClient();
WebRequest request=new WebRequest(link);
request.setCharset("UTF-8");
request.setProxyHost("120.120.120.x");
request.setProxyPort(8080);
request.setAdditionalHeader("Referer", refer);//设置请求报文头里的refer字段
////设置请求报文头里的User-Agent字段
request.setAdditionalHeader("User-Agent", "Mozilla/5.0 (Windows NT 5.1; rv:6.0.2) Gecko/20100101 Firefox/6.0.2");
//wc.addRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 5.1; rv:6.0.2) Gecko/20100101 Firefox/6.0.2");
//wc.addRequestHeader和request.setAdditionalHeader功能应该是一样的。选择一个即可。
//其他报文头字段可以根据需要添加
wc.getCookieManager().setCookiesEnabled(true);//开启cookie管理
wc.getOptions().setJavaScriptEnabled(true);//开启js解析。对于变态网页,这个是必须的
wc.getOptions().setCssEnabled(true);//开启css解析。对于变态网页,这个是必须的。
wc.getOptions().setThrowExceptionOnFailingStatusCode(false);
wc.getOptions().setThrowExceptionOnScriptError(false);
wc.getOptions().setTimeout(10000);
//设置cookie。如果你有cookie,可以在这里设置
Set cookies=null;
Iterator i = cookies.iterator();
while (i.hasNext())
{
wc.getCookieManager().addCookie(i.next());
}
//准备工作已经做好了
HtmlPage page=null;
page = wc.getPage(request);
if(page==null)
{
System.out.println("采集 "+url+" 失败!!!");
return ;
}
String content=page.asText();//网页内容保存在content里
if(content==null)
{
System.out.println("采集 "+url+" 失败!!!");
return ;
}
//搞定了
CookieManager CM = wc.getCookieManager(); //WC = Your WebClient's name
Set cookies_ret = CM.getCookies();//返回的Cookie在这里,下次请求的时候可能可以用上啦。
如果您不明白,您可以留言,互相讨论。 查看全部
htmlunit 抓取网页(爬虫抓取网页的例子是什么?如何下载网页?)
当最近由httpclient编写时,httpclient的一些问题将逮捕一些问题,该问题是捕获收录大量加密文本的内容(通过JavaScript脚本),无法获得真实内容(即打开网页使用浏览器)呈现内容)。因此,它通常需要与JS引擎合作来解决这个问题,搜索,发现HTMLUnit可以提供帮助。这是一个非常糟糕的开源工具。虽然着名的傲慢小于httpclient,但实力绝对不低估。戈斯少。从这里下载:
以下是爬虫抓取页面的示例:
String url="http://outofmemory.cn/";//想采集的网址
String refer="http://open-open.com/";
URL link=new URL(url);
WebClient wc=new WebClient();
WebRequest request=new WebRequest(link);
request.setCharset("UTF-8");
request.setProxyHost("120.120.120.x");
request.setProxyPort(8080);
request.setAdditionalHeader("Referer", refer);//设置请求报文头里的refer字段
////设置请求报文头里的User-Agent字段
request.setAdditionalHeader("User-Agent", "Mozilla/5.0 (Windows NT 5.1; rv:6.0.2) Gecko/20100101 Firefox/6.0.2");
//wc.addRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 5.1; rv:6.0.2) Gecko/20100101 Firefox/6.0.2");
//wc.addRequestHeader和request.setAdditionalHeader功能应该是一样的。选择一个即可。
//其他报文头字段可以根据需要添加
wc.getCookieManager().setCookiesEnabled(true);//开启cookie管理
wc.getOptions().setJavaScriptEnabled(true);//开启js解析。对于变态网页,这个是必须的
wc.getOptions().setCssEnabled(true);//开启css解析。对于变态网页,这个是必须的。
wc.getOptions().setThrowExceptionOnFailingStatusCode(false);
wc.getOptions().setThrowExceptionOnScriptError(false);
wc.getOptions().setTimeout(10000);
//设置cookie。如果你有cookie,可以在这里设置
Set cookies=null;
Iterator i = cookies.iterator();
while (i.hasNext())
{
wc.getCookieManager().addCookie(i.next());
}
//准备工作已经做好了
HtmlPage page=null;
page = wc.getPage(request);
if(page==null)
{
System.out.println("采集 "+url+" 失败!!!");
return ;
}
String content=page.asText();//网页内容保存在content里
if(content==null)
{
System.out.println("采集 "+url+" 失败!!!");
return ;
}
//搞定了
CookieManager CM = wc.getCookieManager(); //WC = Your WebClient's name
Set cookies_ret = CM.getCookies();//返回的Cookie在这里,下次请求的时候可能可以用上啦。
如果您不明白,您可以留言,互相讨论。
htmlunit 抓取网页(AngularJS-pageapplication框架如何判断前端渲染判断页面多)
网站优化 • 优采云 发表了文章 • 0 个评论 • 49 次浏览 • 2021-09-19 23:22
抓取前端呈现页面
随着Ajax技术的不断普及和angularjs等单页应用框架的出现,越来越多的页面被JS呈现。对于爬虫来说,这种页面很烦人:仅提取HTML内容通常无法获得有效信息。那么如何处理这种页面呢?一般来说,有两种方法:
在爬行阶段,浏览器内核内置到爬行器中,页面在爬行之前由JS呈现。这方面的相应工具是selenium、htmlunit或phantom JS。然而,这些工具存在一些效率问题,并且不太稳定。其优点是编写规则与静态页面相同。由于JS呈现页面的数据也是从后端获取的,基本上是通过Ajax获取的,因此分析Ajax请求并找到相应的数据请求也是可行的。此外,与页面样式相比,此界面不太可能更改。缺点是找到这个请求并模拟它是一个相对困难的过程,需要相对较多的分析经验
比较这两种方法,我的观点是,对于一次性或小规模的需求,第一种方法可以节省时间和精力。然而,对于长期和大规模的需求,第二个将更可靠。对于一些网站,甚至一些JS混淆技术,目前,第一种方法基本上是万能的,而第二种方法将非常复杂
这里我们以angularjs中文社区{{global.Metallic}为例
1如何判断前端渲染
判断页面是否以JS呈现的方法相对简单。在浏览器中直接查看源代码(windows中为Ctrl+u,MAC中为Command+Alt+u)。如果找不到有效的信息,基本上肯定会在JS中呈现
在本例中,如果在源代码中找不到页面中的标题“优孚计算机网络-前端攻城师”,则可以断定是JS渲染,数据是通过Ajax获取的
2分析请求
让我们转到最难的部分:查找数据请求。此步骤可以帮助我们的工具,主要是用于在浏览器中查看网络请求的开发人员工具
以chome为例。让我们打开“开发者工具”(windows上的F12和MAC上的Command+Alt+I),然后再次刷新页面(它也可能是一个下拉页面,简而言之,所有您认为可能触发新数据的操作),然后记住保留场景并逐个分析请求
这一步需要一点耐心,但并非没有规则可循。首先可以帮助我们的是上面的分类过滤器(所有、文档等)。如果是普通的Ajax,它将显示在XHR标记下,jsonp请求将显示在scripts标记下。这是两种常见的数据类型
然后你可以根据数据的大小来判断。通常,结果的大小越大,越有可能是返回数据的接口。其余的基本上取决于经验。例如,这里的“最新的?P=1&S=20”乍一看是可疑的
对于可疑地址,您可以查看响应主体是什么。我们无法在开发人员工具中清楚地看到它。我们复制/API/文章/最新版本?P=1&S=20到地址栏,并再次请求它(如果您安装了chrome推荐的JSON查看器,则可以方便地查看Ajax结果)。看看结果,我们似乎找到了我们想要的
同样,我们转到post详细信息页面,找到了对特定内容的请求:/API/article/a0y2
以上信息摘自webmagic 查看全部
htmlunit 抓取网页(AngularJS-pageapplication框架如何判断前端渲染判断页面多)
抓取前端呈现页面
随着Ajax技术的不断普及和angularjs等单页应用框架的出现,越来越多的页面被JS呈现。对于爬虫来说,这种页面很烦人:仅提取HTML内容通常无法获得有效信息。那么如何处理这种页面呢?一般来说,有两种方法:
在爬行阶段,浏览器内核内置到爬行器中,页面在爬行之前由JS呈现。这方面的相应工具是selenium、htmlunit或phantom JS。然而,这些工具存在一些效率问题,并且不太稳定。其优点是编写规则与静态页面相同。由于JS呈现页面的数据也是从后端获取的,基本上是通过Ajax获取的,因此分析Ajax请求并找到相应的数据请求也是可行的。此外,与页面样式相比,此界面不太可能更改。缺点是找到这个请求并模拟它是一个相对困难的过程,需要相对较多的分析经验
比较这两种方法,我的观点是,对于一次性或小规模的需求,第一种方法可以节省时间和精力。然而,对于长期和大规模的需求,第二个将更可靠。对于一些网站,甚至一些JS混淆技术,目前,第一种方法基本上是万能的,而第二种方法将非常复杂
这里我们以angularjs中文社区{{global.Metallic}为例
1如何判断前端渲染
判断页面是否以JS呈现的方法相对简单。在浏览器中直接查看源代码(windows中为Ctrl+u,MAC中为Command+Alt+u)。如果找不到有效的信息,基本上肯定会在JS中呈现
在本例中,如果在源代码中找不到页面中的标题“优孚计算机网络-前端攻城师”,则可以断定是JS渲染,数据是通过Ajax获取的
2分析请求
让我们转到最难的部分:查找数据请求。此步骤可以帮助我们的工具,主要是用于在浏览器中查看网络请求的开发人员工具
以chome为例。让我们打开“开发者工具”(windows上的F12和MAC上的Command+Alt+I),然后再次刷新页面(它也可能是一个下拉页面,简而言之,所有您认为可能触发新数据的操作),然后记住保留场景并逐个分析请求
这一步需要一点耐心,但并非没有规则可循。首先可以帮助我们的是上面的分类过滤器(所有、文档等)。如果是普通的Ajax,它将显示在XHR标记下,jsonp请求将显示在scripts标记下。这是两种常见的数据类型
然后你可以根据数据的大小来判断。通常,结果的大小越大,越有可能是返回数据的接口。其余的基本上取决于经验。例如,这里的“最新的?P=1&S=20”乍一看是可疑的
对于可疑地址,您可以查看响应主体是什么。我们无法在开发人员工具中清楚地看到它。我们复制/API/文章/最新版本?P=1&S=20到地址栏,并再次请求它(如果您安装了chrome推荐的JSON查看器,则可以方便地查看Ajax结果)。看看结果,我们似乎找到了我们想要的
同样,我们转到post详细信息页面,找到了对特定内容的请求:/API/article/a0y2
以上信息摘自webmagic
htmlunit 抓取网页(()软件介绍支持RSS的定制功能(组图))
网站优化 • 优采云 发表了文章 • 0 个评论 • 81 次浏览 • 2021-09-16 17:21
网络爬虫是一种具有强大定制功能的新闻阅读工具。它可以抓取任何链接中的网站,极大地方便了需要获取每个站点信息的工作人员,提高了效率,节省了时间
软件介绍
支持RSS,包括RSS0.9/1.0 /2.0、原子、OPML等
支持在任何站点抓取任何链接
多站点同步更新(多线程)
您可以自定义对指定链接的捕获或排除
支持IE cookie的自动调用,适合需要登录的论坛
如果没有提示MSVCR71.DLL文件,请下载并放在webclawer的同级目录下
绿色软件,无需安装,可存储在U盘上执行
点击下载软件
软件使用
软件不需要安装。解压缩后,双击将其打开。界面如图所示
<IMG title=001 alt=001 src="//img2.pconline.com.cn/pconline/0804/22/1275786_001.jpg" border=0>
图1软件界面
让我们以太平洋软件信息和应用程序专栏为例,了解如何使用webclawer
打开软件,展开相应列,右键点击,在菜单中选择“新建频道”,如图所示
<IMG title=002 alt=002 src="//img2.pconline.com.cn/pconline/0804/22/1275786_002.jpg" border=0>
图2添加通道
在新频道中,依次输入频道名称、评论、分类和URL地址,选择文件类型-选择RSS模式,完成后保存。如图所示
<IMG title=003 alt=003 src="//img2.pconline.com.cn/pconline/0804/22/1275786_003.jpg" border=0>
图3添加通道接口
<IMG title=004 alt=004 src="//img2.pconline.com.cn/pconline/0804/22/1275786_004.jpg" border=0>
图4填写频道信息
添加栏目后,只需选择相应的标题,每次右键点击“更新”,软件即可自动捕获更新后的页面
虽然软件很小,但对于每天需要查看大量信息的朋友来说,这可以批量更新每个站点的每个栏目,节省大量重复性工作,达到提高工作效率的目的。我希望这个软件能给你带来方便 查看全部
htmlunit 抓取网页(()软件介绍支持RSS的定制功能(组图))
网络爬虫是一种具有强大定制功能的新闻阅读工具。它可以抓取任何链接中的网站,极大地方便了需要获取每个站点信息的工作人员,提高了效率,节省了时间
软件介绍
支持RSS,包括RSS0.9/1.0 /2.0、原子、OPML等
支持在任何站点抓取任何链接
多站点同步更新(多线程)
您可以自定义对指定链接的捕获或排除
支持IE cookie的自动调用,适合需要登录的论坛
如果没有提示MSVCR71.DLL文件,请下载并放在webclawer的同级目录下
绿色软件,无需安装,可存储在U盘上执行
点击下载软件
软件使用
软件不需要安装。解压缩后,双击将其打开。界面如图所示
<IMG title=001 alt=001 src="//img2.pconline.com.cn/pconline/0804/22/1275786_001.jpg" border=0>
图1软件界面
让我们以太平洋软件信息和应用程序专栏为例,了解如何使用webclawer
打开软件,展开相应列,右键点击,在菜单中选择“新建频道”,如图所示
<IMG title=002 alt=002 src="//img2.pconline.com.cn/pconline/0804/22/1275786_002.jpg" border=0>
图2添加通道
在新频道中,依次输入频道名称、评论、分类和URL地址,选择文件类型-选择RSS模式,完成后保存。如图所示
<IMG title=003 alt=003 src="//img2.pconline.com.cn/pconline/0804/22/1275786_003.jpg" border=0>
图3添加通道接口
<IMG title=004 alt=004 src="//img2.pconline.com.cn/pconline/0804/22/1275786_004.jpg" border=0>
图4填写频道信息
添加栏目后,只需选择相应的标题,每次右键点击“更新”,软件即可自动捕获更新后的页面
虽然软件很小,但对于每天需要查看大量信息的朋友来说,这可以批量更新每个站点的每个栏目,节省大量重复性工作,达到提高工作效率的目的。我希望这个软件能给你带来方便
htmlunit 抓取网页(使用本文中推荐的开源工具——HtmlUnit,一款能够模拟浏览器的抓包神器!)
网站优化 • 优采云 发表了文章 • 0 个评论 • 122 次浏览 • 2021-09-16 10:26
之前,Yifeng写了一篇关于使用jsup获取web内容文章的文章:
[jsup]HTML解析器,便于访问web内容
jsup提供的API非常方便。它完全类似于jQuery操作,可以轻松地抓取网页数据。然而,像jsup这样的普通爬虫工具无法处理JS生成的内容
做过HTML开发的人都知道,许多网站现在正在使用Ajax和JavaScript来获取和处理数据。普通的爬虫工具无法处理JS中的内容
例如,我们在本地创建一个新的测试网页文件text.html。源代码如下:
main.html
a {
line-height: 30px;
margin: 20px;
}
var datas = [ {
href : "http://www.jianshu.com/p/8d8edf25850d",
title : "推荐一款编程字体,让代码看着更美"
}, {
href : "http://www.jianshu.com/p/153d9f31288d",
title : "Android 利用Camera实现中轴3D卡牌翻转效果"
}, {
href : "http://www.jianshu.com/p/d6fb0c9c9c26",
title : "【Eclipse】挖掘专属最有用的快捷键组合"
}, {
href : "http://www.jianshu.com/p/72d69b49d135",
title : "【IIS】Windows下利用IIS建立网站并实现局域网共享"
} ];
window.onload = function() {
var infos = document.getElementById("infos");
for( var i = 0 ; i < datas.length ; i++)
{
var a = document.createElement("a");
a.href = datas[i].href ;
a.innerText = datas[i].title;
infos.appendChild(a);
infos.appendChild(document.createElement("br"))
}
}
HtmlUnit 测试网页内容!
通过IIS发布本地网站(请参阅文章:
[IIS]使用IIS建立网站并在Windows下实现局域网共享)
浏览器中显示的网页效果如下:
网页显示效果.jpg
尽管您可以通过web page review元素看到正文收录网页显示中的文本内容:
Page review element.jpg
但是,它不能通过jsup工具使用!从网页源代码中,我们可以看到,我们需要抓取的内容是在页面显示后通过Ajax和JavaScript加载的
那又怎样?使用本文推荐的开源工具htmlunit,它是一个包捕获工件,可以模拟浏览器
在官网上下载相应的jar包,并将其添加到项目库中。简单测试代码如下所示:
import java.io.IOException;
import java.net.MalformedURLException;
import java.text.ParseException;
import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.DomElement;
import com.gargoylesoftware.htmlunit.html.DomNodeList;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
/**
* @author 亦枫
* @created_time 2016年1月12日
* @file_user_todo Java测试类
* @blog http://www.jianshu.com/users/1 ... icles
*/
public class JavaTest {
/**
* 入口函数
* @param args
* @throws ParseException
*/
public static void main(String[] args) throws ParseException {
try {
WebClient webClient = new WebClient(BrowserVersion.CHROME);
HtmlPage htmlPage = (HtmlPage) webClient.getPage("http://localhost/test.html");
DomNodeList domNodeList = htmlPage.getElementsByTagName("a");
for (int i = 0; i < domNodeList.size(); i++) {
DomElement domElement = (DomElement) domNodeList.get(i);
System.out.println(domElement.asText());
}
webClient.close();
} catch (FailingHttpStatusCodeException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
运行后,结果打印在控制台上:
Htmlunit test results.jpg
如您所见,htmlunit可以获取Ajax和JavaScript加载的内容
htmlunit的介绍在官方网站上非常详细。以下内容为益丰翻译的一部分,供您参考:
Htmlunit是一个基于Java的浏览器程序,没有图形界面。它可以调用HTML文档,并为开发人员提供API以获取web内容、填写表单、单击超链接等
它可以很好地支持JavaScript,并且仍在改进中。同时,它可以解析非常复杂的Ajax库,并在不同配置下模拟chrome、Firefox和IE浏览器
Htmlunit通常用于测试目的和检索网站信息
Htmlunit提供了许多用于测试web请求和捕获web内容的功能。你可以去官网或其他网站学习和使用它 查看全部
htmlunit 抓取网页(使用本文中推荐的开源工具——HtmlUnit,一款能够模拟浏览器的抓包神器!)
之前,Yifeng写了一篇关于使用jsup获取web内容文章的文章:
[jsup]HTML解析器,便于访问web内容
jsup提供的API非常方便。它完全类似于jQuery操作,可以轻松地抓取网页数据。然而,像jsup这样的普通爬虫工具无法处理JS生成的内容
做过HTML开发的人都知道,许多网站现在正在使用Ajax和JavaScript来获取和处理数据。普通的爬虫工具无法处理JS中的内容
例如,我们在本地创建一个新的测试网页文件text.html。源代码如下:
main.html
a {
line-height: 30px;
margin: 20px;
}
var datas = [ {
href : "http://www.jianshu.com/p/8d8edf25850d",
title : "推荐一款编程字体,让代码看着更美"
}, {
href : "http://www.jianshu.com/p/153d9f31288d",
title : "Android 利用Camera实现中轴3D卡牌翻转效果"
}, {
href : "http://www.jianshu.com/p/d6fb0c9c9c26",
title : "【Eclipse】挖掘专属最有用的快捷键组合"
}, {
href : "http://www.jianshu.com/p/72d69b49d135",
title : "【IIS】Windows下利用IIS建立网站并实现局域网共享"
} ];
window.onload = function() {
var infos = document.getElementById("infos");
for( var i = 0 ; i < datas.length ; i++)
{
var a = document.createElement("a");
a.href = datas[i].href ;
a.innerText = datas[i].title;
infos.appendChild(a);
infos.appendChild(document.createElement("br"))
}
}
HtmlUnit 测试网页内容!
通过IIS发布本地网站(请参阅文章:
[IIS]使用IIS建立网站并在Windows下实现局域网共享)
浏览器中显示的网页效果如下:
网页显示效果.jpg
尽管您可以通过web page review元素看到正文收录网页显示中的文本内容:
Page review element.jpg
但是,它不能通过jsup工具使用!从网页源代码中,我们可以看到,我们需要抓取的内容是在页面显示后通过Ajax和JavaScript加载的
那又怎样?使用本文推荐的开源工具htmlunit,它是一个包捕获工件,可以模拟浏览器
在官网上下载相应的jar包,并将其添加到项目库中。简单测试代码如下所示:
import java.io.IOException;
import java.net.MalformedURLException;
import java.text.ParseException;
import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.DomElement;
import com.gargoylesoftware.htmlunit.html.DomNodeList;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
/**
* @author 亦枫
* @created_time 2016年1月12日
* @file_user_todo Java测试类
* @blog http://www.jianshu.com/users/1 ... icles
*/
public class JavaTest {
/**
* 入口函数
* @param args
* @throws ParseException
*/
public static void main(String[] args) throws ParseException {
try {
WebClient webClient = new WebClient(BrowserVersion.CHROME);
HtmlPage htmlPage = (HtmlPage) webClient.getPage("http://localhost/test.html");
DomNodeList domNodeList = htmlPage.getElementsByTagName("a");
for (int i = 0; i < domNodeList.size(); i++) {
DomElement domElement = (DomElement) domNodeList.get(i);
System.out.println(domElement.asText());
}
webClient.close();
} catch (FailingHttpStatusCodeException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
运行后,结果打印在控制台上:
Htmlunit test results.jpg
如您所见,htmlunit可以获取Ajax和JavaScript加载的内容
htmlunit的介绍在官方网站上非常详细。以下内容为益丰翻译的一部分,供您参考:
Htmlunit是一个基于Java的浏览器程序,没有图形界面。它可以调用HTML文档,并为开发人员提供API以获取web内容、填写表单、单击超链接等
它可以很好地支持JavaScript,并且仍在改进中。同时,它可以解析非常复杂的Ajax库,并在不同配置下模拟chrome、Firefox和IE浏览器
Htmlunit通常用于测试目的和检索网站信息
Htmlunit提供了许多用于测试web请求和捕获web内容的功能。你可以去官网或其他网站学习和使用它
htmlunit 抓取网页(的java程序是什么?答案是有哪些??)
网站优化 • 优采云 发表了文章 • 0 个评论 • 61 次浏览 • 2021-10-20 21:00
1.HtmlUnit1.1 简介
HtmlUnit是一个用java编写的无界面浏览器,建模html文档,通过API调用页面,填写表单,点击链接等。像普通浏览器一样操作。通常用于测试和从网页中获取信息。
官方简介翻译
HtmlUnit是一个无界面浏览器Java程序。它为HTML文档建模,提供了调用页面、填写表单、单击链接等操作的API。就跟你在浏览器里做的操作一样。
HtmlUnit不错的JavaScript支持(不断改进),甚至可以使用相当复杂的AJAX库,根据配置的不同模拟Chrome、Firefox或Internet Explorer等浏览器。
HtmlUnit通常用于测试或从web站点检索信息。
1.2使用场景
对于使用java实现的网络爬虫程序,我们一般可以使用Apache的HttpClient组件来获取HTML页面信息。HttpClient实现的http请求返回的响应一般是纯文本文档页面,也就是最原创的html页面。
对于一个静态的html页面,使用httpClient就足以爬出我们需要的信息。但是对于越来越多的动态网页,更多的数据是通过异步JS代码获取和渲染的。原来的html页面不收录这部分数据。
在上图我们看到的网页中,初始文件加载完成后,红框中的数据列表是看不到的。浏览器通过执行异步JS请求,将获取到的动态数据渲染到原创文档页面,最终成为我们看到的网页。对于这部分需要JS代码执行的数据,httpClient显得力不从心。虽然我们可以拿到JS执行的请求路径,然后用java代码拿到我们需要的那部分数据,更别说从JS脚本中能不能分析出请求路径和请求参数,只分析这部分源码代码价格已经很高了。
通过上面的介绍,我们了解到目前动态网页中有很大一部分是通过异步JS请求获取,然后通过JS渲染页面的。那么我们可以做这样的假设吗,假设我们的爬虫程序模拟了一个浏览器,在获取到html页面后,像浏览器一样执行异步JS代码,在JS渲染完html页面后,就可以愉快的获取到页面上的节点信息了页面不见了。那么有没有这样的java程序呢?
答案是肯定的。
HtmlUnit就是这样一个库,用来让界面意外地展示所有异步工作。由于没有需要显示的耗时工作,HtmlUnit 加载的比实际浏览器块更多,以完成一个完整的网页。并且根据不同的配置,HtmlUnit可以模拟市面上常用的浏览器,如Chrome、Firefox、IE浏览器等。
通过HtmlUnit库,加载一个完整的Html页面(图片和视频除外),然后就可以将其转换为我们常用的字符串格式,并使用Jsoup等其他工具获取元素。当然,你也可以直接从HtmlUnit提供的对象中获取网页元素,甚至可以操作按钮、表单等控件。除了不能像可见浏览器那样使用鼠标和键盘来浏览网页之外,我们还可以使用HtmlUnit来模拟和操作所有其他操作,比如登录网站、写博客等都可以完成。当然,网页内容抓取是最简单的应用。
2.J4L2.1官方简介
J4L OCR 工具是一组可用于在 Java 应用程序中收录 OCR 功能的组件。这意味着您可以接收传真、PDF 文件或扫描文档并从图像中提取业务信息。主要的3个组件是:
j4l工具的详细使用步骤请参考这篇文章文章:Java使用J4L识别验证码
本文文章主要介绍使用HtmlUnit模拟登录
3.实际案例3.1.场景
一个登录页面,包括一个表单,需要填写用户名、登录密码和验证码才能实现用户登录。
3.2 操作步骤
使用htmlunit模拟登录是一个获取登录页面->找到输入框->填写用户名和密码->填写验证码->模拟点击登录的过程。
4.实现代码4.1maven引入HtmlUnit依赖
net.sourceforge.htmlunit
htmlunit
2.18
4.2 主要方法
登录.java
public static void main(String[] args) throws Exception {
login();
}
public static void login() throws Exception {
WebClient webClient = new WebClient(BrowserVersion.CHROME);//设置浏览器内核
webClient.getOptions().setJavaScriptEnabled(true);// js是否可用
webClient.getOptions().setCssEnabled(true);//css 一般设置false因为影响运行速度
webClient.getOptions().setThrowExceptionOnScriptError(false);//设置js抛出异常:false
webClient.getOptions().setActiveXNative(false);
//ajax
webClient.setAjaxController(new NicelyResynchronizingAjaxController());
webClient.getOptions().setUseInsecureSSL(false);
//允许重定向
webClient.getOptions().setRedirectEnabled(true);
//连接超时
webClient.getOptions().setTimeout(5000);
//js执行超时
webClient.setJavaScriptTimeout(10000 * 3);
//允许cookie
webClient.getCookieManager().setCookiesEnabled(true);
String url = "http://hrportalneu.cs/HRPortal ... 3B%3B
HtmlPage page = webClient.getPage(url);
webClient.waitForBackgroundJavaScript(5000);
HtmlPage newPage;
newPage = readyPage(page, webClient, "btnCheckIn1");
System.out.println("url----------------" + newPage.getUrl());
System.out.println("Login执行后页面:" + newPage.asXml());
IOUtils.write(newPage.asXml().getBytes(), new FileWriter(new File("D:/checkIn.txt")));
if (!newPage.asXml().contains("登录成功")) {
login();
}
webClient.close();
}
public static HtmlPage readyPage(HtmlPage page, WebClient webClient, String type) throws Exception {
//封装页面元素
HtmlForm form = page.getHtmlElementById("form1");
HtmlTextInput tbxUsername = form.getInputByName("tbxUsername");
tbxUsername.setValueAttribute("用户名*******");
HtmlPasswordInput tbxPassword = form.getInputByName("tbxPassword");
tbxPassword.setValueAttribute("密码*******");
//获取验证码图片
HtmlImage verify_img = (HtmlImage) page.getElementById("AuthCode1$codeText$img");
File file = new File("D:\\" + "check" + ".png");
//保存验证码图片
verify_img.saveAs(file);
System.out.println("验证码图片已保存!");
//保存路径
String filePath = file.getPath();
//裁剪验证码 这里使用原始的图片文件识别成功率不高 可以先进行裁剪
ImageUtil.cutImage(filePath, 1, 1, 96, 34);
//自动识别验证码
OCRFacade facade = new OCRFacade();
//识别验证码
String code = facade.recognizeFile(filePath, "eng");
//处理字符串
code = code.replaceAll(" ", "");
code = code.replaceAll("\\n", "");
System.out.println("验证码:" + code);
//定位验证码输入框
HtmlTextInput verify_code = form.getInputByName("AuthCode1$codeText");
//填入自动识别出来的验证码
verify_code.setValueAttribute(code);
System.out.println("原始页面:" + page.asXml());
HtmlPage newPage = null;
//操作按钮
if (type.equals("btnCheckIn1")) {
DomElement btnCheckIn1 = page.getElementById("btnCheckIn1");
System.out.println("doCheckIn");
newPage = btnCheckIn1.click();
}
//等待js加载
webClient.waitForBackgroundJavaScript(5000);
return newPage;
}
图像实用程序
public class ImageUtil {
public static void cutImage(String filePath, int x, int y, int w, int h)
throws Exception {
// 首先通过ImageIo中的方法,创建一个Image + InputStream到内存
ImageInputStream iis = ImageIO
.createImageInputStream(new FileInputStream(filePath));
// 再按照指定格式构造一个Reader(Reader不能new的)
Iterator it = ImageIO.getImageReadersByFormatName("gif");
ImageReader imagereader = (ImageReader) it.next();
// 再通过ImageReader绑定 InputStream
imagereader.setInput(iis);
// 设置感兴趣的源区域。
ImageReadParam par = imagereader.getDefaultReadParam();
par.setSourceRegion(new Rectangle(x, y, w, h));
// 从 reader得到BufferImage
BufferedImage bi = imagereader.read(0, par);
// 将BuffeerImage写出通过ImageIO
ImageIO.write(bi, "png", new File(filePath));
}
}
在控制台中,查看执行登录后的页面,查看是否登录成功。 查看全部
htmlunit 抓取网页(的java程序是什么?答案是有哪些??)
1.HtmlUnit1.1 简介
HtmlUnit是一个用java编写的无界面浏览器,建模html文档,通过API调用页面,填写表单,点击链接等。像普通浏览器一样操作。通常用于测试和从网页中获取信息。
官方简介翻译
HtmlUnit是一个无界面浏览器Java程序。它为HTML文档建模,提供了调用页面、填写表单、单击链接等操作的API。就跟你在浏览器里做的操作一样。
HtmlUnit不错的JavaScript支持(不断改进),甚至可以使用相当复杂的AJAX库,根据配置的不同模拟Chrome、Firefox或Internet Explorer等浏览器。
HtmlUnit通常用于测试或从web站点检索信息。
1.2使用场景
对于使用java实现的网络爬虫程序,我们一般可以使用Apache的HttpClient组件来获取HTML页面信息。HttpClient实现的http请求返回的响应一般是纯文本文档页面,也就是最原创的html页面。
对于一个静态的html页面,使用httpClient就足以爬出我们需要的信息。但是对于越来越多的动态网页,更多的数据是通过异步JS代码获取和渲染的。原来的html页面不收录这部分数据。
在上图我们看到的网页中,初始文件加载完成后,红框中的数据列表是看不到的。浏览器通过执行异步JS请求,将获取到的动态数据渲染到原创文档页面,最终成为我们看到的网页。对于这部分需要JS代码执行的数据,httpClient显得力不从心。虽然我们可以拿到JS执行的请求路径,然后用java代码拿到我们需要的那部分数据,更别说从JS脚本中能不能分析出请求路径和请求参数,只分析这部分源码代码价格已经很高了。
通过上面的介绍,我们了解到目前动态网页中有很大一部分是通过异步JS请求获取,然后通过JS渲染页面的。那么我们可以做这样的假设吗,假设我们的爬虫程序模拟了一个浏览器,在获取到html页面后,像浏览器一样执行异步JS代码,在JS渲染完html页面后,就可以愉快的获取到页面上的节点信息了页面不见了。那么有没有这样的java程序呢?
答案是肯定的。
HtmlUnit就是这样一个库,用来让界面意外地展示所有异步工作。由于没有需要显示的耗时工作,HtmlUnit 加载的比实际浏览器块更多,以完成一个完整的网页。并且根据不同的配置,HtmlUnit可以模拟市面上常用的浏览器,如Chrome、Firefox、IE浏览器等。
通过HtmlUnit库,加载一个完整的Html页面(图片和视频除外),然后就可以将其转换为我们常用的字符串格式,并使用Jsoup等其他工具获取元素。当然,你也可以直接从HtmlUnit提供的对象中获取网页元素,甚至可以操作按钮、表单等控件。除了不能像可见浏览器那样使用鼠标和键盘来浏览网页之外,我们还可以使用HtmlUnit来模拟和操作所有其他操作,比如登录网站、写博客等都可以完成。当然,网页内容抓取是最简单的应用。
2.J4L2.1官方简介
J4L OCR 工具是一组可用于在 Java 应用程序中收录 OCR 功能的组件。这意味着您可以接收传真、PDF 文件或扫描文档并从图像中提取业务信息。主要的3个组件是:
j4l工具的详细使用步骤请参考这篇文章文章:Java使用J4L识别验证码
本文文章主要介绍使用HtmlUnit模拟登录
3.实际案例3.1.场景
一个登录页面,包括一个表单,需要填写用户名、登录密码和验证码才能实现用户登录。
3.2 操作步骤
使用htmlunit模拟登录是一个获取登录页面->找到输入框->填写用户名和密码->填写验证码->模拟点击登录的过程。
4.实现代码4.1maven引入HtmlUnit依赖
net.sourceforge.htmlunit
htmlunit
2.18
4.2 主要方法
登录.java
public static void main(String[] args) throws Exception {
login();
}
public static void login() throws Exception {
WebClient webClient = new WebClient(BrowserVersion.CHROME);//设置浏览器内核
webClient.getOptions().setJavaScriptEnabled(true);// js是否可用
webClient.getOptions().setCssEnabled(true);//css 一般设置false因为影响运行速度
webClient.getOptions().setThrowExceptionOnScriptError(false);//设置js抛出异常:false
webClient.getOptions().setActiveXNative(false);
//ajax
webClient.setAjaxController(new NicelyResynchronizingAjaxController());
webClient.getOptions().setUseInsecureSSL(false);
//允许重定向
webClient.getOptions().setRedirectEnabled(true);
//连接超时
webClient.getOptions().setTimeout(5000);
//js执行超时
webClient.setJavaScriptTimeout(10000 * 3);
//允许cookie
webClient.getCookieManager().setCookiesEnabled(true);
String url = "http://hrportalneu.cs/HRPortal ... 3B%3B
HtmlPage page = webClient.getPage(url);
webClient.waitForBackgroundJavaScript(5000);
HtmlPage newPage;
newPage = readyPage(page, webClient, "btnCheckIn1");
System.out.println("url----------------" + newPage.getUrl());
System.out.println("Login执行后页面:" + newPage.asXml());
IOUtils.write(newPage.asXml().getBytes(), new FileWriter(new File("D:/checkIn.txt")));
if (!newPage.asXml().contains("登录成功")) {
login();
}
webClient.close();
}
public static HtmlPage readyPage(HtmlPage page, WebClient webClient, String type) throws Exception {
//封装页面元素
HtmlForm form = page.getHtmlElementById("form1");
HtmlTextInput tbxUsername = form.getInputByName("tbxUsername");
tbxUsername.setValueAttribute("用户名*******");
HtmlPasswordInput tbxPassword = form.getInputByName("tbxPassword");
tbxPassword.setValueAttribute("密码*******");
//获取验证码图片
HtmlImage verify_img = (HtmlImage) page.getElementById("AuthCode1$codeText$img");
File file = new File("D:\\" + "check" + ".png");
//保存验证码图片
verify_img.saveAs(file);
System.out.println("验证码图片已保存!");
//保存路径
String filePath = file.getPath();
//裁剪验证码 这里使用原始的图片文件识别成功率不高 可以先进行裁剪
ImageUtil.cutImage(filePath, 1, 1, 96, 34);
//自动识别验证码
OCRFacade facade = new OCRFacade();
//识别验证码
String code = facade.recognizeFile(filePath, "eng");
//处理字符串
code = code.replaceAll(" ", "");
code = code.replaceAll("\\n", "");
System.out.println("验证码:" + code);
//定位验证码输入框
HtmlTextInput verify_code = form.getInputByName("AuthCode1$codeText");
//填入自动识别出来的验证码
verify_code.setValueAttribute(code);
System.out.println("原始页面:" + page.asXml());
HtmlPage newPage = null;
//操作按钮
if (type.equals("btnCheckIn1")) {
DomElement btnCheckIn1 = page.getElementById("btnCheckIn1");
System.out.println("doCheckIn");
newPage = btnCheckIn1.click();
}
//等待js加载
webClient.waitForBackgroundJavaScript(5000);
return newPage;
}
图像实用程序
public class ImageUtil {
public static void cutImage(String filePath, int x, int y, int w, int h)
throws Exception {
// 首先通过ImageIo中的方法,创建一个Image + InputStream到内存
ImageInputStream iis = ImageIO
.createImageInputStream(new FileInputStream(filePath));
// 再按照指定格式构造一个Reader(Reader不能new的)
Iterator it = ImageIO.getImageReadersByFormatName("gif");
ImageReader imagereader = (ImageReader) it.next();
// 再通过ImageReader绑定 InputStream
imagereader.setInput(iis);
// 设置感兴趣的源区域。
ImageReadParam par = imagereader.getDefaultReadParam();
par.setSourceRegion(new Rectangle(x, y, w, h));
// 从 reader得到BufferImage
BufferedImage bi = imagereader.read(0, par);
// 将BuffeerImage写出通过ImageIO
ImageIO.write(bi, "png", new File(filePath));
}
}
在控制台中,查看执行登录后的页面,查看是否登录成功。
htmlunit 抓取网页(1.maven依赖引入2.Java代码3.其他功能总结(组图))
网站优化 • 优采云 发表了文章 • 0 个评论 • 99 次浏览 • 2021-10-17 18:20
通常,我们使用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/ ... 6quot;);
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/ ... 6quot;);
System.out.println(page.asXml());
webClient.close();
}
}
3.其他功能
总结
PhantomJS 和 HtmlUnit 都模拟了浏览器页面生成功能。PhantomJS 是一个非接口的 WebKit。渲染页面的功能非常齐全,并且有浏览器截图功能,可以模拟登录操作。HtmlUnit 使用 Rhino 引擎解析 Js。有时解析速度很慢。就像上面的例子一样,需要很长时间,但是HtmlUnit可以获取页面并解析一组元素(当然最好使用Jsoup来解析元素)。不错的工具。
HtmlUnit遇到错误后,处理前后相差7分钟。可能是我不使用QAQ
欢迎补充:) 查看全部
htmlunit 抓取网页(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/ ... 6quot;);
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/ ... 6quot;);
System.out.println(page.asXml());
webClient.close();
}
}
3.其他功能
总结
PhantomJS 和 HtmlUnit 都模拟了浏览器页面生成功能。PhantomJS 是一个非接口的 WebKit。渲染页面的功能非常齐全,并且有浏览器截图功能,可以模拟登录操作。HtmlUnit 使用 Rhino 引擎解析 Js。有时解析速度很慢。就像上面的例子一样,需要很长时间,但是HtmlUnit可以获取页面并解析一组元素(当然最好使用Jsoup来解析元素)。不错的工具。
HtmlUnit遇到错误后,处理前后相差7分钟。可能是我不使用QAQ

欢迎补充:)
htmlunit 抓取网页(使用本文中推荐的开源工具——HtmlUnit,一款能够模拟浏览器的抓包神器!)
网站优化 • 优采云 发表了文章 • 0 个评论 • 72 次浏览 • 2021-10-15 08:02
之前一峰写过一篇关于使用Jsoup爬取网页内容的文章文章:
[Jsoup] HTML解析器,轻松访问网页内容
Jsoup提供的api非常方便,完全类似于JQuery操作,轻松抓取网页数据。但是像Jsoup这样的普通爬虫工具的缺点是无法处理js生成的内容。
做过Html开发的都知道,现在很多网站都大量使用ajax和JavaScript来获取和处理数据,普通的爬虫工具已经无法处理js中的内容了。
比如我们在本地新建一个测试web文件text.html,源码如下:
main.html
a {
line-height: 30px;
margin: 20px;
}
var datas = [ {
href : "http://www.jianshu.com/p/8d8edf25850d",
title : "推荐一款编程字体,让代码看着更美"
}, {
href : "http://www.jianshu.com/p/153d9f31288d",
title : "Android 利用Camera实现中轴3D卡牌翻转效果"
}, {
href : "http://www.jianshu.com/p/d6fb0c9c9c26",
title : "【Eclipse】挖掘专属最有用的快捷键组合"
}, {
href : "http://www.jianshu.com/p/72d69b49d135",
title : "【IIS】Windows下利用IIS建立网站并实现局域网共享"
} ];
window.onload = function() {
var infos = document.getElementById("infos");
for( var i = 0 ; i < datas.length ; i++)
{
var a = document.createElement("a");
a.href = datas[i].href ;
a.innerText = datas[i].title;
infos.appendChild(a);
infos.appendChild(document.createElement("br"))
}
}
HtmlUnit 测试网页内容!
通过IIS发布本地网站(参考易峰之前写的文章:
【IIS】Windows下,使用IIS建立网站,实现局域网共享),
网页在浏览器中显示的效果如下:
网页展示效果.jpg
虽然通过网页评论元素可以看到body收录了网页显示中的文本内容:
网络评论元素.jpg
但是,它根本无法通过 Jsoup 工具使用!从网页源码中可以看出,我们需要抓取的内容是在页面显示后通过ajax和JavaScript加载的。
那么该怎么办?使用本文推荐的开源工具——HtmlUnit,一款可以模拟浏览器的抓包神器!
在官网下载对应的jar包,添加到工程项目的lib中。简单的测试代码如下:
import java.io.IOException;
import java.net.MalformedURLException;
import java.text.ParseException;
import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.DomElement;
import com.gargoylesoftware.htmlunit.html.DomNodeList;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
/**
* @author 亦枫
* @created_time 2016年1月12日
* @file_user_todo Java测试类
* @blog http://www.jianshu.com/users/1 ... icles
*/
public class JavaTest {
/**
* 入口函数
* @param args
* @throws ParseException
*/
public static void main(String[] args) throws ParseException {
try {
WebClient webClient = new WebClient(BrowserVersion.CHROME);
HtmlPage htmlPage = (HtmlPage) webClient.getPage("http://localhost/test.html");
DomNodeList domNodeList = htmlPage.getElementsByTagName("a");
for (int i = 0; i < domNodeList.size(); i++) {
DomElement domElement = (DomElement) domNodeList.get(i);
System.out.println(domElement.asText());
}
webClient.close();
} catch (FailingHttpStatusCodeException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
运行后,控制台打印结果:
HtmlUnit 测试结果.jpg
可见HtmlUnit可以抓取AJAX和JavaScript加载的内容。
HtmlUnit的介绍在官网上很详细。以下内容为易峰翻译的部分内容,供大家参考:
HtmlUnit 是一个基于 Java 的浏览器程序,没有图形界面。它可以调用 HTML 文档并提供 API,使开发人员可以像在普通浏览器上操作一样访问 Web 内容、填写表单、单击超链接等。
它可以很好地支持 JavaScript,并且仍在改进中。同时,它可以解析非常复杂的AJAX库,模拟不同配置下的Chrome、Firefox和IE浏览器。
HtmlUnit 通常用于测试目的和检索 网站 信息。
HtmlUnit 提供了很多用于测试网络请求和抓取网页内容的功能。可以到官网或者其他网站学习使用。 查看全部
htmlunit 抓取网页(使用本文中推荐的开源工具——HtmlUnit,一款能够模拟浏览器的抓包神器!)
之前一峰写过一篇关于使用Jsoup爬取网页内容的文章文章:
[Jsoup] HTML解析器,轻松访问网页内容
Jsoup提供的api非常方便,完全类似于JQuery操作,轻松抓取网页数据。但是像Jsoup这样的普通爬虫工具的缺点是无法处理js生成的内容。
做过Html开发的都知道,现在很多网站都大量使用ajax和JavaScript来获取和处理数据,普通的爬虫工具已经无法处理js中的内容了。
比如我们在本地新建一个测试web文件text.html,源码如下:
main.html
a {
line-height: 30px;
margin: 20px;
}
var datas = [ {
href : "http://www.jianshu.com/p/8d8edf25850d",
title : "推荐一款编程字体,让代码看着更美"
}, {
href : "http://www.jianshu.com/p/153d9f31288d",
title : "Android 利用Camera实现中轴3D卡牌翻转效果"
}, {
href : "http://www.jianshu.com/p/d6fb0c9c9c26",
title : "【Eclipse】挖掘专属最有用的快捷键组合"
}, {
href : "http://www.jianshu.com/p/72d69b49d135",
title : "【IIS】Windows下利用IIS建立网站并实现局域网共享"
} ];
window.onload = function() {
var infos = document.getElementById("infos");
for( var i = 0 ; i < datas.length ; i++)
{
var a = document.createElement("a");
a.href = datas[i].href ;
a.innerText = datas[i].title;
infos.appendChild(a);
infos.appendChild(document.createElement("br"))
}
}
HtmlUnit 测试网页内容!
通过IIS发布本地网站(参考易峰之前写的文章:
【IIS】Windows下,使用IIS建立网站,实现局域网共享),
网页在浏览器中显示的效果如下:
网页展示效果.jpg
虽然通过网页评论元素可以看到body收录了网页显示中的文本内容:
网络评论元素.jpg
但是,它根本无法通过 Jsoup 工具使用!从网页源码中可以看出,我们需要抓取的内容是在页面显示后通过ajax和JavaScript加载的。
那么该怎么办?使用本文推荐的开源工具——HtmlUnit,一款可以模拟浏览器的抓包神器!
在官网下载对应的jar包,添加到工程项目的lib中。简单的测试代码如下:
import java.io.IOException;
import java.net.MalformedURLException;
import java.text.ParseException;
import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.DomElement;
import com.gargoylesoftware.htmlunit.html.DomNodeList;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
/**
* @author 亦枫
* @created_time 2016年1月12日
* @file_user_todo Java测试类
* @blog http://www.jianshu.com/users/1 ... icles
*/
public class JavaTest {
/**
* 入口函数
* @param args
* @throws ParseException
*/
public static void main(String[] args) throws ParseException {
try {
WebClient webClient = new WebClient(BrowserVersion.CHROME);
HtmlPage htmlPage = (HtmlPage) webClient.getPage("http://localhost/test.html");
DomNodeList domNodeList = htmlPage.getElementsByTagName("a");
for (int i = 0; i < domNodeList.size(); i++) {
DomElement domElement = (DomElement) domNodeList.get(i);
System.out.println(domElement.asText());
}
webClient.close();
} catch (FailingHttpStatusCodeException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
运行后,控制台打印结果:
HtmlUnit 测试结果.jpg
可见HtmlUnit可以抓取AJAX和JavaScript加载的内容。
HtmlUnit的介绍在官网上很详细。以下内容为易峰翻译的部分内容,供大家参考:
HtmlUnit 是一个基于 Java 的浏览器程序,没有图形界面。它可以调用 HTML 文档并提供 API,使开发人员可以像在普通浏览器上操作一样访问 Web 内容、填写表单、单击超链接等。
它可以很好地支持 JavaScript,并且仍在改进中。同时,它可以解析非常复杂的AJAX库,模拟不同配置下的Chrome、Firefox和IE浏览器。
HtmlUnit 通常用于测试目的和检索 网站 信息。
HtmlUnit 提供了很多用于测试网络请求和抓取网页内容的功能。可以到官网或者其他网站学习使用。
htmlunit 抓取网页(1.maven依赖引入2.Java代码3.其他功能总结(组图))
网站优化 • 优采云 发表了文章 • 0 个评论 • 56 次浏览 • 2021-10-13 16:27
通常我们使用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/ ... 6quot;);
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/ ... 6quot;);
System.out.println(page.asXml());
webClient.close();
}
}
3.其他功能
总结
PhantomJS 和 HtmlUnit 都模拟了浏览器页面生成功能。PhantomJS 是一个非接口的 WebKit。渲染页面的功能非常齐全,并且有浏览器截图功能,可以模拟登录操作。HtmlUnit 使用 Rhino 引擎解析 Js。有时解析速度很慢。就像上面的例子一样,需要很长时间,但是HtmlUnit可以获取页面并解析一组元素。(当然最好用Jsoup来解析元素)。不错的工具。
HtmlUnit遇到错误后,处理前后相差7分钟。可能是我不使用QAQ
欢迎补充:) 查看全部
htmlunit 抓取网页(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/ ... 6quot;);
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/ ... 6quot;);
System.out.println(page.asXml());
webClient.close();
}
}
3.其他功能
总结
PhantomJS 和 HtmlUnit 都模拟了浏览器页面生成功能。PhantomJS 是一个非接口的 WebKit。渲染页面的功能非常齐全,并且有浏览器截图功能,可以模拟登录操作。HtmlUnit 使用 Rhino 引擎解析 Js。有时解析速度很慢。就像上面的例子一样,需要很长时间,但是HtmlUnit可以获取页面并解析一组元素。(当然最好用Jsoup来解析元素)。不错的工具。
HtmlUnit遇到错误后,处理前后相差7分钟。可能是我不使用QAQ

欢迎补充:)
htmlunit 抓取网页(java编写的无界面浏览器,点赞数4219,值得推荐!)
网站优化 • 优采云 发表了文章 • 0 个评论 • 71 次浏览 • 2021-10-13 16:25
介绍本文文章主要介绍使用HtmlUnit动态获取网页数据(示例代码)及相关经验和技巧。文章约13349字,浏览量421,点赞数9,值得推荐!
1.HtmlUnit是一个用java编写的无界面浏览器,建模html文档,通过API调用页面,填写表单,点击链接等,像普通浏览器一样操作。通常用于测试和从网页中获取信息。而且HtmlUnit兼有HttpClient和soup的功能,但是速度比较慢,但是如果取消它解析css和js的功能,速度会有所提升,默认开启。
2. 这里选择HtmlUnit爬取数据的主要目的是为了获取他的js和css。
3.主要代码如下
package com.los;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.DomElement;
import com.gargoylesoftware.htmlunit.html.DomNodeList;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import com.los.util.DownlandPic;
import java.io.IOException;
import java.util.regex.Pattern;
public class HtmlUnitTest {
public static void main(String[] args) throws IOException {
DownlandPic dd = new DownlandPic();
WebClient webClient = new WebClient();//实例化web客户端
//http://www.bdqn.cn/ https://www.baidu.com/?tn=78000241_22_hao_pg
String url = "http://www.bdqn.cn/";
HtmlPage page = webClient.getPage(url);
webClient.waitForBackgroundJavaScript(10000); //等侍js脚本执行完成
System.out.println(page.asXml());
DomNodeList img = page.getElementsByTagName("script");
for (int i=0;i 0) {
output.write(buffer, 0, length);
}
fileOutputStream.write(output.toByteArray());
dataInputStream.close();
fileOutputStream.close();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public static int getCharacterPosition3(String string){
//这里是获取"""符号的位置
Matcher slashMatcher = Pattern.compile(""").matcher(string);
int mIdx = 0;
while(slashMatcher.find()) {
mIdx++;
//当"/"符号第三次出现的位置
if(mIdx == 2){
break;
}
}
return slashMatcher.start();
}
public static int getCharacterPosition4(String string){
//这里是获取"""符号的位置
Matcher slashMatcher = Pattern.compile(""").matcher(string);
int mIdx = 0;
while(slashMatcher.find()) {
mIdx++;
//当"/"符号第三次出现的位置
if(mIdx == 3){
break;
}
}
return slashMatcher.start();
}
public static void main(String[] args) {
String content = "/img/newImg/news2.jpg";
System.out.println(getCharacterPosition3(content));
System.out.println(getCharacterPosition4(content));
String substring = content.substring(getCharacterPosition3(content), getCharacterPosition4(content));
System.out.println(substring);
}
}
3.因为这里的网页中的图片地址是相对路径,所以下载的时候在下载地址中找到了页面的绝对路径并拼接。下载的路径必须与抓取后存储在本地页面的image标签中的地址相对应,否则找不到。
3.匹配时写2和3的原因”是根据这里爬取的数据
4.与其他爬取网页的方式相比,这可能更简单,但更容易展示效果。如有错误,请指教。至于页面,则不会显示,涉及隐私。
5.学习HtmlUnit请参考:地址 查看全部
htmlunit 抓取网页(java编写的无界面浏览器,点赞数4219,值得推荐!)
介绍本文文章主要介绍使用HtmlUnit动态获取网页数据(示例代码)及相关经验和技巧。文章约13349字,浏览量421,点赞数9,值得推荐!
1.HtmlUnit是一个用java编写的无界面浏览器,建模html文档,通过API调用页面,填写表单,点击链接等,像普通浏览器一样操作。通常用于测试和从网页中获取信息。而且HtmlUnit兼有HttpClient和soup的功能,但是速度比较慢,但是如果取消它解析css和js的功能,速度会有所提升,默认开启。
2. 这里选择HtmlUnit爬取数据的主要目的是为了获取他的js和css。
3.主要代码如下
package com.los;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.DomElement;
import com.gargoylesoftware.htmlunit.html.DomNodeList;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import com.los.util.DownlandPic;
import java.io.IOException;
import java.util.regex.Pattern;
public class HtmlUnitTest {
public static void main(String[] args) throws IOException {
DownlandPic dd = new DownlandPic();
WebClient webClient = new WebClient();//实例化web客户端
//http://www.bdqn.cn/ https://www.baidu.com/?tn=78000241_22_hao_pg
String url = "http://www.bdqn.cn/";
HtmlPage page = webClient.getPage(url);
webClient.waitForBackgroundJavaScript(10000); //等侍js脚本执行完成
System.out.println(page.asXml());
DomNodeList img = page.getElementsByTagName("script");
for (int i=0;i 0) {
output.write(buffer, 0, length);
}
fileOutputStream.write(output.toByteArray());
dataInputStream.close();
fileOutputStream.close();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public static int getCharacterPosition3(String string){
//这里是获取"""符号的位置
Matcher slashMatcher = Pattern.compile(""").matcher(string);
int mIdx = 0;
while(slashMatcher.find()) {
mIdx++;
//当"/"符号第三次出现的位置
if(mIdx == 2){
break;
}
}
return slashMatcher.start();
}
public static int getCharacterPosition4(String string){
//这里是获取"""符号的位置
Matcher slashMatcher = Pattern.compile(""").matcher(string);
int mIdx = 0;
while(slashMatcher.find()) {
mIdx++;
//当"/"符号第三次出现的位置
if(mIdx == 3){
break;
}
}
return slashMatcher.start();
}
public static void main(String[] args) {
String content = "/img/newImg/news2.jpg";
System.out.println(getCharacterPosition3(content));
System.out.println(getCharacterPosition4(content));
String substring = content.substring(getCharacterPosition3(content), getCharacterPosition4(content));
System.out.println(substring);
}
}
3.因为这里的网页中的图片地址是相对路径,所以下载的时候在下载地址中找到了页面的绝对路径并拼接。下载的路径必须与抓取后存储在本地页面的image标签中的地址相对应,否则找不到。
3.匹配时写2和3的原因”是根据这里爬取的数据

4.与其他爬取网页的方式相比,这可能更简单,但更容易展示效果。如有错误,请指教。至于页面,则不会显示,涉及隐私。
5.学习HtmlUnit请参考:地址
htmlunit 抓取网页(1.HtmlUnit的学习方法是什么?怎么样?HtmlUnit)
网站优化 • 优采云 发表了文章 • 0 个评论 • 114 次浏览 • 2021-10-13 03:28
1.HtmlUnit是一个用java编写的无界面浏览器,建模html文档,通过API调用页面,填写表单,点击链接等,像普通浏览器一样操作。通常用于测试和从网页中获取信息。而且HtmlUnit兼有HttpClient和soup的功能,但是速度比较慢,但是如果取消它解析css和js的功能,速度会有所提升,默认开启。
2. 这里选择HtmlUnit爬取数据的主要目的是为了获取他的js和css。
3.主要代码如下
package com.los;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.DomElement;
import com.gargoylesoftware.htmlunit.html.DomNodeList;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import com.los.util.DownlandPic;
import java.io.IOException;
import java.util.regex.Pattern;
public class HtmlUnitTest {
public static void main(String[] args) throws IOException {
DownlandPic dd = new DownlandPic();
WebClient webClient = new WebClient();//实例化web客户端
//http://www.bdqn.cn/ https://www.baidu.com/?tn=78000241_22_hao_pg
String url = "http://www.bdqn.cn/";
HtmlPage page = webClient.getPage(url);
webClient.waitForBackgroundJavaScript(10000); //等侍js脚本执行完成
System.out.println(page.asXml());
DomNodeList img = page.getElementsByTagName("script");
for (int i=0;i 0) {
output.write(buffer, 0, length);
}
fileOutputStream.write(output.toByteArray());
dataInputStream.close();
fileOutputStream.close();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public static int getCharacterPosition3(String string){
//这里是获取"\""符号的位置
Matcher slashMatcher = Pattern.compile("\"").matcher(string);
int mIdx = 0;
while(slashMatcher.find()) {
mIdx++;
//当"/"符号第三次出现的位置
if(mIdx == 2){
break;
}
}
return slashMatcher.start();
}
public static int getCharacterPosition4(String string){
//这里是获取"\""符号的位置
Matcher slashMatcher = Pattern.compile("\"").matcher(string);
int mIdx = 0;
while(slashMatcher.find()) {
mIdx++;
//当"/"符号第三次出现的位置
if(mIdx == 3){
break;
}
}
return slashMatcher.start();
}
public static void main(String[] args) {
String content = "<img class=\"lazy\" data-original=\"/img/newImg/news_img2.jpg\" src=\"/img/newImg/news2.jpg\" style=\"display: block;\"/>";
System.out.println(getCharacterPosition3(content));
System.out.println(getCharacterPosition4(content));
String substring = content.substring(getCharacterPosition3(content), getCharacterPosition4(content));
System.out.println(substring);
}
}
3.因为这里的网页中的图片地址是相对路径,所以下载的时候在下载地址中找到了页面的绝对路径并拼接。下载的路径必须与抓取后存储在本地页面的image标签中的地址相对应,否则找不到。
3.匹配时写2和3的原因”是根据这里爬取的数据
4.与其他爬取网页的方式相比,这可能更简单,但更容易展示效果。如有错误,请指教。至于页面,则不会显示,涉及隐私。
5.学习HtmlUnit请参考:地址 查看全部
htmlunit 抓取网页(1.HtmlUnit的学习方法是什么?怎么样?HtmlUnit)
1.HtmlUnit是一个用java编写的无界面浏览器,建模html文档,通过API调用页面,填写表单,点击链接等,像普通浏览器一样操作。通常用于测试和从网页中获取信息。而且HtmlUnit兼有HttpClient和soup的功能,但是速度比较慢,但是如果取消它解析css和js的功能,速度会有所提升,默认开启。
2. 这里选择HtmlUnit爬取数据的主要目的是为了获取他的js和css。
3.主要代码如下
package com.los;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.DomElement;
import com.gargoylesoftware.htmlunit.html.DomNodeList;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import com.los.util.DownlandPic;
import java.io.IOException;
import java.util.regex.Pattern;
public class HtmlUnitTest {
public static void main(String[] args) throws IOException {
DownlandPic dd = new DownlandPic();
WebClient webClient = new WebClient();//实例化web客户端
//http://www.bdqn.cn/ https://www.baidu.com/?tn=78000241_22_hao_pg
String url = "http://www.bdqn.cn/";
HtmlPage page = webClient.getPage(url);
webClient.waitForBackgroundJavaScript(10000); //等侍js脚本执行完成
System.out.println(page.asXml());
DomNodeList img = page.getElementsByTagName("script");
for (int i=0;i 0) {
output.write(buffer, 0, length);
}
fileOutputStream.write(output.toByteArray());
dataInputStream.close();
fileOutputStream.close();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public static int getCharacterPosition3(String string){
//这里是获取"\""符号的位置
Matcher slashMatcher = Pattern.compile("\"").matcher(string);
int mIdx = 0;
while(slashMatcher.find()) {
mIdx++;
//当"/"符号第三次出现的位置
if(mIdx == 2){
break;
}
}
return slashMatcher.start();
}
public static int getCharacterPosition4(String string){
//这里是获取"\""符号的位置
Matcher slashMatcher = Pattern.compile("\"").matcher(string);
int mIdx = 0;
while(slashMatcher.find()) {
mIdx++;
//当"/"符号第三次出现的位置
if(mIdx == 3){
break;
}
}
return slashMatcher.start();
}
public static void main(String[] args) {
String content = "<img class=\"lazy\" data-original=\"/img/newImg/news_img2.jpg\" src=\"/img/newImg/news2.jpg\" style=\"display: block;\"/>";
System.out.println(getCharacterPosition3(content));
System.out.println(getCharacterPosition4(content));
String substring = content.substring(getCharacterPosition3(content), getCharacterPosition4(content));
System.out.println(substring);
}
}
3.因为这里的网页中的图片地址是相对路径,所以下载的时候在下载地址中找到了页面的绝对路径并拼接。下载的路径必须与抓取后存储在本地页面的image标签中的地址相对应,否则找不到。
3.匹配时写2和3的原因”是根据这里爬取的数据

4.与其他爬取网页的方式相比,这可能更简单,但更容易展示效果。如有错误,请指教。至于页面,则不会显示,涉及隐私。
5.学习HtmlUnit请参考:地址
htmlunit 抓取网页(1.HtmlUnit中文文档获取页面中特定的元素tips:1.)
网站优化 • 优采云 发表了文章 • 0 个评论 • 535 次浏览 • 2021-10-09 07:17
1.HtmlUnit 简介
HtmlUnit 是一个 Java 无界面浏览器库。它模拟 HTML 文档并提供相应的 API,让您可以像在“普通”浏览器中一样调用页面、填写表单、单击链接等。它有很好的 JavaScript 支持(仍在改进),甚至可以处理相当复杂的 AJAX 库,根据使用的配置模拟 Chrome、Firefox 或 Internet Explorer。它通常用于测试目的或从 网站 检索信息。
HtmlUnit 不是通用的单元测试框架。它是一种模拟浏览器以进行测试的方法,旨在用于另一个测试框架(例如 JUnit 或 TestNG)。有关介绍,请参阅文档“HtmlUnit 入门”。HtmlUnit 用作不同的开源工具,例如 Canoo WebTest、JWebUnit、WebDriver、JSFUnit、WETATOR、Celerity、Spring MVC Test HtmlUnit 作为底层“浏览器”。
HtmlUnit 最初由 Gargoyle Software 的 Mike Bowler 编写,并在 Apache 2 许可下发布。从那以后,它收到了许多其他开发者的贡献,今天也将得到他们的帮助。
几年前,在做购物网站的数据采集工作时,我偶然遇到了HtmlUnit。我记得我如何无法捕获页面上的价格数据,并且 httpfox 无法跟踪价格数据的 URL。就在我不知所措的时候,HtmlUnit出现了,帮我解决了问题。所以今天我想说声谢谢,并向大家推荐HtmlUnit。
2.htmlUnit中文文档
3.1 获取页面的 TITLE、XML 代码和文本
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.html.HtmlDivision;
import com.gargoylesoftware.htmlunit.html.HtmlAnchor;
import com.gargoylesoftware.htmlunit.*;
import com.gargoylesoftware.htmlunit.WebClientOptions;
import com.gargoylesoftware.htmlunit.html.HtmlInput;
import com.gargoylesoftware.htmlunit.html.HtmlBody;
import java.util.List;
public class helloHtmlUnit{
public static void main(String[] args) throws Exception{
String str;
//创建一个webclient
WebClient webClient = new WebClient();
//htmlunit 对css和javascript的支持不好,所以请关闭之
webClient.getOptions().setJavaScriptEnabled(false);
webClient.getOptions().setCssEnabled(false);
//获取页面
HtmlPage page = webClient.getPage("http://www.baidu.com/");
//获取页面的TITLE
str = page.getTitleText();
System.out.println(str);
//获取页面的XML代码
str = page.asXml();
System.out.println(str);
//获取页面的文本
str = page.asText();
System.out.println(str);
//关闭webclient
webClient.closeAllWindows();
}
}
3.2 使用不同版本的浏览器打开
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.html.HtmlDivision;
import com.gargoylesoftware.htmlunit.html.HtmlAnchor;
import com.gargoylesoftware.htmlunit.*;
import com.gargoylesoftware.htmlunit.WebClientOptions;
import com.gargoylesoftware.htmlunit.html.HtmlInput;
import com.gargoylesoftware.htmlunit.html.HtmlBody;
import java.util.List;
public class helloHtmlUnit{
public static void main(String[] args) throws Exception{
String str;
//使用FireFox读取网页
WebClient webClient = new WebClient(BrowserVersion.FIREFOX_24);
//htmlunit 对css和javascript的支持不好,所以请关闭之
webClient.getOptions().setJavaScriptEnabled(false);
webClient.getOptions().setCssEnabled(false);
HtmlPage page = webClient.getPage("http://www.baidu.com/");
str = page.getTitleText();
System.out.println(str);
//关闭webclient
webClient.closeAllWindows();
}
}
3.3 在页面上查找特定元素
public class helloHtmlUnit{
public static void main(String[] args) throws Exception{
//创建webclient
WebClient webClient = new WebClient(BrowserVersion.CHROME);
//htmlunit 对css和javascript的支持不好,所以请关闭之
webClient.getOptions().setJavaScriptEnabled(false);
webClient.getOptions().setCssEnabled(false);
HtmlPage page = (HtmlPage)webClient.getPage("http://www.baidu.com/");
//通过id获得"百度一下"按钮
HtmlInput btn = (HtmlInput)page.getHtmlElementById("su");
System.out.println(btn.getDefaultValue());
//关闭webclient
webClient.closeAllWindows();
}
}
提示:某些元素中没有id和name或其他节点。您可以通过查找其子节点和父节点之间的规则来获取元素。具体方法请参考:
核心代码是:
final HtmlPage nextPage = ((DomElement)(htmlpage.getElementByName("key").getParentNode().getParentNode())).getLastElementChild().click();
3.4 元素搜索
public class helloHtmlUnit{
public static void main(String[] args) throws Exception{
//创建webclient
WebClient webClient = new WebClient(BrowserVersion.CHROME);
//htmlunit 对css和javascript的支持不好,所以请关闭之
webClient.getOptions().setJavaScriptEnabled(false);
webClient.getOptions().setCssEnabled(false);
HtmlPage page = (HtmlPage)webClient.getPage("http://www.baidu.com/");
//查找所有div
List hbList = page.getByXPath("//div");
HtmlDivision hb = (HtmlDivision)hbList.get(0);
System.out.println(hb.toString());
//查找并获取特定input
List inputList = page.getByXPath("//input[@id=\'su\']");
HtmlInput input = (HtmlInput)inputList.get(0);
System.out.println(input.toString());
//关闭webclient
webClient.closeAllWindows();
}
}
3.5 提交搜索
public class helloHtmlUnit{
public static void main(String[] args) throws Exception{
//创建webclient
WebClient webClient = new WebClient(BrowserVersion.CHROME);
//htmlunit 对css和javascript的支持不好,所以请关闭之
webClient.getOptions().setJavaScriptEnabled(false);
webClient.getOptions().setCssEnabled(false);
HtmlPage page = (HtmlPage)webClient.getPage("http://www.baidu.com/");
//获取搜索输入框并提交搜索内容
HtmlInput input = (HtmlInput)page.getHtmlElementById("kw");
System.out.println(input.toString());
input.setValueAttribute("ymd");
System.out.println(input.toString());
//获取搜索按钮并点击
HtmlInput btn = (HtmlInput)page.getHtmlElementById("su");
HtmlPage page2 = btn.click();
//输出新页面的文本
System.out.println(page2.asText());
}
}
3.htmlUnit方法介绍
一、环境介绍
因为是在自己的spring boot项目中引入的,所以只是在pom文件中添加了依赖。
net.sourceforge.htmlunit
htmlunit
2.41.0
如果你只是爬一个网站 js不多,建议改下下面的依赖
net.sourceforge.htmlunit
htmlunit
2.23
后面我会讲到两者的区别。当然,如果你不是使用maven项目(没有pom),可以到官网下载源码库
二、使用
HtmlUnit使用起来非常简单,使用的时候可以去官网手册查一下语法。其实说明书只是介绍的介绍,下面听我说就够了;
1、创建客户端并配置客户端
final String url ="https:****";//大家这可以填自己爬虫的地址
WebClient webClient = new WebClient(BrowserVersion.FIREFOX_68);//创建火狐浏览器 2.23版本是FIREFOX_45 new不写参数是默认浏览器
webClient.getOptions().setCssEnabled(false);//(屏蔽)css 因为css并不影响我们抓取数据 反而影响网页渲染效率
webClient.getOptions().setThrowExceptionOnScriptError(false);//(屏蔽)异常
webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);//(屏蔽)日志
webClient.getOptions().setJavaScriptEnabled(true);//加载js脚本
webClient.getOptions().setTimeout(50000);//设置超时时间
webClient.setAjaxController(new NicelyResynchronizingAjaxController());//设置ajax
HtmlPage htmlPage = webClient.getPage(url);//将客户端获取的树形结构转化为HtmlPage
Thread.sleep(10000);//主线程休眠10秒 让客户端有时间执行js代码 也可以写成webClient.waitForBackgroundJavaScript(1000)
这里是一个等待js执行的情况,2.41.0很适合很多js情况,但是2.3总是有问题,无法刷新网页,2.4< @1.0 打印的也很详细,执行的过程也比较慢,可能会比较慢产生详细的作品
远程地址页面在此处获取。我们现在需要做的是解析dom节点并填写数据来模拟点击等事件。如果要打印 htmlPage.asText() 输出 htmlPage 节点的文本 htmlPage.asXml() 输出 htmlPage 节点的 xml 代码
2、 获取节点
建议在这个链接准备一些前端知识
HtmlUnit给出了两种获取节点的方式
XPath 查询:
更详细的xpath解释:
final HtmlPage page = webClient.getPage("http://htmlunit.sourceforge.net");
//get list of all divs
final List divs = htmlPage .getByXPath("//div");
//get div which has a \'name\' attribute of \'John\'
final HtmlDivision div = (HtmlDivision) htmlPage .getByXPath("//div[@name=\'John\']").get(0);
css 选择器:(我更喜欢它)
final DomNodeList divs = htmlPage .querySelectorAll("div");
for (DomNode div : divs) {
....
}
//get div which has the id \'breadcrumbs\'
final DomNode div = htmlPage .querySelector("div#breadcrumbs");
css 提供了一个集合查询 querySelectorAll 和一个单一查询 querySelector。如果你没有基础,我给你举个例子:
htmlPage .querySelectorAll("div") 返回 htmlPage 下的一组 div 标签
htmlPage .querySelector("div:nth-child(1)") 返回htmlPage下div的第一个div
htmlPage .querySelector(".submit") 返回htmlPage下的第一个class=submit标签
htmlPage .querySelector("#submit") 返回 htmlPage 下 id=submit 的第一个标签
htmlPage .querySelector("div.submit") 返回类为submit的htmlPage下的第一个div标签
htmlPage .querySelector("div[id='submit']") 返回htmlPage下第一个id为submit的div标签
上面的枚举方法相信已经足够了,如果还不够,可以参考css选择器
下面列出常见的html标签与HtmlUnit类的对应关系
div -> HtmlDivision
div集合 -> DomNodeList
fieldSet -> HtmlFieldSet
form -> HtmlForm
button -> HtmlButton
a -> HtmlAnchor
-> HtmlXxxInput
( -> HtmlTextInput)
table -> HtmlTable
tr -> HtmlTableRow
td -> TableDataCell
setAttribute()方法有节点的属性样式,setNodeValue()设置节点的值。你的英语一下子提高了吗?几乎所有的标签都能找到对应的类别。来看看我的实战:这是一个在线填写温度的excel文档。如果访问更改地址,他会在登录页面提示登录按钮。登录按钮,我们现在模拟打开自动登录框:
//这段代码是为了让网页的的某个按钮加载出来之后再执行下面的代码
while (htmlPage.querySelector("#header-login-btn")==null) {
synchronized (htmlPage) {
htmlPage.wait(1000);
}
}
HtmlButton login = htmlPage.querySelector("#header-login-btn");//获取到登陆按钮
if (login!=null){//如果网页上没这个按钮你还要去获取他只会得到一个空对象,所以我们用空的方式可以判断网页上是否有这个按钮
System.out.println("-----未登录测试-----");
htmlPage=login.click();//模拟按钮点击后要将网页返回回来方便动态更新数据
System.out.println(htmlPage.asText());
HtmlAnchor switcher_plogin = htmlPage.querySelector("a[id=\'switcher_plogin\']");
if (switcher_plogin!=null) {//帐号密码登录
System.out.println("-----点击了帐号密码登陆-----");
htmlPage = switcher_plogin.click();
System.out.println(htmlPage.asText());
}
}
System.out.println(htmlPage.asText());
webClient.close();
爬虫最重要的一步就是我们首先调试网页,有哪些按钮,点击哪些,设置哪些值。毕竟,我们必须用代码来安排代码。
**扩展:** 如果你想从网页中获取数据或者下载文件,HtmlUnit 解析是不够的。推荐使用 Jsoup 库,可以和 HtmlUnit 一起使用。使用起来比较方便,这里就不一一列举了。
三、实现一个小demo
注意:htmlunit引用的jar包不完整会导致奇怪的错误
使用maven方法更方便
参考: 查看全部
htmlunit 抓取网页(1.HtmlUnit中文文档获取页面中特定的元素tips:1.)
1.HtmlUnit 简介
HtmlUnit 是一个 Java 无界面浏览器库。它模拟 HTML 文档并提供相应的 API,让您可以像在“普通”浏览器中一样调用页面、填写表单、单击链接等。它有很好的 JavaScript 支持(仍在改进),甚至可以处理相当复杂的 AJAX 库,根据使用的配置模拟 Chrome、Firefox 或 Internet Explorer。它通常用于测试目的或从 网站 检索信息。
HtmlUnit 不是通用的单元测试框架。它是一种模拟浏览器以进行测试的方法,旨在用于另一个测试框架(例如 JUnit 或 TestNG)。有关介绍,请参阅文档“HtmlUnit 入门”。HtmlUnit 用作不同的开源工具,例如 Canoo WebTest、JWebUnit、WebDriver、JSFUnit、WETATOR、Celerity、Spring MVC Test HtmlUnit 作为底层“浏览器”。
HtmlUnit 最初由 Gargoyle Software 的 Mike Bowler 编写,并在 Apache 2 许可下发布。从那以后,它收到了许多其他开发者的贡献,今天也将得到他们的帮助。
几年前,在做购物网站的数据采集工作时,我偶然遇到了HtmlUnit。我记得我如何无法捕获页面上的价格数据,并且 httpfox 无法跟踪价格数据的 URL。就在我不知所措的时候,HtmlUnit出现了,帮我解决了问题。所以今天我想说声谢谢,并向大家推荐HtmlUnit。
2.htmlUnit中文文档
3.1 获取页面的 TITLE、XML 代码和文本
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.html.HtmlDivision;
import com.gargoylesoftware.htmlunit.html.HtmlAnchor;
import com.gargoylesoftware.htmlunit.*;
import com.gargoylesoftware.htmlunit.WebClientOptions;
import com.gargoylesoftware.htmlunit.html.HtmlInput;
import com.gargoylesoftware.htmlunit.html.HtmlBody;
import java.util.List;
public class helloHtmlUnit{
public static void main(String[] args) throws Exception{
String str;
//创建一个webclient
WebClient webClient = new WebClient();
//htmlunit 对css和javascript的支持不好,所以请关闭之
webClient.getOptions().setJavaScriptEnabled(false);
webClient.getOptions().setCssEnabled(false);
//获取页面
HtmlPage page = webClient.getPage("http://www.baidu.com/");
//获取页面的TITLE
str = page.getTitleText();
System.out.println(str);
//获取页面的XML代码
str = page.asXml();
System.out.println(str);
//获取页面的文本
str = page.asText();
System.out.println(str);
//关闭webclient
webClient.closeAllWindows();
}
}
3.2 使用不同版本的浏览器打开
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.html.HtmlDivision;
import com.gargoylesoftware.htmlunit.html.HtmlAnchor;
import com.gargoylesoftware.htmlunit.*;
import com.gargoylesoftware.htmlunit.WebClientOptions;
import com.gargoylesoftware.htmlunit.html.HtmlInput;
import com.gargoylesoftware.htmlunit.html.HtmlBody;
import java.util.List;
public class helloHtmlUnit{
public static void main(String[] args) throws Exception{
String str;
//使用FireFox读取网页
WebClient webClient = new WebClient(BrowserVersion.FIREFOX_24);
//htmlunit 对css和javascript的支持不好,所以请关闭之
webClient.getOptions().setJavaScriptEnabled(false);
webClient.getOptions().setCssEnabled(false);
HtmlPage page = webClient.getPage("http://www.baidu.com/");
str = page.getTitleText();
System.out.println(str);
//关闭webclient
webClient.closeAllWindows();
}
}
3.3 在页面上查找特定元素
public class helloHtmlUnit{
public static void main(String[] args) throws Exception{
//创建webclient
WebClient webClient = new WebClient(BrowserVersion.CHROME);
//htmlunit 对css和javascript的支持不好,所以请关闭之
webClient.getOptions().setJavaScriptEnabled(false);
webClient.getOptions().setCssEnabled(false);
HtmlPage page = (HtmlPage)webClient.getPage("http://www.baidu.com/");
//通过id获得"百度一下"按钮
HtmlInput btn = (HtmlInput)page.getHtmlElementById("su");
System.out.println(btn.getDefaultValue());
//关闭webclient
webClient.closeAllWindows();
}
}
提示:某些元素中没有id和name或其他节点。您可以通过查找其子节点和父节点之间的规则来获取元素。具体方法请参考:
核心代码是:
final HtmlPage nextPage = ((DomElement)(htmlpage.getElementByName("key").getParentNode().getParentNode())).getLastElementChild().click();
3.4 元素搜索
public class helloHtmlUnit{
public static void main(String[] args) throws Exception{
//创建webclient
WebClient webClient = new WebClient(BrowserVersion.CHROME);
//htmlunit 对css和javascript的支持不好,所以请关闭之
webClient.getOptions().setJavaScriptEnabled(false);
webClient.getOptions().setCssEnabled(false);
HtmlPage page = (HtmlPage)webClient.getPage("http://www.baidu.com/");
//查找所有div
List hbList = page.getByXPath("//div");
HtmlDivision hb = (HtmlDivision)hbList.get(0);
System.out.println(hb.toString());
//查找并获取特定input
List inputList = page.getByXPath("//input[@id=\'su\']");
HtmlInput input = (HtmlInput)inputList.get(0);
System.out.println(input.toString());
//关闭webclient
webClient.closeAllWindows();
}
}
3.5 提交搜索
public class helloHtmlUnit{
public static void main(String[] args) throws Exception{
//创建webclient
WebClient webClient = new WebClient(BrowserVersion.CHROME);
//htmlunit 对css和javascript的支持不好,所以请关闭之
webClient.getOptions().setJavaScriptEnabled(false);
webClient.getOptions().setCssEnabled(false);
HtmlPage page = (HtmlPage)webClient.getPage("http://www.baidu.com/");
//获取搜索输入框并提交搜索内容
HtmlInput input = (HtmlInput)page.getHtmlElementById("kw");
System.out.println(input.toString());
input.setValueAttribute("ymd");
System.out.println(input.toString());
//获取搜索按钮并点击
HtmlInput btn = (HtmlInput)page.getHtmlElementById("su");
HtmlPage page2 = btn.click();
//输出新页面的文本
System.out.println(page2.asText());
}
}
3.htmlUnit方法介绍
一、环境介绍
因为是在自己的spring boot项目中引入的,所以只是在pom文件中添加了依赖。
net.sourceforge.htmlunit
htmlunit
2.41.0
如果你只是爬一个网站 js不多,建议改下下面的依赖
net.sourceforge.htmlunit
htmlunit
2.23
后面我会讲到两者的区别。当然,如果你不是使用maven项目(没有pom),可以到官网下载源码库
二、使用
HtmlUnit使用起来非常简单,使用的时候可以去官网手册查一下语法。其实说明书只是介绍的介绍,下面听我说就够了;
1、创建客户端并配置客户端
final String url ="https:****";//大家这可以填自己爬虫的地址
WebClient webClient = new WebClient(BrowserVersion.FIREFOX_68);//创建火狐浏览器 2.23版本是FIREFOX_45 new不写参数是默认浏览器
webClient.getOptions().setCssEnabled(false);//(屏蔽)css 因为css并不影响我们抓取数据 反而影响网页渲染效率
webClient.getOptions().setThrowExceptionOnScriptError(false);//(屏蔽)异常
webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);//(屏蔽)日志
webClient.getOptions().setJavaScriptEnabled(true);//加载js脚本
webClient.getOptions().setTimeout(50000);//设置超时时间
webClient.setAjaxController(new NicelyResynchronizingAjaxController());//设置ajax
HtmlPage htmlPage = webClient.getPage(url);//将客户端获取的树形结构转化为HtmlPage
Thread.sleep(10000);//主线程休眠10秒 让客户端有时间执行js代码 也可以写成webClient.waitForBackgroundJavaScript(1000)
这里是一个等待js执行的情况,2.41.0很适合很多js情况,但是2.3总是有问题,无法刷新网页,2.4< @1.0 打印的也很详细,执行的过程也比较慢,可能会比较慢产生详细的作品
远程地址页面在此处获取。我们现在需要做的是解析dom节点并填写数据来模拟点击等事件。如果要打印 htmlPage.asText() 输出 htmlPage 节点的文本 htmlPage.asXml() 输出 htmlPage 节点的 xml 代码
2、 获取节点
建议在这个链接准备一些前端知识
HtmlUnit给出了两种获取节点的方式
XPath 查询:
更详细的xpath解释:
final HtmlPage page = webClient.getPage("http://htmlunit.sourceforge.net");
//get list of all divs
final List divs = htmlPage .getByXPath("//div");
//get div which has a \'name\' attribute of \'John\'
final HtmlDivision div = (HtmlDivision) htmlPage .getByXPath("//div[@name=\'John\']").get(0);
css 选择器:(我更喜欢它)
final DomNodeList divs = htmlPage .querySelectorAll("div");
for (DomNode div : divs) {
....
}
//get div which has the id \'breadcrumbs\'
final DomNode div = htmlPage .querySelector("div#breadcrumbs");
css 提供了一个集合查询 querySelectorAll 和一个单一查询 querySelector。如果你没有基础,我给你举个例子:
htmlPage .querySelectorAll("div") 返回 htmlPage 下的一组 div 标签
htmlPage .querySelector("div:nth-child(1)") 返回htmlPage下div的第一个div
htmlPage .querySelector(".submit") 返回htmlPage下的第一个class=submit标签
htmlPage .querySelector("#submit") 返回 htmlPage 下 id=submit 的第一个标签
htmlPage .querySelector("div.submit") 返回类为submit的htmlPage下的第一个div标签
htmlPage .querySelector("div[id='submit']") 返回htmlPage下第一个id为submit的div标签
上面的枚举方法相信已经足够了,如果还不够,可以参考css选择器
下面列出常见的html标签与HtmlUnit类的对应关系
div -> HtmlDivision
div集合 -> DomNodeList
fieldSet -> HtmlFieldSet
form -> HtmlForm
button -> HtmlButton
a -> HtmlAnchor
-> HtmlXxxInput
( -> HtmlTextInput)
table -> HtmlTable
tr -> HtmlTableRow
td -> TableDataCell
setAttribute()方法有节点的属性样式,setNodeValue()设置节点的值。你的英语一下子提高了吗?几乎所有的标签都能找到对应的类别。来看看我的实战:这是一个在线填写温度的excel文档。如果访问更改地址,他会在登录页面提示登录按钮。登录按钮,我们现在模拟打开自动登录框:
//这段代码是为了让网页的的某个按钮加载出来之后再执行下面的代码
while (htmlPage.querySelector("#header-login-btn")==null) {
synchronized (htmlPage) {
htmlPage.wait(1000);
}
}
HtmlButton login = htmlPage.querySelector("#header-login-btn");//获取到登陆按钮
if (login!=null){//如果网页上没这个按钮你还要去获取他只会得到一个空对象,所以我们用空的方式可以判断网页上是否有这个按钮
System.out.println("-----未登录测试-----");
htmlPage=login.click();//模拟按钮点击后要将网页返回回来方便动态更新数据
System.out.println(htmlPage.asText());
HtmlAnchor switcher_plogin = htmlPage.querySelector("a[id=\'switcher_plogin\']");
if (switcher_plogin!=null) {//帐号密码登录
System.out.println("-----点击了帐号密码登陆-----");
htmlPage = switcher_plogin.click();
System.out.println(htmlPage.asText());
}
}
System.out.println(htmlPage.asText());
webClient.close();
爬虫最重要的一步就是我们首先调试网页,有哪些按钮,点击哪些,设置哪些值。毕竟,我们必须用代码来安排代码。
**扩展:** 如果你想从网页中获取数据或者下载文件,HtmlUnit 解析是不够的。推荐使用 Jsoup 库,可以和 HtmlUnit 一起使用。使用起来比较方便,这里就不一一列举了。
三、实现一个小demo
注意:htmlunit引用的jar包不完整会导致奇怪的错误
使用maven方法更方便
参考:
htmlunit 抓取网页( 2018-09-27栏目我正在使用动态网页中的HtmlUnit数据,)
网站优化 • 优采云 发表了文章 • 0 个评论 • 59 次浏览 • 2021-10-05 14:21
2018-09-27栏目我正在使用动态网页中的HtmlUnit数据,)
javascript-使用htmlunit获取动态网页
时间2018-09-27
柱子
我在动态网页中使用 HtmlUnit 来抓取数据。动态网页使用无限滚动来动态获取数据,就像Facebook的新闻提要一样。我用下面这句话来模拟向下滚动事件:
webclient.setJavaScriptEnabled(true);
webclient.setAjaxController(new NicelyResynchronizingAjaxController());
ScriptResult sr=myHtmlPage.executeJavaScript("window.scrollBy(0,600)");
webclient.waitForBackgroundJavaScript(10000);
myHtmlPage=(HtmlPage)sr.getNewPage();
但是好像myHtmlPage还是和上一个一样,就是myHtmlPage没有附加新的数据,所以只能抓取页面的前几条数据。感谢您的帮助!
我正在寻找同样的东西。我只能发现它不是滚动事件(90% 确定)。有一个 JS 负责加载页面,可能对你有帮助。
相关文章 查看全部
htmlunit 抓取网页(
2018-09-27栏目我正在使用动态网页中的HtmlUnit数据,)
javascript-使用htmlunit获取动态网页
时间2018-09-27
柱子
我在动态网页中使用 HtmlUnit 来抓取数据。动态网页使用无限滚动来动态获取数据,就像Facebook的新闻提要一样。我用下面这句话来模拟向下滚动事件:
webclient.setJavaScriptEnabled(true);
webclient.setAjaxController(new NicelyResynchronizingAjaxController());
ScriptResult sr=myHtmlPage.executeJavaScript("window.scrollBy(0,600)");
webclient.waitForBackgroundJavaScript(10000);
myHtmlPage=(HtmlPage)sr.getNewPage();
但是好像myHtmlPage还是和上一个一样,就是myHtmlPage没有附加新的数据,所以只能抓取页面的前几条数据。感谢您的帮助!
我正在寻找同样的东西。我只能发现它不是滚动事件(90% 确定)。有一个 JS 负责加载页面,可能对你有帮助。
相关文章
htmlunit 抓取网页(抓一个今日头条的首页内容解决方案-苏州安嘉)
网站优化 • 优采云 发表了文章 • 0 个评论 • 94 次浏览 • 2021-10-02 15:12
不知道大家在使用jsoup的过程中是否遇到过爬取内容的情况,发现有些网页的内容是通过JavaScript异步加载的,导致我们的爬虫空手返回(只抓到了一个网页) 。
遇到这个问题首先想到的有两种解决方案:
在网页的异步加载完成后,使用类似于Python中的延迟加载的方法对异步加载的网页进行爬取。使用特殊的方法让被爬取的网页的外框模拟里面的JavaScript代码的执行,最终到达完整的网页。
在搜索引擎的帮助下,我决定使用选项2来解决问题。选项 1 没有搜索更好的第三方库。在java中使用Option 1解决这个问题的朋友希望能和下一个一起讨论,太好了。
案例很简单,抓取今日头条的首页内容。你可以看看今日头条的主页。里面的内容是异步加载的。
添加jsoup和htmlunit的依赖
org.jsoup
jsoup
1.10.2
net.sourceforge.htmlunit
htmlunit
2.25
12345678910
首先我们单独使用jsoup解析今日头条首页
String url = "https://www.toutiao.com/";
Connection connect = Jsoup.connect(url);
Document document = connect.get();
System.out.println(document);
1234
↑ 这里只能获取网页的frame内容,不能获取首页的新闻内容
接下来我们用htmlunit试试
//构造一个webClient 模拟Chrome 浏览器
WebClient webClient = new WebClient(BrowserVersion.CHROME);
//屏蔽日志信息
LogFactory.getFactory().setAttribute("org.apache.commons.logging.Log",
"org.apache.commons.logging.impl.NoOpLog");
java.util.logging.Logger.getLogger("com.gargoylesoftware").setLevel(Level.OFF);
//支持JavaScript
webClient.getOptions().setJavaScriptEnabled(true);
webClient.getOptions().setCssEnabled(false);
webClient.getOptions().setActiveXNative(false);
webClient.getOptions().setCssEnabled(false);
webClient.getOptions().setThrowExceptionOnScriptError(false);
webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
webClient.getOptions().setTimeout(5000);
HtmlPage rootPage = webClient.getPage(url);
//设置一个运行JavaScript的时间
webClient.waitForBackgroundJavaScript(5000);
String html = rootPage.asXml();
Document document = Jsoup.parse(html);
12345678910111213141516171819
<a target="_blank" style="box-sizing: border-box; color: rgb(12, 137, 207);"></a>
这样我们就可以在运行后得到一个收录JavaScript的完整源码网页 查看全部
htmlunit 抓取网页(抓一个今日头条的首页内容解决方案-苏州安嘉)
不知道大家在使用jsoup的过程中是否遇到过爬取内容的情况,发现有些网页的内容是通过JavaScript异步加载的,导致我们的爬虫空手返回(只抓到了一个网页) 。
遇到这个问题首先想到的有两种解决方案:
在网页的异步加载完成后,使用类似于Python中的延迟加载的方法对异步加载的网页进行爬取。使用特殊的方法让被爬取的网页的外框模拟里面的JavaScript代码的执行,最终到达完整的网页。
在搜索引擎的帮助下,我决定使用选项2来解决问题。选项 1 没有搜索更好的第三方库。在java中使用Option 1解决这个问题的朋友希望能和下一个一起讨论,太好了。
案例很简单,抓取今日头条的首页内容。你可以看看今日头条的主页。里面的内容是异步加载的。
添加jsoup和htmlunit的依赖
org.jsoup
jsoup
1.10.2
net.sourceforge.htmlunit
htmlunit
2.25
12345678910
首先我们单独使用jsoup解析今日头条首页
String url = "https://www.toutiao.com/";
Connection connect = Jsoup.connect(url);
Document document = connect.get();
System.out.println(document);
1234
↑ 这里只能获取网页的frame内容,不能获取首页的新闻内容
接下来我们用htmlunit试试
//构造一个webClient 模拟Chrome 浏览器
WebClient webClient = new WebClient(BrowserVersion.CHROME);
//屏蔽日志信息
LogFactory.getFactory().setAttribute("org.apache.commons.logging.Log",
"org.apache.commons.logging.impl.NoOpLog");
java.util.logging.Logger.getLogger("com.gargoylesoftware").setLevel(Level.OFF);
//支持JavaScript
webClient.getOptions().setJavaScriptEnabled(true);
webClient.getOptions().setCssEnabled(false);
webClient.getOptions().setActiveXNative(false);
webClient.getOptions().setCssEnabled(false);
webClient.getOptions().setThrowExceptionOnScriptError(false);
webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
webClient.getOptions().setTimeout(5000);
HtmlPage rootPage = webClient.getPage(url);
//设置一个运行JavaScript的时间
webClient.waitForBackgroundJavaScript(5000);
String html = rootPage.asXml();
Document document = Jsoup.parse(html);
12345678910111213141516171819
<a target="_blank" style="box-sizing: border-box; color: rgb(12, 137, 207);">

这样我们就可以在运行后得到一个收录JavaScript的完整源码网页
htmlunit 抓取网页(网页获取和解析速度和性能的应用场景详解! )
网站优化 • 优采云 发表了文章 • 0 个评论 • 193 次浏览 • 2021-09-27 10:15
)
(4)支持代理服务器
(5) 支持自动cookies管理等。
Java爬虫开发中应用最广泛的网页获取技术之一。它具有一流的速度和性能。它在功能支持方面相对较低。不支持JS脚本执行、CSS解析、渲染等准浏览器功能。推荐给需要快速获取网页的用户。无需解析脚本和 CSS 场景。
示例代码如下:
package cn.ysh.studio.crawler.httpclient;import org.apache.http.client.HttpClient;import org.apache.http.client.ResponseHandler;import org.apache.http.client.methods.HttpGet;import org.apache.http.impl.client.BasicResponseHandler;import org.apache.http.impl.client.DefaultHttpClient;/**
* 基于HtmlClient抓取网页内容
*
* @author www.yshjava.cn
*/publicclassHttpClientTest{publicstaticvoid main(String[] args)throwsException{//目标页面String url ="http://www.yshjava.cn";//创建一个默认的HttpClientHttpClient httpclient =newDefaultHttpClient();try{//以get方式请求网页http://www.yshjava.cnHttpGet httpget =newHttpGet(url);//打印请求地址System.out.println("executing request "+ httpget.getURI());//创建响应处理器处理服务器响应内容ResponseHandlerresponseHandler=newBasicResponseHandler();//执行请求并获取结果String responseBody = httpclient.execute(httpget, responseHandler);System.out.println("----------------------------------------");System.out.println(responseBody);System.out.println("----------------------------------------");}finally{//关闭连接管理器
httpclient.getConnectionManager().shutdown();}}}
汤
jsoup 是一个 Java HTML 解析器,可以直接解析 URL 地址和 HTML 文本内容。它提供了一个非常省力的API,可以通过DOM、CSS和类似jQuery的操作方法来检索和操作数据。
网页获取和分析速度非常快,推荐使用。
主要功能如下:
1. 从 URL、文件或字符串解析 HTML;
2. 使用 DOM 或 CSS 选择器来查找和检索数据;
3. 可操作的 HTML 元素、属性和文本;
示例代码如下:
package cn.ysh.studio.crawler.jsoup;import java.io.IOException;import org.jsoup.Jsoup;/**
* 基于Jsoup抓取网页内容
* @author www.yshjava.cn
*/publicclassJsoupTest{publicstaticvoid main(String[] args)throwsIOException{//目标页面String url ="http://www.yshjava.cn";//使用Jsoup连接目标页面,并执行请求,获取服务器响应内容String html =Jsoup.connect(url).execute().body();//打印页面内容System.out.println(html);}}
单位
htmlunit 是一个开源的java 页面分析工具。阅读完页面后,您可以有效地使用 htmlunit 来分析页面上的内容。该项目可以模拟浏览器操作,被称为java浏览器的开源实现。这个没有界面的浏览器也非常快。使用 Rhinojs 引擎。模拟js操作。
网页获取和解析速度更快,性能更好。推荐用于需要解析网页脚本的应用场景。
示例代码如下:
package cn.ysh.studio.crawler.htmlunit;import com.gargoylesoftware.htmlunit.BrowserVersion;import com.gargoylesoftware.htmlunit.Page;import com.gargoylesoftware.htmlunit.WebClient;/**
* 基于HtmlUnit抓取网页内容
*
* @author www.yshjava.cn
*/publicclassHtmlUnitSpider{publicstaticvoid main(String[] s)throwsException{//目标网页String url ="http://www.yshjava.cn";//模拟特定浏览器FIREFOX_3WebClient spider =newWebClient(BrowserVersion.FIREFOX_3);//获取目标网页Page page = spider.getPage(url);//打印网页内容System.out.println(page.getWebResponse().getContentAsString());//关闭所有窗口
spider.closeAllWindows();}}
瓦蒂
Watij(读作 wattage)是一种使用 Java 开发的 Web 应用程序测试工具。鉴于 Watij 的简单性和 Java 语言的强大功能,Watij 可以让您在真实浏览器中完成 Web 应用程序的自动化测试。因为调用了本地浏览器,所以支持CSS渲染和JS执行。
网页抓取速度一般,IE版本过低(6/7)可能导致内存泄漏。
示例代码如下:
package cn.ysh.studio.crawler.ie;import watij.runtime.ie.IE;/**
* 基于Watij抓取网页内容,仅限Windows平台
*
* @author www.yshjava.cn
*/publicclassWatijTest{publicstaticvoid main(String[] s){//目标页面String url ="http://www.yshjava.cn";//实例化IE浏览器对象
IE ie =new IE();try{//启动浏览器
ie.start();//转到目标网页
ie.goTo(url);//等待网页加载就绪
ie.waitUntilReady();//打印页面内容System.out.println(ie.html());}catch(Exception e){
e.printStackTrace();}finally{try{//关闭IE浏览器
ie.close();}catch(Exception e){}}}}
硒
Selenium 也是 Web 应用程序测试的工具。Selenium 测试直接在浏览器中运行,就像真正的用户在操作一样。支持的浏览器包括 IE、Mozilla Firefox、Mozilla Suite 等。该工具的主要功能包括: 测试浏览器兼容性——测试您的应用程序是否可以在不同浏览器和操作系统上正常运行。测试系统功能——创建回归测试以验证软件功能和用户需求。支持自动录制动作和自动生成。测试Net、Java、Perl等不同语言的脚本。Selenium是ThoughtWorks专门为web应用编写的验收测试工具。
网页抓取速度较慢,对于爬虫来说不是一个好的选择。
示例代码如下:
package cn.ysh.studio.crawler.selenium;import org.openqa.selenium.htmlunit.HtmlUnitDriver;/**
* 基于HtmlDriver抓取网页内容
*
* @author www.yshjava.cn
*/publicclassHtmlDriverTest{publicstaticvoid main(String[] s){//目标网页String url ="http://www.yshjava.cn";HtmlUnitDriver driver =newHtmlUnitDriver();try{//禁用JS脚本功能
driver.setJavascriptEnabled(false);//打开目标网页
driver.get(url);//获取当前网页源码String html = driver.getPageSource();//打印网页源码System.out.println(html);}catch(Exception e){//打印堆栈信息
e.printStackTrace();}finally{try{//关闭并退出
driver.close();
driver.quit();}catch(Exception e){}}}}
网络规范
具有支持脚本执行和 CSS 渲染的接口的开源 Java 浏览器。速度是平均的。
示例代码如下:
package cn.ysh.studio.crawler.webspec;import org.watij.webspec.dsl.WebSpec;/**
* 基于WebSpec抓取网页内容
*
* @author www.yshjava.cn
*/publicclassWebspecTest{publicstaticvoid main(String[] s){//目标网页String url ="http://www.yshjava.cn";//实例化浏览器对象WebSpec spec =newWebSpec().mozilla();//隐藏浏览器窗体
spec.hide();//打开目标页面
spec.open(url);//打印网页源码System.out.println(spec.source());//关闭所有窗口
spec.closeAll();}} 查看全部
htmlunit 抓取网页(网页获取和解析速度和性能的应用场景详解!
)
(4)支持代理服务器
(5) 支持自动cookies管理等。
Java爬虫开发中应用最广泛的网页获取技术之一。它具有一流的速度和性能。它在功能支持方面相对较低。不支持JS脚本执行、CSS解析、渲染等准浏览器功能。推荐给需要快速获取网页的用户。无需解析脚本和 CSS 场景。
示例代码如下:
package cn.ysh.studio.crawler.httpclient;import org.apache.http.client.HttpClient;import org.apache.http.client.ResponseHandler;import org.apache.http.client.methods.HttpGet;import org.apache.http.impl.client.BasicResponseHandler;import org.apache.http.impl.client.DefaultHttpClient;/**
* 基于HtmlClient抓取网页内容
*
* @author www.yshjava.cn
*/publicclassHttpClientTest{publicstaticvoid main(String[] args)throwsException{//目标页面String url ="http://www.yshjava.cn";//创建一个默认的HttpClientHttpClient httpclient =newDefaultHttpClient();try{//以get方式请求网页http://www.yshjava.cnHttpGet httpget =newHttpGet(url);//打印请求地址System.out.println("executing request "+ httpget.getURI());//创建响应处理器处理服务器响应内容ResponseHandlerresponseHandler=newBasicResponseHandler();//执行请求并获取结果String responseBody = httpclient.execute(httpget, responseHandler);System.out.println("----------------------------------------");System.out.println(responseBody);System.out.println("----------------------------------------");}finally{//关闭连接管理器
httpclient.getConnectionManager().shutdown();}}}
汤
jsoup 是一个 Java HTML 解析器,可以直接解析 URL 地址和 HTML 文本内容。它提供了一个非常省力的API,可以通过DOM、CSS和类似jQuery的操作方法来检索和操作数据。
网页获取和分析速度非常快,推荐使用。
主要功能如下:
1. 从 URL、文件或字符串解析 HTML;
2. 使用 DOM 或 CSS 选择器来查找和检索数据;
3. 可操作的 HTML 元素、属性和文本;
示例代码如下:
package cn.ysh.studio.crawler.jsoup;import java.io.IOException;import org.jsoup.Jsoup;/**
* 基于Jsoup抓取网页内容
* @author www.yshjava.cn
*/publicclassJsoupTest{publicstaticvoid main(String[] args)throwsIOException{//目标页面String url ="http://www.yshjava.cn";//使用Jsoup连接目标页面,并执行请求,获取服务器响应内容String html =Jsoup.connect(url).execute().body();//打印页面内容System.out.println(html);}}
单位
htmlunit 是一个开源的java 页面分析工具。阅读完页面后,您可以有效地使用 htmlunit 来分析页面上的内容。该项目可以模拟浏览器操作,被称为java浏览器的开源实现。这个没有界面的浏览器也非常快。使用 Rhinojs 引擎。模拟js操作。
网页获取和解析速度更快,性能更好。推荐用于需要解析网页脚本的应用场景。
示例代码如下:
package cn.ysh.studio.crawler.htmlunit;import com.gargoylesoftware.htmlunit.BrowserVersion;import com.gargoylesoftware.htmlunit.Page;import com.gargoylesoftware.htmlunit.WebClient;/**
* 基于HtmlUnit抓取网页内容
*
* @author www.yshjava.cn
*/publicclassHtmlUnitSpider{publicstaticvoid main(String[] s)throwsException{//目标网页String url ="http://www.yshjava.cn";//模拟特定浏览器FIREFOX_3WebClient spider =newWebClient(BrowserVersion.FIREFOX_3);//获取目标网页Page page = spider.getPage(url);//打印网页内容System.out.println(page.getWebResponse().getContentAsString());//关闭所有窗口
spider.closeAllWindows();}}
瓦蒂
Watij(读作 wattage)是一种使用 Java 开发的 Web 应用程序测试工具。鉴于 Watij 的简单性和 Java 语言的强大功能,Watij 可以让您在真实浏览器中完成 Web 应用程序的自动化测试。因为调用了本地浏览器,所以支持CSS渲染和JS执行。
网页抓取速度一般,IE版本过低(6/7)可能导致内存泄漏。
示例代码如下:
package cn.ysh.studio.crawler.ie;import watij.runtime.ie.IE;/**
* 基于Watij抓取网页内容,仅限Windows平台
*
* @author www.yshjava.cn
*/publicclassWatijTest{publicstaticvoid main(String[] s){//目标页面String url ="http://www.yshjava.cn";//实例化IE浏览器对象
IE ie =new IE();try{//启动浏览器
ie.start();//转到目标网页
ie.goTo(url);//等待网页加载就绪
ie.waitUntilReady();//打印页面内容System.out.println(ie.html());}catch(Exception e){
e.printStackTrace();}finally{try{//关闭IE浏览器
ie.close();}catch(Exception e){}}}}
硒
Selenium 也是 Web 应用程序测试的工具。Selenium 测试直接在浏览器中运行,就像真正的用户在操作一样。支持的浏览器包括 IE、Mozilla Firefox、Mozilla Suite 等。该工具的主要功能包括: 测试浏览器兼容性——测试您的应用程序是否可以在不同浏览器和操作系统上正常运行。测试系统功能——创建回归测试以验证软件功能和用户需求。支持自动录制动作和自动生成。测试Net、Java、Perl等不同语言的脚本。Selenium是ThoughtWorks专门为web应用编写的验收测试工具。
网页抓取速度较慢,对于爬虫来说不是一个好的选择。
示例代码如下:
package cn.ysh.studio.crawler.selenium;import org.openqa.selenium.htmlunit.HtmlUnitDriver;/**
* 基于HtmlDriver抓取网页内容
*
* @author www.yshjava.cn
*/publicclassHtmlDriverTest{publicstaticvoid main(String[] s){//目标网页String url ="http://www.yshjava.cn";HtmlUnitDriver driver =newHtmlUnitDriver();try{//禁用JS脚本功能
driver.setJavascriptEnabled(false);//打开目标网页
driver.get(url);//获取当前网页源码String html = driver.getPageSource();//打印网页源码System.out.println(html);}catch(Exception e){//打印堆栈信息
e.printStackTrace();}finally{try{//关闭并退出
driver.close();
driver.quit();}catch(Exception e){}}}}
网络规范
具有支持脚本执行和 CSS 渲染的接口的开源 Java 浏览器。速度是平均的。
示例代码如下:
package cn.ysh.studio.crawler.webspec;import org.watij.webspec.dsl.WebSpec;/**
* 基于WebSpec抓取网页内容
*
* @author www.yshjava.cn
*/publicclassWebspecTest{publicstaticvoid main(String[] s){//目标网页String url ="http://www.yshjava.cn";//实例化浏览器对象WebSpec spec =newWebSpec().mozilla();//隐藏浏览器窗体
spec.hide();//打开目标页面
spec.open(url);//打印网页源码System.out.println(spec.source());//关闭所有窗口
spec.closeAll();}}
htmlunit 抓取网页(使用本文中推荐的开源工具——HtmlUnit,一款能够模拟浏览器的抓包神器!)
网站优化 • 优采云 发表了文章 • 0 个评论 • 53 次浏览 • 2021-09-27 10:12
之前一峰写过一篇关于使用Jsoup爬取网页内容的文章文章:
[Jsoup] HTML 解析器,轻松访问网页内容
Jsoup提供的api非常方便,完全类似于JQuery操作,轻松抓取网页数据。但是像Jsoup这样的普通爬虫工具的缺点是无法处理js生成的内容。
做过Html开发的都知道,现在很多网站都大量使用ajax和JavaScript来获取和处理数据,普通的爬虫工具已经无法处理js中的内容了。
比如我们在本地新建一个测试web文件text.html,源码如下:
main.html a { line-height: 30px; margin: 20px; } var datas = [ { href : "http://www.jianshu.com/p/8d8edf25850d", title : "推荐一款编程字体,让代码看着更美"}, { href : "http://www.jianshu.com/p/153d9f31288d", title : "Android 利用Camera实现中轴3D卡牌翻转效果"}, { href : "http://www.jianshu.com/p/d6fb0c9c9c26", title : "【Eclipse】挖掘专属最有用的快捷键组合"}, { href : "http://www.jianshu.com/p/72d69b49d135", title : "【IIS】Windows下利用IIS建立网站并实现局域网共享"} ];window.onload = function() { var infos = document.getElementById("infos"); for( var i = 0 ; i < datas.length ; i++) { var a = document.createElement("a"); a.href = datas[i].href ; a.innerText = datas[i].title; infos.appendChild(a); infos.appendChild(document.createElement("br")) }} HtmlUnit 测试网页内容!
通过IIS发布本地网站(参考易峰之前写的文章:【IIS】Windows下使用IIS建立网站,实现局域网共享),显示网页效果在浏览器中如下:
网页展示效果.jpg
虽然通过网页评论元素可以看到body收录了网页显示中的文本内容:
网络评论元素.jpg
但是,它根本无法通过 Jsoup 工具使用!从网页源码中可以看出,我们需要抓取的内容是在页面显示后通过ajax和JavaScript加载的。
那么该怎么办?使用本文推荐的开源工具——HtmlUnit,一款可以模拟浏览器的抓包神器!
在官网下载对应的jar包,添加到工程项目的lib中。简单的测试代码如下:
import java.io.IOException;import java.net.MalformedURLException;import java.text.ParseException;import com.gargoylesoftware.htmlunit.BrowserVersion;import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;import com.gargoylesoftware.htmlunit.WebClient;import com.gargoylesoftware.htmlunit.html.DomElement;import com.gargoylesoftware.htmlunit.html.DomNodeList;import com.gargoylesoftware.htmlunit.html.HtmlPage;/** * @author 亦枫 * @created_time 2016年1月12日 * @file_user_todo Java测试类 * @blog http://www.jianshu.com/users/1 ... icles */public class JavaTest { /** * 入口函数 * @param args * @throws ParseException */ public static void main(String[] args) throws ParseException { try { WebClient webClient = new WebClient(BrowserVersion.CHROME); HtmlPage htmlPage = (HtmlPage) webClient.getPage("http://localhost/test.html"); DomNodeList domNodeList = htmlPage.getElementsByTagName("a"); for (int i = 0; i < domNodeList.size(); i++) { DomElement domElement = (DomElement) domNodeList.get(i); System.out.println(domElement.asText()); } webClient.close(); } catch (FailingHttpStatusCodeException e) { e.printStackTrace(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }}
运行后,控制台打印结果:
HtmlUnit 测试结果.jpg
可见HtmlUnit可以抓取AJAX和JavaScript加载的内容。
HtmlUnit的介绍在官网上很详细。以下内容为易峰翻译的部分内容,供大家参考:
HtmlUnit 是一个基于 Java 的浏览器程序,没有图形界面。它可以调用HTML文档并提供API,让开发者可以像在普通浏览器上操作一样访问网页内容、填写表格、点击超链接等。
它可以很好地支持 JavaScript,并且仍在改进中。同时,它可以解析非常复杂的AJAX库,模拟不同配置下的Chrome、Firefox和IE浏览器。
HtmlUnit 通常用于测试目的和检索 网站 信息。
HtmlUnit 提供了很多用于测试网络请求和抓取网页内容的功能。可以到官网或者其他网站学习使用。 查看全部
htmlunit 抓取网页(使用本文中推荐的开源工具——HtmlUnit,一款能够模拟浏览器的抓包神器!)
之前一峰写过一篇关于使用Jsoup爬取网页内容的文章文章:
[Jsoup] HTML 解析器,轻松访问网页内容
Jsoup提供的api非常方便,完全类似于JQuery操作,轻松抓取网页数据。但是像Jsoup这样的普通爬虫工具的缺点是无法处理js生成的内容。
做过Html开发的都知道,现在很多网站都大量使用ajax和JavaScript来获取和处理数据,普通的爬虫工具已经无法处理js中的内容了。
比如我们在本地新建一个测试web文件text.html,源码如下:
main.html a { line-height: 30px; margin: 20px; } var datas = [ { href : "http://www.jianshu.com/p/8d8edf25850d", title : "推荐一款编程字体,让代码看着更美"}, { href : "http://www.jianshu.com/p/153d9f31288d", title : "Android 利用Camera实现中轴3D卡牌翻转效果"}, { href : "http://www.jianshu.com/p/d6fb0c9c9c26", title : "【Eclipse】挖掘专属最有用的快捷键组合"}, { href : "http://www.jianshu.com/p/72d69b49d135", title : "【IIS】Windows下利用IIS建立网站并实现局域网共享"} ];window.onload = function() { var infos = document.getElementById("infos"); for( var i = 0 ; i < datas.length ; i++) { var a = document.createElement("a"); a.href = datas[i].href ; a.innerText = datas[i].title; infos.appendChild(a); infos.appendChild(document.createElement("br")) }} HtmlUnit 测试网页内容!
通过IIS发布本地网站(参考易峰之前写的文章:【IIS】Windows下使用IIS建立网站,实现局域网共享),显示网页效果在浏览器中如下:
网页展示效果.jpg
虽然通过网页评论元素可以看到body收录了网页显示中的文本内容:
网络评论元素.jpg
但是,它根本无法通过 Jsoup 工具使用!从网页源码中可以看出,我们需要抓取的内容是在页面显示后通过ajax和JavaScript加载的。
那么该怎么办?使用本文推荐的开源工具——HtmlUnit,一款可以模拟浏览器的抓包神器!
在官网下载对应的jar包,添加到工程项目的lib中。简单的测试代码如下:
import java.io.IOException;import java.net.MalformedURLException;import java.text.ParseException;import com.gargoylesoftware.htmlunit.BrowserVersion;import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;import com.gargoylesoftware.htmlunit.WebClient;import com.gargoylesoftware.htmlunit.html.DomElement;import com.gargoylesoftware.htmlunit.html.DomNodeList;import com.gargoylesoftware.htmlunit.html.HtmlPage;/** * @author 亦枫 * @created_time 2016年1月12日 * @file_user_todo Java测试类 * @blog http://www.jianshu.com/users/1 ... icles */public class JavaTest { /** * 入口函数 * @param args * @throws ParseException */ public static void main(String[] args) throws ParseException { try { WebClient webClient = new WebClient(BrowserVersion.CHROME); HtmlPage htmlPage = (HtmlPage) webClient.getPage("http://localhost/test.html"); DomNodeList domNodeList = htmlPage.getElementsByTagName("a"); for (int i = 0; i < domNodeList.size(); i++) { DomElement domElement = (DomElement) domNodeList.get(i); System.out.println(domElement.asText()); } webClient.close(); } catch (FailingHttpStatusCodeException e) { e.printStackTrace(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }}
运行后,控制台打印结果:
HtmlUnit 测试结果.jpg
可见HtmlUnit可以抓取AJAX和JavaScript加载的内容。
HtmlUnit的介绍在官网上很详细。以下内容为易峰翻译的部分内容,供大家参考:
HtmlUnit 是一个基于 Java 的浏览器程序,没有图形界面。它可以调用HTML文档并提供API,让开发者可以像在普通浏览器上操作一样访问网页内容、填写表格、点击超链接等。
它可以很好地支持 JavaScript,并且仍在改进中。同时,它可以解析非常复杂的AJAX库,模拟不同配置下的Chrome、Firefox和IE浏览器。
HtmlUnit 通常用于测试目的和检索 网站 信息。
HtmlUnit 提供了很多用于测试网络请求和抓取网页内容的功能。可以到官网或者其他网站学习使用。
htmlunit 抓取网页(抓一个今日头条的首页内容解决方案-苏州安嘉)
网站优化 • 优采云 发表了文章 • 0 个评论 • 84 次浏览 • 2021-09-27 00:09
不知道大家在使用jsoup的过程中是否遇到过爬取内容的情况,发现有些网页的内容是通过JavaScript异步加载的,导致我们的爬虫空手返回(只抓到了一个网页) 。
遇到这个问题首先想到的有两种解决方案:
在网页的异步加载完成后,使用类似于Python中的延迟加载的方法对异步加载的网页进行爬取。使用特殊的方法让被爬取的网页的外框模拟里面的JavaScript代码的执行,最终到达完整的网页。
在搜索引擎的帮助下,我决定使用选项2来解决问题。选项 1 没有搜索更好的第三方库。在java中使用Option 1解决这个问题的朋友希望能和下一个一起讨论,太好了。
案例很简单,抓取今日头条的首页内容。你可以看看今日头条的主页。里面的内容是异步加载的。
添加jsoup和htmlunit的依赖
org.jsoup
jsoup
1.10.2
net.sourceforge.htmlunit
htmlunit
2.25
首先我们单独使用jsoup解析今日头条首页
String url = "https://www.toutiao.com/";
Connection connect = Jsoup.connect(url);
Document document = connect.get();
System.out.println(document);
↑ 这里只能获取网页的frame内容,不能获取首页的新闻内容
接下来我们用htmlunit试试
//构造一个webClient 模拟Chrome 浏览器
WebClient webClient = new WebClient(BrowserVersion.CHROME);
//屏蔽日志信息
LogFactory.getFactory().setAttribute("org.apache.commons.logging.Log",
"org.apache.commons.logging.impl.NoOpLog");
java.util.logging.Logger.getLogger("com.gargoylesoftware").setLevel(Level.OFF);
//支持JavaScript
webClient.getOptions().setJavaScriptEnabled(true);
webClient.getOptions().setCssEnabled(false);
webClient.getOptions().setActiveXNative(false);
webClient.getOptions().setCssEnabled(false);
webClient.getOptions().setThrowExceptionOnScriptError(false);
webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
webClient.getOptions().setTimeout(5000);
HtmlPage rootPage = webClient.getPage(url);
//设置一个运行JavaScript的时间
webClient.waitForBackgroundJavaScript(5000);
String html = rootPage.asXml();
Document document = Jsoup.parse(html);
/imgrdrct/http://static.blog.csdn.net/im ... s.png
这样我们就可以在运行后得到一个收录JavaScript的完整源码网页 查看全部
htmlunit 抓取网页(抓一个今日头条的首页内容解决方案-苏州安嘉)
不知道大家在使用jsoup的过程中是否遇到过爬取内容的情况,发现有些网页的内容是通过JavaScript异步加载的,导致我们的爬虫空手返回(只抓到了一个网页) 。
遇到这个问题首先想到的有两种解决方案:
在网页的异步加载完成后,使用类似于Python中的延迟加载的方法对异步加载的网页进行爬取。使用特殊的方法让被爬取的网页的外框模拟里面的JavaScript代码的执行,最终到达完整的网页。
在搜索引擎的帮助下,我决定使用选项2来解决问题。选项 1 没有搜索更好的第三方库。在java中使用Option 1解决这个问题的朋友希望能和下一个一起讨论,太好了。
案例很简单,抓取今日头条的首页内容。你可以看看今日头条的主页。里面的内容是异步加载的。
添加jsoup和htmlunit的依赖
org.jsoup
jsoup
1.10.2
net.sourceforge.htmlunit
htmlunit
2.25
首先我们单独使用jsoup解析今日头条首页
String url = "https://www.toutiao.com/";
Connection connect = Jsoup.connect(url);
Document document = connect.get();
System.out.println(document);
↑ 这里只能获取网页的frame内容,不能获取首页的新闻内容
接下来我们用htmlunit试试
//构造一个webClient 模拟Chrome 浏览器
WebClient webClient = new WebClient(BrowserVersion.CHROME);
//屏蔽日志信息
LogFactory.getFactory().setAttribute("org.apache.commons.logging.Log",
"org.apache.commons.logging.impl.NoOpLog");
java.util.logging.Logger.getLogger("com.gargoylesoftware").setLevel(Level.OFF);
//支持JavaScript
webClient.getOptions().setJavaScriptEnabled(true);
webClient.getOptions().setCssEnabled(false);
webClient.getOptions().setActiveXNative(false);
webClient.getOptions().setCssEnabled(false);
webClient.getOptions().setThrowExceptionOnScriptError(false);
webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
webClient.getOptions().setTimeout(5000);
HtmlPage rootPage = webClient.getPage(url);
//设置一个运行JavaScript的时间
webClient.waitForBackgroundJavaScript(5000);
String html = rootPage.asXml();
Document document = Jsoup.parse(html);
/imgrdrct/http://static.blog.csdn.net/im ... s.png
这样我们就可以在运行后得到一个收录JavaScript的完整源码网页
htmlunit 抓取网页(,一个)
网站优化 • 优采云 发表了文章 • 0 个评论 • 53 次浏览 • 2021-09-24 17:04
标签:styleblogclasscodejaext
最近,在编写爬虫程序时,使用httpclient捕获某些网页时出现了一些问题,即捕获的内容收录大量加密文本(通过JavaScript脚本),而无法获取真实内容(即通过浏览器打开网页呈现的内容)。因此,您通常需要与JS引擎合作来解决这个问题。搜索后,您可以找到帮助的工具htmlunit。在理解和使用的过程中,我发现这是一个非常强大的开源工具。尽管它不如httpclient出名,但其实力不应低估
不要说闲话。目前,htmlunit的最新版本为2.14,可在此处下载:
只需下载htmlunit-2.14 bin.zip,解压并将所有jar包导入到项目中
以下是一个相对完整的代码:
String url="http://news.cnblogs.com/";//想采集的网址
String refer="http://www.cnblogs.com/";
URL link=new URL(url);
WebClient wc=new WebClient();
WebRequest request=new WebRequest(link);
request.setCharset("UTF-8");
request.setProxyHost("120.120.120.x");
request.setProxyPort(8080);
request.setAdditionalHeader("Referer", refer);//设置请求报文头里的refer字段
////设置请求报文头里的User-Agent字段
request.setAdditionalHeader("User-Agent", "Mozilla/5.0 (Windows NT 5.1; rv:6.0.2) Gecko/20100101 Firefox/6.0.2");
//wc.addRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 5.1; rv:6.0.2) Gecko/20100101 Firefox/6.0.2");
//wc.addRequestHeader和request.setAdditionalHeader功能应该是一样的。选择一个即可。
//其他报文头字段可以根据需要添加
wc.getCookieManager().setCookiesEnabled(true);//开启cookie管理
wc.getOptions().setJavaScriptEnabled(true);//开启js解析。对于变态网页,这个是必须的
wc.getOptions().setCssEnabled(true);//开启css解析。对于变态网页,这个是必须的。
wc.getOptions().setThrowExceptionOnFailingStatusCode(false);
wc.getOptions().setThrowExceptionOnScriptError(false);
wc.getOptions().setTimeout(10000);
//设置cookie。如果你有cookie,可以在这里设置
Set cookies=null;
Iterator i = cookies.iterator();
while (i.hasNext())
{
wc.getCookieManager().addCookie(i.next());
}
//准备工作已经做好了
HtmlPage page=null;
page = wc.getPage(request);
if(page==null)
{
System.out.println("采集 "+url+" 失败!!!");
return ;
}
String content=page.asText();//网页内容保存在content里
if(content==null)
{
System.out.println("采集 "+url+" 失败!!!");
return ;
}
//搞定了
CookieManager CM = wc.getCookieManager(); //WC = Your WebClient‘s name
Set cookies_ret = CM.getCookies();//返回的Cookie在这里,下次请求的时候可能可以用上啦。
说明:
一,。在htmlunit的操作过程中会引发许多异常。你必须做好准备。哈哈
二,。对于异常的网页,有时候你不能用htmlunit获得完整和正确的内容,但是没有压力获得大致正确的内容。下面是如何用jsup之类的东西提取它
三,。Htmlunit功能非常强大,有很大的研究空间
Htmlunit教程,布扣
Htmlunit教程
标签:styleblogclasscodejaext 查看全部
htmlunit 抓取网页(,一个)
标签:styleblogclasscodejaext
最近,在编写爬虫程序时,使用httpclient捕获某些网页时出现了一些问题,即捕获的内容收录大量加密文本(通过JavaScript脚本),而无法获取真实内容(即通过浏览器打开网页呈现的内容)。因此,您通常需要与JS引擎合作来解决这个问题。搜索后,您可以找到帮助的工具htmlunit。在理解和使用的过程中,我发现这是一个非常强大的开源工具。尽管它不如httpclient出名,但其实力不应低估
不要说闲话。目前,htmlunit的最新版本为2.14,可在此处下载:
只需下载htmlunit-2.14 bin.zip,解压并将所有jar包导入到项目中
以下是一个相对完整的代码:
String url="http://news.cnblogs.com/";//想采集的网址
String refer="http://www.cnblogs.com/";
URL link=new URL(url);
WebClient wc=new WebClient();
WebRequest request=new WebRequest(link);
request.setCharset("UTF-8");
request.setProxyHost("120.120.120.x");
request.setProxyPort(8080);
request.setAdditionalHeader("Referer", refer);//设置请求报文头里的refer字段
////设置请求报文头里的User-Agent字段
request.setAdditionalHeader("User-Agent", "Mozilla/5.0 (Windows NT 5.1; rv:6.0.2) Gecko/20100101 Firefox/6.0.2");
//wc.addRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 5.1; rv:6.0.2) Gecko/20100101 Firefox/6.0.2");
//wc.addRequestHeader和request.setAdditionalHeader功能应该是一样的。选择一个即可。
//其他报文头字段可以根据需要添加
wc.getCookieManager().setCookiesEnabled(true);//开启cookie管理
wc.getOptions().setJavaScriptEnabled(true);//开启js解析。对于变态网页,这个是必须的
wc.getOptions().setCssEnabled(true);//开启css解析。对于变态网页,这个是必须的。
wc.getOptions().setThrowExceptionOnFailingStatusCode(false);
wc.getOptions().setThrowExceptionOnScriptError(false);
wc.getOptions().setTimeout(10000);
//设置cookie。如果你有cookie,可以在这里设置
Set cookies=null;
Iterator i = cookies.iterator();
while (i.hasNext())
{
wc.getCookieManager().addCookie(i.next());
}
//准备工作已经做好了
HtmlPage page=null;
page = wc.getPage(request);
if(page==null)
{
System.out.println("采集 "+url+" 失败!!!");
return ;
}
String content=page.asText();//网页内容保存在content里
if(content==null)
{
System.out.println("采集 "+url+" 失败!!!");
return ;
}
//搞定了
CookieManager CM = wc.getCookieManager(); //WC = Your WebClient‘s name
Set cookies_ret = CM.getCookies();//返回的Cookie在这里,下次请求的时候可能可以用上啦。
说明:
一,。在htmlunit的操作过程中会引发许多异常。你必须做好准备。哈哈
二,。对于异常的网页,有时候你不能用htmlunit获得完整和正确的内容,但是没有压力获得大致正确的内容。下面是如何用jsup之类的东西提取它
三,。Htmlunit功能非常强大,有很大的研究空间
Htmlunit教程,布扣
Htmlunit教程
标签:styleblogclasscodejaext
htmlunit 抓取网页(做过j2ee或android开发的童鞋,应该或多或少都使用过Apeache)
网站优化 • 优采云 发表了文章 • 0 个评论 • 77 次浏览 • 2021-09-22 11:07
由J2EE或Android开发的坟墓应该或多或少地使用了Apheach的Httpclient库。此类库为我们提供了一个非常强大的服务器HTTP请求操作。在开发中使用非常方便。
最近做PHP开发,还需要在服务器上发送HTTP请求,然后处理返回客户端,如果使用套接字,您可能不会太麻烦,我想看看是否有任何问题Httpclient在PHP中。类库。
谷歌,我发现PHP中有这样的类库,名称称为Httpclient,非常兴奋,看官方网站,发现它尚未更新多年,并且该功能似乎是有限,损失是什么。然后我找到了另一个类库史努比,我不知道这个类库,但我仍然看到在线响应不错,所以我决定用他。他的API使用和Apheach的Httpclient差异,但它仍然很容易使用。此外,还有许多特殊用途的方法,例如只抓住页面中的表单形式,或所有链接等。
include 'Snoopy.class.php';
$snoopy = new Snoopy();
$snoopy->fetch("http://www.baidu.com");
echo $snoopy->results;
上面的代码很容易轻松抓住百度页面。
当然,当你需要发送帖子表单时,可以使用提交方法提交数据。
他还提供了Cookie的请求标题,响应头和相关操作功能,非常强大。
\ n“;} else {echo”错误获取文档:“$ snoopy-&gt;错误。” \ n“;}
更多操作方法,您可以转到Snoopy的官方查看文档,或直接查看源代码。
在这里,snoopy只是将页面返回。如果要提取页面,则无法帮助它。在这里我发现另一个PHP解析HTML工具:PHPQuery,它提供了操作方法和jQuery几乎完全,并提供了一些PHP特性,熟悉jQuery儿童鞋,使用phpquery应该是相当的,甚至不需要文档。
使用史努比+ PhpQuery,它是实现网页,非常实用很方便,我也是最近在这方面,我发现这两个很好的类库,我有很多的Java可以做到这一点。事情,PHP也可以这样做。
兴趣的同学,您也可以尝试将它们成为一个简单的Web爬升。 查看全部
htmlunit 抓取网页(做过j2ee或android开发的童鞋,应该或多或少都使用过Apeache)
由J2EE或Android开发的坟墓应该或多或少地使用了Apheach的Httpclient库。此类库为我们提供了一个非常强大的服务器HTTP请求操作。在开发中使用非常方便。
最近做PHP开发,还需要在服务器上发送HTTP请求,然后处理返回客户端,如果使用套接字,您可能不会太麻烦,我想看看是否有任何问题Httpclient在PHP中。类库。
谷歌,我发现PHP中有这样的类库,名称称为Httpclient,非常兴奋,看官方网站,发现它尚未更新多年,并且该功能似乎是有限,损失是什么。然后我找到了另一个类库史努比,我不知道这个类库,但我仍然看到在线响应不错,所以我决定用他。他的API使用和Apheach的Httpclient差异,但它仍然很容易使用。此外,还有许多特殊用途的方法,例如只抓住页面中的表单形式,或所有链接等。
include 'Snoopy.class.php';
$snoopy = new Snoopy();
$snoopy->fetch("http://www.baidu.com");
echo $snoopy->results;
上面的代码很容易轻松抓住百度页面。
当然,当你需要发送帖子表单时,可以使用提交方法提交数据。
他还提供了Cookie的请求标题,响应头和相关操作功能,非常强大。
\ n“;} else {echo”错误获取文档:“$ snoopy-&gt;错误。” \ n“;}
更多操作方法,您可以转到Snoopy的官方查看文档,或直接查看源代码。
在这里,snoopy只是将页面返回。如果要提取页面,则无法帮助它。在这里我发现另一个PHP解析HTML工具:PHPQuery,它提供了操作方法和jQuery几乎完全,并提供了一些PHP特性,熟悉jQuery儿童鞋,使用phpquery应该是相当的,甚至不需要文档。
使用史努比+ PhpQuery,它是实现网页,非常实用很方便,我也是最近在这方面,我发现这两个很好的类库,我有很多的Java可以做到这一点。事情,PHP也可以这样做。
兴趣的同学,您也可以尝试将它们成为一个简单的Web爬升。
htmlunit 抓取网页(爬虫抓取网页的例子是什么?如何下载网页?)
网站优化 • 优采云 发表了文章 • 0 个评论 • 72 次浏览 • 2021-09-22 11:06
当最近由httpclient编写时,httpclient的一些问题将逮捕一些问题,该问题是捕获收录大量加密文本的内容(通过JavaScript脚本),无法获得真实内容(即打开网页使用浏览器)呈现内容)。因此,它通常需要与JS引擎合作来解决这个问题,搜索,发现HTMLUnit可以提供帮助。这是一个非常糟糕的开源工具。虽然着名的傲慢小于httpclient,但实力绝对不低估。戈斯少。从这里下载:
以下是爬虫抓取页面的示例:
String url="http://outofmemory.cn/";//想采集的网址
String refer="http://open-open.com/";
URL link=new URL(url);
WebClient wc=new WebClient();
WebRequest request=new WebRequest(link);
request.setCharset("UTF-8");
request.setProxyHost("120.120.120.x");
request.setProxyPort(8080);
request.setAdditionalHeader("Referer", refer);//设置请求报文头里的refer字段
////设置请求报文头里的User-Agent字段
request.setAdditionalHeader("User-Agent", "Mozilla/5.0 (Windows NT 5.1; rv:6.0.2) Gecko/20100101 Firefox/6.0.2");
//wc.addRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 5.1; rv:6.0.2) Gecko/20100101 Firefox/6.0.2");
//wc.addRequestHeader和request.setAdditionalHeader功能应该是一样的。选择一个即可。
//其他报文头字段可以根据需要添加
wc.getCookieManager().setCookiesEnabled(true);//开启cookie管理
wc.getOptions().setJavaScriptEnabled(true);//开启js解析。对于变态网页,这个是必须的
wc.getOptions().setCssEnabled(true);//开启css解析。对于变态网页,这个是必须的。
wc.getOptions().setThrowExceptionOnFailingStatusCode(false);
wc.getOptions().setThrowExceptionOnScriptError(false);
wc.getOptions().setTimeout(10000);
//设置cookie。如果你有cookie,可以在这里设置
Set cookies=null;
Iterator i = cookies.iterator();
while (i.hasNext())
{
wc.getCookieManager().addCookie(i.next());
}
//准备工作已经做好了
HtmlPage page=null;
page = wc.getPage(request);
if(page==null)
{
System.out.println("采集 "+url+" 失败!!!");
return ;
}
String content=page.asText();//网页内容保存在content里
if(content==null)
{
System.out.println("采集 "+url+" 失败!!!");
return ;
}
//搞定了
CookieManager CM = wc.getCookieManager(); //WC = Your WebClient's name
Set cookies_ret = CM.getCookies();//返回的Cookie在这里,下次请求的时候可能可以用上啦。
如果您不明白,您可以留言,互相讨论。 查看全部
htmlunit 抓取网页(爬虫抓取网页的例子是什么?如何下载网页?)
当最近由httpclient编写时,httpclient的一些问题将逮捕一些问题,该问题是捕获收录大量加密文本的内容(通过JavaScript脚本),无法获得真实内容(即打开网页使用浏览器)呈现内容)。因此,它通常需要与JS引擎合作来解决这个问题,搜索,发现HTMLUnit可以提供帮助。这是一个非常糟糕的开源工具。虽然着名的傲慢小于httpclient,但实力绝对不低估。戈斯少。从这里下载:
以下是爬虫抓取页面的示例:
String url="http://outofmemory.cn/";//想采集的网址
String refer="http://open-open.com/";
URL link=new URL(url);
WebClient wc=new WebClient();
WebRequest request=new WebRequest(link);
request.setCharset("UTF-8");
request.setProxyHost("120.120.120.x");
request.setProxyPort(8080);
request.setAdditionalHeader("Referer", refer);//设置请求报文头里的refer字段
////设置请求报文头里的User-Agent字段
request.setAdditionalHeader("User-Agent", "Mozilla/5.0 (Windows NT 5.1; rv:6.0.2) Gecko/20100101 Firefox/6.0.2");
//wc.addRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 5.1; rv:6.0.2) Gecko/20100101 Firefox/6.0.2");
//wc.addRequestHeader和request.setAdditionalHeader功能应该是一样的。选择一个即可。
//其他报文头字段可以根据需要添加
wc.getCookieManager().setCookiesEnabled(true);//开启cookie管理
wc.getOptions().setJavaScriptEnabled(true);//开启js解析。对于变态网页,这个是必须的
wc.getOptions().setCssEnabled(true);//开启css解析。对于变态网页,这个是必须的。
wc.getOptions().setThrowExceptionOnFailingStatusCode(false);
wc.getOptions().setThrowExceptionOnScriptError(false);
wc.getOptions().setTimeout(10000);
//设置cookie。如果你有cookie,可以在这里设置
Set cookies=null;
Iterator i = cookies.iterator();
while (i.hasNext())
{
wc.getCookieManager().addCookie(i.next());
}
//准备工作已经做好了
HtmlPage page=null;
page = wc.getPage(request);
if(page==null)
{
System.out.println("采集 "+url+" 失败!!!");
return ;
}
String content=page.asText();//网页内容保存在content里
if(content==null)
{
System.out.println("采集 "+url+" 失败!!!");
return ;
}
//搞定了
CookieManager CM = wc.getCookieManager(); //WC = Your WebClient's name
Set cookies_ret = CM.getCookies();//返回的Cookie在这里,下次请求的时候可能可以用上啦。
如果您不明白,您可以留言,互相讨论。
htmlunit 抓取网页(AngularJS-pageapplication框架如何判断前端渲染判断页面多)
网站优化 • 优采云 发表了文章 • 0 个评论 • 49 次浏览 • 2021-09-19 23:22
抓取前端呈现页面
随着Ajax技术的不断普及和angularjs等单页应用框架的出现,越来越多的页面被JS呈现。对于爬虫来说,这种页面很烦人:仅提取HTML内容通常无法获得有效信息。那么如何处理这种页面呢?一般来说,有两种方法:
在爬行阶段,浏览器内核内置到爬行器中,页面在爬行之前由JS呈现。这方面的相应工具是selenium、htmlunit或phantom JS。然而,这些工具存在一些效率问题,并且不太稳定。其优点是编写规则与静态页面相同。由于JS呈现页面的数据也是从后端获取的,基本上是通过Ajax获取的,因此分析Ajax请求并找到相应的数据请求也是可行的。此外,与页面样式相比,此界面不太可能更改。缺点是找到这个请求并模拟它是一个相对困难的过程,需要相对较多的分析经验
比较这两种方法,我的观点是,对于一次性或小规模的需求,第一种方法可以节省时间和精力。然而,对于长期和大规模的需求,第二个将更可靠。对于一些网站,甚至一些JS混淆技术,目前,第一种方法基本上是万能的,而第二种方法将非常复杂
这里我们以angularjs中文社区{{global.Metallic}为例
1如何判断前端渲染
判断页面是否以JS呈现的方法相对简单。在浏览器中直接查看源代码(windows中为Ctrl+u,MAC中为Command+Alt+u)。如果找不到有效的信息,基本上肯定会在JS中呈现
在本例中,如果在源代码中找不到页面中的标题“优孚计算机网络-前端攻城师”,则可以断定是JS渲染,数据是通过Ajax获取的
2分析请求
让我们转到最难的部分:查找数据请求。此步骤可以帮助我们的工具,主要是用于在浏览器中查看网络请求的开发人员工具
以chome为例。让我们打开“开发者工具”(windows上的F12和MAC上的Command+Alt+I),然后再次刷新页面(它也可能是一个下拉页面,简而言之,所有您认为可能触发新数据的操作),然后记住保留场景并逐个分析请求
这一步需要一点耐心,但并非没有规则可循。首先可以帮助我们的是上面的分类过滤器(所有、文档等)。如果是普通的Ajax,它将显示在XHR标记下,jsonp请求将显示在scripts标记下。这是两种常见的数据类型
然后你可以根据数据的大小来判断。通常,结果的大小越大,越有可能是返回数据的接口。其余的基本上取决于经验。例如,这里的“最新的?P=1&S=20”乍一看是可疑的
对于可疑地址,您可以查看响应主体是什么。我们无法在开发人员工具中清楚地看到它。我们复制/API/文章/最新版本?P=1&S=20到地址栏,并再次请求它(如果您安装了chrome推荐的JSON查看器,则可以方便地查看Ajax结果)。看看结果,我们似乎找到了我们想要的
同样,我们转到post详细信息页面,找到了对特定内容的请求:/API/article/a0y2
以上信息摘自webmagic 查看全部
htmlunit 抓取网页(AngularJS-pageapplication框架如何判断前端渲染判断页面多)
抓取前端呈现页面
随着Ajax技术的不断普及和angularjs等单页应用框架的出现,越来越多的页面被JS呈现。对于爬虫来说,这种页面很烦人:仅提取HTML内容通常无法获得有效信息。那么如何处理这种页面呢?一般来说,有两种方法:
在爬行阶段,浏览器内核内置到爬行器中,页面在爬行之前由JS呈现。这方面的相应工具是selenium、htmlunit或phantom JS。然而,这些工具存在一些效率问题,并且不太稳定。其优点是编写规则与静态页面相同。由于JS呈现页面的数据也是从后端获取的,基本上是通过Ajax获取的,因此分析Ajax请求并找到相应的数据请求也是可行的。此外,与页面样式相比,此界面不太可能更改。缺点是找到这个请求并模拟它是一个相对困难的过程,需要相对较多的分析经验
比较这两种方法,我的观点是,对于一次性或小规模的需求,第一种方法可以节省时间和精力。然而,对于长期和大规模的需求,第二个将更可靠。对于一些网站,甚至一些JS混淆技术,目前,第一种方法基本上是万能的,而第二种方法将非常复杂
这里我们以angularjs中文社区{{global.Metallic}为例
1如何判断前端渲染
判断页面是否以JS呈现的方法相对简单。在浏览器中直接查看源代码(windows中为Ctrl+u,MAC中为Command+Alt+u)。如果找不到有效的信息,基本上肯定会在JS中呈现
在本例中,如果在源代码中找不到页面中的标题“优孚计算机网络-前端攻城师”,则可以断定是JS渲染,数据是通过Ajax获取的
2分析请求
让我们转到最难的部分:查找数据请求。此步骤可以帮助我们的工具,主要是用于在浏览器中查看网络请求的开发人员工具
以chome为例。让我们打开“开发者工具”(windows上的F12和MAC上的Command+Alt+I),然后再次刷新页面(它也可能是一个下拉页面,简而言之,所有您认为可能触发新数据的操作),然后记住保留场景并逐个分析请求
这一步需要一点耐心,但并非没有规则可循。首先可以帮助我们的是上面的分类过滤器(所有、文档等)。如果是普通的Ajax,它将显示在XHR标记下,jsonp请求将显示在scripts标记下。这是两种常见的数据类型
然后你可以根据数据的大小来判断。通常,结果的大小越大,越有可能是返回数据的接口。其余的基本上取决于经验。例如,这里的“最新的?P=1&S=20”乍一看是可疑的
对于可疑地址,您可以查看响应主体是什么。我们无法在开发人员工具中清楚地看到它。我们复制/API/文章/最新版本?P=1&S=20到地址栏,并再次请求它(如果您安装了chrome推荐的JSON查看器,则可以方便地查看Ajax结果)。看看结果,我们似乎找到了我们想要的
同样,我们转到post详细信息页面,找到了对特定内容的请求:/API/article/a0y2
以上信息摘自webmagic
htmlunit 抓取网页(()软件介绍支持RSS的定制功能(组图))
网站优化 • 优采云 发表了文章 • 0 个评论 • 81 次浏览 • 2021-09-16 17:21
网络爬虫是一种具有强大定制功能的新闻阅读工具。它可以抓取任何链接中的网站,极大地方便了需要获取每个站点信息的工作人员,提高了效率,节省了时间
软件介绍
支持RSS,包括RSS0.9/1.0 /2.0、原子、OPML等
支持在任何站点抓取任何链接
多站点同步更新(多线程)
您可以自定义对指定链接的捕获或排除
支持IE cookie的自动调用,适合需要登录的论坛
如果没有提示MSVCR71.DLL文件,请下载并放在webclawer的同级目录下
绿色软件,无需安装,可存储在U盘上执行
点击下载软件
软件使用
软件不需要安装。解压缩后,双击将其打开。界面如图所示
<IMG title=001 alt=001 src="//img2.pconline.com.cn/pconline/0804/22/1275786_001.jpg" border=0>
图1软件界面
让我们以太平洋软件信息和应用程序专栏为例,了解如何使用webclawer
打开软件,展开相应列,右键点击,在菜单中选择“新建频道”,如图所示
<IMG title=002 alt=002 src="//img2.pconline.com.cn/pconline/0804/22/1275786_002.jpg" border=0>
图2添加通道
在新频道中,依次输入频道名称、评论、分类和URL地址,选择文件类型-选择RSS模式,完成后保存。如图所示
<IMG title=003 alt=003 src="//img2.pconline.com.cn/pconline/0804/22/1275786_003.jpg" border=0>
图3添加通道接口
<IMG title=004 alt=004 src="//img2.pconline.com.cn/pconline/0804/22/1275786_004.jpg" border=0>
图4填写频道信息
添加栏目后,只需选择相应的标题,每次右键点击“更新”,软件即可自动捕获更新后的页面
虽然软件很小,但对于每天需要查看大量信息的朋友来说,这可以批量更新每个站点的每个栏目,节省大量重复性工作,达到提高工作效率的目的。我希望这个软件能给你带来方便 查看全部
htmlunit 抓取网页(()软件介绍支持RSS的定制功能(组图))
网络爬虫是一种具有强大定制功能的新闻阅读工具。它可以抓取任何链接中的网站,极大地方便了需要获取每个站点信息的工作人员,提高了效率,节省了时间
软件介绍
支持RSS,包括RSS0.9/1.0 /2.0、原子、OPML等
支持在任何站点抓取任何链接
多站点同步更新(多线程)
您可以自定义对指定链接的捕获或排除
支持IE cookie的自动调用,适合需要登录的论坛
如果没有提示MSVCR71.DLL文件,请下载并放在webclawer的同级目录下
绿色软件,无需安装,可存储在U盘上执行
点击下载软件
软件使用
软件不需要安装。解压缩后,双击将其打开。界面如图所示
<IMG title=001 alt=001 src="//img2.pconline.com.cn/pconline/0804/22/1275786_001.jpg" border=0>
图1软件界面
让我们以太平洋软件信息和应用程序专栏为例,了解如何使用webclawer
打开软件,展开相应列,右键点击,在菜单中选择“新建频道”,如图所示
<IMG title=002 alt=002 src="//img2.pconline.com.cn/pconline/0804/22/1275786_002.jpg" border=0>
图2添加通道
在新频道中,依次输入频道名称、评论、分类和URL地址,选择文件类型-选择RSS模式,完成后保存。如图所示
<IMG title=003 alt=003 src="//img2.pconline.com.cn/pconline/0804/22/1275786_003.jpg" border=0>
图3添加通道接口
<IMG title=004 alt=004 src="//img2.pconline.com.cn/pconline/0804/22/1275786_004.jpg" border=0>
图4填写频道信息
添加栏目后,只需选择相应的标题,每次右键点击“更新”,软件即可自动捕获更新后的页面
虽然软件很小,但对于每天需要查看大量信息的朋友来说,这可以批量更新每个站点的每个栏目,节省大量重复性工作,达到提高工作效率的目的。我希望这个软件能给你带来方便
htmlunit 抓取网页(使用本文中推荐的开源工具——HtmlUnit,一款能够模拟浏览器的抓包神器!)
网站优化 • 优采云 发表了文章 • 0 个评论 • 122 次浏览 • 2021-09-16 10:26
之前,Yifeng写了一篇关于使用jsup获取web内容文章的文章:
[jsup]HTML解析器,便于访问web内容
jsup提供的API非常方便。它完全类似于jQuery操作,可以轻松地抓取网页数据。然而,像jsup这样的普通爬虫工具无法处理JS生成的内容
做过HTML开发的人都知道,许多网站现在正在使用Ajax和JavaScript来获取和处理数据。普通的爬虫工具无法处理JS中的内容
例如,我们在本地创建一个新的测试网页文件text.html。源代码如下:
main.html
a {
line-height: 30px;
margin: 20px;
}
var datas = [ {
href : "http://www.jianshu.com/p/8d8edf25850d",
title : "推荐一款编程字体,让代码看着更美"
}, {
href : "http://www.jianshu.com/p/153d9f31288d",
title : "Android 利用Camera实现中轴3D卡牌翻转效果"
}, {
href : "http://www.jianshu.com/p/d6fb0c9c9c26",
title : "【Eclipse】挖掘专属最有用的快捷键组合"
}, {
href : "http://www.jianshu.com/p/72d69b49d135",
title : "【IIS】Windows下利用IIS建立网站并实现局域网共享"
} ];
window.onload = function() {
var infos = document.getElementById("infos");
for( var i = 0 ; i < datas.length ; i++)
{
var a = document.createElement("a");
a.href = datas[i].href ;
a.innerText = datas[i].title;
infos.appendChild(a);
infos.appendChild(document.createElement("br"))
}
}
HtmlUnit 测试网页内容!
通过IIS发布本地网站(请参阅文章:
[IIS]使用IIS建立网站并在Windows下实现局域网共享)
浏览器中显示的网页效果如下:
网页显示效果.jpg
尽管您可以通过web page review元素看到正文收录网页显示中的文本内容:
Page review element.jpg
但是,它不能通过jsup工具使用!从网页源代码中,我们可以看到,我们需要抓取的内容是在页面显示后通过Ajax和JavaScript加载的
那又怎样?使用本文推荐的开源工具htmlunit,它是一个包捕获工件,可以模拟浏览器
在官网上下载相应的jar包,并将其添加到项目库中。简单测试代码如下所示:
import java.io.IOException;
import java.net.MalformedURLException;
import java.text.ParseException;
import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.DomElement;
import com.gargoylesoftware.htmlunit.html.DomNodeList;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
/**
* @author 亦枫
* @created_time 2016年1月12日
* @file_user_todo Java测试类
* @blog http://www.jianshu.com/users/1 ... icles
*/
public class JavaTest {
/**
* 入口函数
* @param args
* @throws ParseException
*/
public static void main(String[] args) throws ParseException {
try {
WebClient webClient = new WebClient(BrowserVersion.CHROME);
HtmlPage htmlPage = (HtmlPage) webClient.getPage("http://localhost/test.html");
DomNodeList domNodeList = htmlPage.getElementsByTagName("a");
for (int i = 0; i < domNodeList.size(); i++) {
DomElement domElement = (DomElement) domNodeList.get(i);
System.out.println(domElement.asText());
}
webClient.close();
} catch (FailingHttpStatusCodeException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
运行后,结果打印在控制台上:
Htmlunit test results.jpg
如您所见,htmlunit可以获取Ajax和JavaScript加载的内容
htmlunit的介绍在官方网站上非常详细。以下内容为益丰翻译的一部分,供您参考:
Htmlunit是一个基于Java的浏览器程序,没有图形界面。它可以调用HTML文档,并为开发人员提供API以获取web内容、填写表单、单击超链接等
它可以很好地支持JavaScript,并且仍在改进中。同时,它可以解析非常复杂的Ajax库,并在不同配置下模拟chrome、Firefox和IE浏览器
Htmlunit通常用于测试目的和检索网站信息
Htmlunit提供了许多用于测试web请求和捕获web内容的功能。你可以去官网或其他网站学习和使用它 查看全部
htmlunit 抓取网页(使用本文中推荐的开源工具——HtmlUnit,一款能够模拟浏览器的抓包神器!)
之前,Yifeng写了一篇关于使用jsup获取web内容文章的文章:
[jsup]HTML解析器,便于访问web内容
jsup提供的API非常方便。它完全类似于jQuery操作,可以轻松地抓取网页数据。然而,像jsup这样的普通爬虫工具无法处理JS生成的内容
做过HTML开发的人都知道,许多网站现在正在使用Ajax和JavaScript来获取和处理数据。普通的爬虫工具无法处理JS中的内容
例如,我们在本地创建一个新的测试网页文件text.html。源代码如下:
main.html
a {
line-height: 30px;
margin: 20px;
}
var datas = [ {
href : "http://www.jianshu.com/p/8d8edf25850d",
title : "推荐一款编程字体,让代码看着更美"
}, {
href : "http://www.jianshu.com/p/153d9f31288d",
title : "Android 利用Camera实现中轴3D卡牌翻转效果"
}, {
href : "http://www.jianshu.com/p/d6fb0c9c9c26",
title : "【Eclipse】挖掘专属最有用的快捷键组合"
}, {
href : "http://www.jianshu.com/p/72d69b49d135",
title : "【IIS】Windows下利用IIS建立网站并实现局域网共享"
} ];
window.onload = function() {
var infos = document.getElementById("infos");
for( var i = 0 ; i < datas.length ; i++)
{
var a = document.createElement("a");
a.href = datas[i].href ;
a.innerText = datas[i].title;
infos.appendChild(a);
infos.appendChild(document.createElement("br"))
}
}
HtmlUnit 测试网页内容!
通过IIS发布本地网站(请参阅文章:
[IIS]使用IIS建立网站并在Windows下实现局域网共享)
浏览器中显示的网页效果如下:
网页显示效果.jpg
尽管您可以通过web page review元素看到正文收录网页显示中的文本内容:
Page review element.jpg
但是,它不能通过jsup工具使用!从网页源代码中,我们可以看到,我们需要抓取的内容是在页面显示后通过Ajax和JavaScript加载的
那又怎样?使用本文推荐的开源工具htmlunit,它是一个包捕获工件,可以模拟浏览器
在官网上下载相应的jar包,并将其添加到项目库中。简单测试代码如下所示:
import java.io.IOException;
import java.net.MalformedURLException;
import java.text.ParseException;
import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.DomElement;
import com.gargoylesoftware.htmlunit.html.DomNodeList;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
/**
* @author 亦枫
* @created_time 2016年1月12日
* @file_user_todo Java测试类
* @blog http://www.jianshu.com/users/1 ... icles
*/
public class JavaTest {
/**
* 入口函数
* @param args
* @throws ParseException
*/
public static void main(String[] args) throws ParseException {
try {
WebClient webClient = new WebClient(BrowserVersion.CHROME);
HtmlPage htmlPage = (HtmlPage) webClient.getPage("http://localhost/test.html");
DomNodeList domNodeList = htmlPage.getElementsByTagName("a");
for (int i = 0; i < domNodeList.size(); i++) {
DomElement domElement = (DomElement) domNodeList.get(i);
System.out.println(domElement.asText());
}
webClient.close();
} catch (FailingHttpStatusCodeException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
运行后,结果打印在控制台上:
Htmlunit test results.jpg
如您所见,htmlunit可以获取Ajax和JavaScript加载的内容
htmlunit的介绍在官方网站上非常详细。以下内容为益丰翻译的一部分,供您参考:
Htmlunit是一个基于Java的浏览器程序,没有图形界面。它可以调用HTML文档,并为开发人员提供API以获取web内容、填写表单、单击超链接等
它可以很好地支持JavaScript,并且仍在改进中。同时,它可以解析非常复杂的Ajax库,并在不同配置下模拟chrome、Firefox和IE浏览器
Htmlunit通常用于测试目的和检索网站信息
Htmlunit提供了许多用于测试web请求和捕获web内容的功能。你可以去官网或其他网站学习和使用它