htmlunit抓取js执行后的网页源码

110 篇文章 6 订阅

上次我不是写了一个自动抓取博客访问量吗 (点击打开链接) 可是昨天晚上我又运行的时候,发现不能用了。。

运行了几次 发现使用URLConnection 得到的网页源码和浏览器直接查看的不同。 URLConnection 使用IO流读取到的源码

只有积分  没有访问量了

而使用浏览器访问 直接查看源码

有访问。

这也就导致了我的程序不能用了  需要更新了

 

想想原因   可能是幕后主使人把访问量放在了js里面   动态展示,而我使用URLConnection 访问的静态界面  确确实实没有收到。

于是开始百度了  百度过来 百度过去。。

发现了一个回复了三年还没有结贴的帖子

 

java爬虫项目,如何获取js执行后的完整网页源代码?  

里面回复了好多方法  发现有个htmlunit  于是就自己测试一下
发现真的可以。得到了js执行后的源码。
废话不说了。
方法如下
public static void main(String[] args) throws FailingHttpStatusCodeException, MalformedURLException, IOException {
		// TODO Auto-generated method stub
		WebClient wc=new WebClient(BrowserVersion.FIREFOX_24);
		wc.setJavaScriptTimeout(5000);
		wc.getOptions().setUseInsecureSSL(true);//接受任何主机连接 无论是否有有效证书
		wc.getOptions().setJavaScriptEnabled(true);//设置支持javascript脚本 
		wc.getOptions().setCssEnabled(false);//禁用css支持
		wc.getOptions().setThrowExceptionOnScriptError(false);//js运行错误时不抛出异常
		wc.getOptions().setTimeout(100000);//设置连接超时时间
		wc.getOptions().setDoNotTrackEnabled(false); 
		HtmlPage page=wc.getPage("http://blog.csdn.net/su20145104009?viewmode=contents");
		
		String res=page.asText();
		//处理源码
		deal(res);
		
	}

最后得到的源码如下:
其它的代码和 点击打开链接 这篇文章相比几乎没变。如果不明白 可以去看一下  这里就不再赘述了
 
执行后  成功写入到txt文档
使用了htmlunit会弹出好多异常警告
加上这些代码  就会消失了~
LogFactory.getFactory().setAttribute("org.apache.commons.logging.Log",    "org.apache.commons.logging.impl.NoOpLog");

		java.util.logging.Logger.getLogger("com.gargoylesoftware.htmlunit")
		    .setLevel(Level.OFF);

		java.util.logging.Logger.getLogger("org.apache.commons.httpclient")
		    .setLevel(Level.OFF);

由于我们在这里 引入了htmlunit 的jar包  .那么再用上次的脚本批量处理 就行不通了 ~
而且要引入的jar包也不是一个  是多个  所以要批量处理了
首先我们要把所有要用的jar包 使用-cp命令导入。
可是htmlunit的jar包太多了  所以想到一个方法  使用for循环遍历htmlunit文件夹里面的jar文件  将其处理为一个字符串 然后再使用-cp命令 全部代码如下
echo off
setlocal enabledelayedexpansion
::定义一个字符串
set str=
::遍历htmlunit文件夹
for /f "delims=" %%a in ('dir /b "E:\lib\htmlunit-2.14-bin\lib\*.jar"') do (
set "str=!str!E:\lib\htmlunit-2.14-bin\lib\%%a;"
)
echo on
e:
javac -cp .;%str% AutoMarkBlogView.java
java -cp .;%str% AutoMarkBlogView
pause
运行结果如下:

 
 

 

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 14
    评论
htmlunit-core-js 是一个基于 Rhino JavaScript 引擎的 JavaScript 引擎,它可以帮助你在 Java 应用程序中运行 JavaScript 代码。下面是一个简单的示例,演示如何使用 htmlunit-core-js 运行 JavaScript 代码: ```java import org.mozilla.javascript.Context; import org.mozilla.javascript.Scriptable; import org.mozilla.javascript.ScriptableObject; import com.gargoylesoftware.htmlunit.WebClient; import com.gargoylesoftware.htmlunit.html.HtmlPage; public class HtmlUnitCoreJsExample { public static void main(String[] args) throws Exception { // 创建一个 JavaScript 引擎上下文 Context context = Context.enter(); try { // 创建一个顶级作用域对象 Scriptable scope = context.initStandardObjects(); // 将一个 Java 对象添加到 JavaScript 环境中 Object wrappedOut = Context.javaToJS(System.out, scope); ScriptableObject.putProperty(scope, "out", wrappedOut); // 执行一段 JavaScript 代码 String script = "var message = 'Hello, world!'; out.println(message);"; context.evaluateString(scope, script, "example", 1, null); // 使用 HTMLUnit执行 JavaScript 代码 WebClient webClient = new WebClient(); HtmlPage page = webClient.getPage("https://www.baidu.com/"); String pageTitle = (String) context.evaluateString(scope, "document.title", "example", 1, null); System.out.println("Page title: " + pageTitle); } finally { // 释放 JavaScript 引擎上下文 Context.exit(); } } } ``` 这个示例包括以下步骤: 1. 创建一个 JavaScript 引擎上下文。 2. 创建一个顶级作用域对象,并将一个 Java 对象添加到 JavaScript 环境中。 3. 执行一段 JavaScript 代码,将输出打印到控制台。 4. 使用 HTMLUnit 库加载一个网页,并在 JavaScript 引擎环境中获取页面标题。 5. 释放 JavaScript 引擎上下文。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值