当前位置:编程学习 > JAVA >>

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

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

一、问题描述:
    现有一个java爬虫项目,需要获取网页中的javascript执行后生成的完整的网页源码(通常使用的右键-查看源代码是看不到js执行后的内容的,用firefox的firebug看到的代码就是js执行后的代码),从中提取一些有用的数据。目前用到的方案是SWT调用IE浏览器内核来执行网页并获取代码,这种方式有两个地方存在严重不足:

1.效率低下,且不够灵活。需要根据目标网站的效应速度和自身爬虫机器的网络情况来设置爬取的超时时间,这样一来抓取一个URL页面可能需要10-30秒不等的时间,非常的慢。

2.由于IE内核本身的不稳定性,在通过浏览器模式抓取的时候偶尔会出现内存泄露从而导致整个程序死掉的严重问题。

求助:
不知道有没有其他的可替代方案,如:通过java的脚本执行引擎执行js来获取网页代码,或者其他的方案。请各位大侠帮忙,感激不尽! --------------------编程问答-------------------- 我虽然不会,但是现在很多爬虫程序都开源的啊,借鉴一下啊~ --------------------编程问答-------------------- 可以使用httpclient包去获取。 --------------------编程问答-------------------- 谢谢楼上的回复,
目前有用httpclient,但是它不能获取到执行js后的网页源代码。 --------------------编程问答-------------------- 你好,我现在遇到和你同样的问题,但是我现在连JS解析都无法做好,可以将你的源代码给我看一看吗?或者加我的QQ:445714189,希望能得到您的指点 --------------------编程问答-------------------- 这样不知道行不行
package ex30;

import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
import javax.swing.*;

public class ViewRemoteFile extends JApplet{
// Button to view the file
private JButton jbtView = new JButton("View");

// Text field to receive file name
private JTextField jtfURL = new JTextField(12);

// Text area to store file
private JTextArea jtaFile = new JTextArea();

// Label to display status
private JLabel jlblStatus = new JLabel();

/** Initialize the applet */
public void init(){
// Create a panel to hold a label, a text field, and a button
JPanel p1 = new JPanel();
p1.setLayout(new BorderLayout());
p1.add(new JLabel("Filename"), BorderLayout.WEST);
p1.add(jtfURL, BorderLayout.CENTER);
p1.add(jbtView, BorderLayout.EAST);

// Place text area and panel p to the applet
setLayout(new BorderLayout());
add(new JScrollPane(jtaFile), BorderLayout.CENTER);
add(p1, BorderLayout.NORTH);
add(jlblStatus, BorderLayout.SOUTH);

// Register listener to handle the "View" button
jbtView.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
showFile();
}
});
}

private void showFile(){
java.util.Scanner input = null;  // Use Scanner for text input
URL url = null;

try{
// Obtain URL from the text field
url = new URL(jtfURL.getText().trim());

// Create a Scanner for input stream
input = new java.util.Scanner(url.openStream());

// Read a line and append the line to the text area
while(input.hasNext()){
jtaFile.append(input.nextLine() + "\n");
}

jlblStatus.setText("File loaded successfully");
}
catch(MalformedURLException ex){
jlblStatus.setText("URL " + url + " not found");
}
catch(IOException e){
jlblStatus.setText(e.getMessage());
}
finally{
if(input != null)  input.close();
}
}

}

输入网址是要http://www.baidu.com这样的形式 --------------------编程问答-------------------- 至于JApplet完全可以用JFrame代替 --------------------编程问答-------------------- 求助:
不知道有没有其他的可替代方案,如:通过java的脚本执行引擎执行js来获取网页代码,或者其他的方案。请各位大侠帮忙,感激不尽!

好像没办法实现吧,js执行过程需要构建运行环境才能实现。例如页面引用了jquery、extjs这些东西,js运行后必须要修改了dom的结构的。
除非你自己写个js引擎,呵呵 --------------------编程问答-------------------- 菜鸟围观,路过。 --------------------编程问答-------------------- 楼主有兴趣的话,可以看看HtmlUnit,http://htmlunit.sourceforge.net/ --------------------编程问答-------------------- HtmlUnit模拟浏览器的行为,但因为没有GUI,所以比浏览器更快,不过也还是需要几秒的时间 --------------------编程问答-------------------- 关注,我也想抓取 异步的数据 --------------------编程问答-------------------- 感谢网友们的回复 --------------------编程问答-------------------- 用正则表达式抓啊 朋友 --------------------编程问答--------------------

URL url =  new URL("http://www.baidu.com");

BufferedReader buff  = new BufferedReader(new InputStreamReader(url.openStream()));
StringBuilder sb = new StringBuilder();
String s = null;
while((s = buff.readLine()) != null){
  sb.append(s+"\n");
}
System.out.println(sb);


这种方式跟5楼的一样结果。
不知道楼主现在项目还有没有做出来。
还有就是只能抓取当前页面中有的东西。没有的东西是不能抓取到的。

还有抓取时好听的。。。。个人觉得。。。应该是读取。IO流了。
--------------------编程问答--------------------   手工模拟js的执行流程,至于有数值要取的话,有jdk自带的js引擎,得出的结果附上去,用Httpclient模拟跳转。。就行了。。具体的代码就只好楼主自己去写了 --------------------编程问答-------------------- 不知楼主有没有搞定这个事情,我现在也在头痛这个情况,主要是提取淘宝上的其他卖家的数据,但很多数据都是后期生产的,直接通过看源码是没有的...楼主有空可以和我联系一下,我的QQ是:6274377,谢谢! --------------------编程问答-------------------- 不知楼主有没有搞定这个事情,我现在也在头痛这个情 --------------------编程问答-------------------- 不知楼主有没有搞定这个事情,我现在也在头痛这个情 --------------------编程问答-------------------- 同楼上,同样纠结中 --------------------编程问答--------------------
引用 10 楼  的回复:
HtmlUnit模拟浏览器的行为,但因为没有GUI,所以比浏览器更快,不过也还是需要几秒的时间

感觉可用 --------------------编程问答-------------------- 有没有人用HtmlUnit这个,怎么获取加载完的页面的源文件啊。网上例子太少也查不到,哪个大虾知道了,告知一下 --------------------编程问答-------------------- --------------------编程问答-------------------- 怎么我自己写的爬虫程序,使用HttpUrlConnection方式,获取网页内容比,浏览器打开的速度还要慢呢? --------------------编程问答-------------------- 最近也在玩httpClient,发现很不方便,后来就想找可以通过以节点形式读取html的工具。发现jsoup非常好用。本人新手,代码不太健全,请见谅。

/**
 * 读取url地址,封装一个新闻实体对象
 * @param url 
 * @param title 新闻标题
 * @return
 */
public News readNews(String url, String title) {

News news = null;

try {
//jsoup读取html
org.jsoup.nodes.Document doc = Jsoup.parse(new URL(url), 2000);

//body
Element content = doc.body();
//所有的h1 node
Elements links = content.getElementsByTag("h1");

String html = null;
if (links.isEmpty()) {
return null;
}

Element e = null;

for (Element link : links) {
//如果该node的文本节点包含新闻标题title
if (link.text().contains(title)) {
e = link;
break;
}
}

if (e != null) {
html = e.parent().toString();
news = new News();
news.setTitle(title);
news.setContent(html);
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (ParseException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

return news;

}


jsoup能很方便的读取和操作html,就想jquery一样。希望能给与楼主帮助。 --------------------编程问答--------------------
引用 15 楼  的回复:
  手工模拟js的执行流程,至于有数值要取的话,有jdk自带的js引擎,得出的结果附上去,用Httpclient模拟跳转。。就行了。。具体的代码就只好楼主自己去写了


手工模拟js的执行流程只是理路上可行,但怎么去模拟呢?没有可行性。 --------------------编程问答-------------------- 楼主的问题解决没有?我现在也碰到这样的问题,项目比较急,求教!另求教如何获取登录后的页面源码,加QQ:290039507 --------------------编程问答-------------------- 可以想简单一点。JS也是会请求服务器的。
首先你要获取请求的地址,这个可以利用谷歌浏览器查看一下,然后用HttpClient模拟请求那个地址就可以了。我之前做爬虫爬取新浪微博就是这样做的。 --------------------编程问答-------------------- 你要想:一切都是服务器返回的流而已,可以获取流么。分太少了,才20分 --------------------编程问答--------------------
引用 27 楼  的回复:
可以想简单一点。JS也是会请求服务器的。
首先你要获取请求的地址,这个可以利用谷歌浏览器查看一下,然后用HttpClient模拟请求那个地址就可以了。我之前做爬虫爬取新浪微博就是这样做的。


纠正一下你的观点哈,不是所有js都要请求服务器的,如:document.getElementById("content").innerHTML="content";这个就不会去请求服务器。 --------------------编程问答--------------------
引用 28 楼  的回复:
你要想:一切都是服务器返回的流而已,可以获取流么。分太少了,才20分

如果您能给出好的解决方案,分数可以多加。 --------------------编程问答-------------------- 不知楼主是否解决 ,求解答啊! --------------------编程问答-------------------- 还没有好的解决方案,继续等解答哈。
谁知道使用java调用webkit的方式(非android平台那种调用哈)呢? --------------------编程问答-------------------- 同求啊,不知道哪位大侠能帮忙解决下 --------------------编程问答-------------------- 目前想到一种方式:通过swing调用javaFX里面的webview webegine来加载页面,但是不知道如何才能让webkit不去下载页面中的图片,类似实现浏览器的无图片模式。对于webkit肯定是有这个功能的,就是不知道有没有类似的java api可直接设置。 --------------------编程问答-------------------- 我也找了好久,最终找到你这个帖子来了,只能放弃了,就算可以运行js也会大幅度的降低效率 --------------------编程问答-------------------- htmlunit + jsoup可以搞定楼主需要的问题 --------------------编程问答-------------------- htmlunit 完全能满足楼主的要求 --------------------编程问答-------------------- 现在的搜索引擎都没有关注页面里脚本执行后的情况

本人帮别人做过网站,在考虑搜索引擎优化时,都要求把关键信息和链接直接生成在页面里,而不是通过 js 动态展示 --------------------编程问答-------------------- 比如一个简单例子,一个网站的首页是:
<script type="text/javascript">
document.ready(function(){
    $.ajax({
          ......
          success: function(data){
              $("#div1").html(data);
          }
    });
});
</script>
<div id="div1">
</div>


那么你的搜索排名永远都无法靠前
--------------------编程问答-------------------- ScriptEngine,楼主,java能直接执行js脚本的,但是需要你构建html环境放到参数里面去,这个比较困难 --------------------编程问答-------------------- 同求,jsoup.Connect和httpclient的response获得的html含有js异步加载的信息,拿不到,而js向服务器的请求需要一些参数,这些参数又是不同的js之类的动态生成的,,,,没法模拟请求,,,纠结,求教!! --------------------编程问答-------------------- 朋友, 你的这个帖子的问题,现在有什么解决办法了吗? --------------------编程问答-------------------- 百度知道里面的吗?我也遇到了。以前可以直接采集数据,现在不行了。其实有解决方案的! --------------------编程问答-------------------- htmlunit --------------------编程问答-------------------- 想知道楼主是否有解决方法,有的话可以拿出来学习一下吗?刚开始学做这个东西,完全没有头绪的样子。。。 --------------------编程问答-------------------- jsoup使用这个jar试试 --------------------编程问答-------------------- 楼主是怎么解决的    现在我正在头疼这个问题,如何能获得firebug那样的完整数据。qq:372990820 --------------------编程问答-------------------- 用HtmlUnit。它本身就是一个单元测试组件,包含了极高的容错性。只要你有足够的异常处理,不会导致程序崩溃。只是API比较复杂。。要研究 --------------------编程问答-------------------- 除 --------------------编程问答-------------------- htmlunit 我也在求解这方面的难题 --------------------编程问答-------------------- 24楼有提到了jsoup,有没有试试 --------------------编程问答-------------------- 这不是个简单的事情,楼主感兴趣可以去试试
qt jambi加QtWebKit

或者还给你找到一个
WebKit for SWT

或者也可以试试JavaFX好像带一个webview
http://docs.oracle.com/javafx/2/webview/jfxpub-webview.htm
--------------------编程问答-------------------- 上面他们说过的HtmlUnit好像确实也行 --------------------编程问答-------------------- 最近怎么这么多人在关注这个事情

急呀,关注中....... --------------------编程问答-------------------- 关注一下,研究中,希望有结果的朋友能和大家分享一下
话说这帖都一周年了,还这么火 --------------------编程问答-------------------- /**
 * 通过Selenium库批量获取HTML页面内容
 * @param urls              HTML页面链接集合
 * @param enableJavaScript  是否启用JavaScript
 * @return
 */
public static List<String> getHTMLBySelenium(Collection<String> urls,boolean enableJavaScript){
if(GerneralUtils.isEmptyCollection(urls)) {
return null;
}
WebDriver driver = new HtmlUnitDriver(enableJavaScript);
List<String> pageList = new ArrayList<String>();
for (String url : urls) {
driver.get(url);
String html = driver.getPageSource();
pageList.add(html);
}
driver.quit();
return pageList;
}
Java飞虎队欢迎各路菜鸟老鸟加入一起交流讨论。群号105098806 --------------------编程问答-------------------- htmlunit可以解析js,但会抛出很多异常,虽然可以运行,但看到这么多异常好烦 --------------------编程问答-------------------- TO #27 & #28 & 所有认为js都会访问服务器的朋友:
你们的这种观点是不正确的,并不是所有js都会与服务器通信(常见的ajax),如:
$('#id').html('xxxxxxxx');
html脚本中直接包含有需要填充的数据,现在很多网站都有这种,比如新浪图片浏览页,京东首页等等。 --------------------编程问答-------------------- htmlunit基本能满足,(可以设置不现实异常信息——>options)
但是不能解决这种情况:
通过滚动页面加载数据
因为htmlunit不支持页面滚动的js代码,如果有朋友能用htmlnuit搞定,可以把我所有的分送出 --------------------编程问答-------------------- 给你介绍个宝贝~jsoup --------------------编程问答-------------------- 我也是遇到响应时一堆js代码,仔细一看我需要的数据是js代码生成出来的. 
再仔细一看,那堆js里发送了ajax请求,再找找就找到了请求连接,直接请求那个连接,数据就得到了....
我这是一种情况.与大家分享. --------------------编程问答-------------------- 肯能我的能力不够吧  用url在加io就可以读取了,速度很快啊 一千多个网页几十秒钟,不知道能不能帮你 --------------------编程问答--------------------
引用 7 楼 WxmJun 的回复:
求助:
不知道有没有其他的可替代方案,如:通过java的脚本执行引擎执行js来获取网页代码,或者其他的方案。请各位大侠帮忙,感激不尽!

好像没办法实现吧,js执行过程需要构建运行环境才能实现。例如页面引用了jquery、extjs这些东西,js运行后必须要修改了dom的结构的。
除非你自己写个js引擎,呵呵


我教你个方法,
JavascriptEngine
,jdk 自带的,我们项目里就是用这个来执行和解析javascript,好用的很!! --------------------编程问答-------------------- u010682529,如何用JavascriptEngine解析网页?因为不知道这个网页有哪些javascript代码 --------------------编程问答-------------------- 怎么好像很多人关注的样子啊?!

我也在研究这方面的问题,但是卡住了!

其实看相关的paper,倒是有一些方法,比如在本地建立浏览器对象,在本地实现DOM的建立,然后调用JS引擎进行处理。

不过,说好说,做起来好没有头绪啊……

不知道LZ现在进展如何了?又是通过什么实现的呢,是用HtmlUnit么? --------------------编程问答-------------------- 叫淘宝公开API啊,省的大家费劲抓 --------------------编程问答-------------------- 这么简单的问题,httpunit搞定。而且偶已经爬了几年了。 --------------------编程问答-------------------- 各位有没有做花瓣画板采集的,瀑布流网页AJAX,我用网页代码中的KEY转换URL下载图,问题是只能获取开头加载的二十张,怎么获取异步进来的代码啊? --------------------编程问答-------------------- 除 --------------------编程问答-------------------- 用selenium webdriver 可以实现 或者PhantomJS --------------------编程问答-------------------- 我还是详细点吧,比如这个html代码:
<html><head><title>Table sample</title></head><body>
    <form action='/foo' name='form1'>
    <table id="table1">
        <script type="text/javascript">
            for (i = 1; i <= 5; i++) {
                document.write("<tr><td>" + i
                    + "</td><td><input name='textfield" + i
                    + "' type='text'></td></tr>");
            }
        </script>
    </table></form>
</body></html>

用jsoup得到的就是这个代码,但是我们要得到js执行后的代码,可以用selenium webdriver,举例用HtmlUnitDriver(无界面的),代码如下:


import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.htmlunit.HtmlUnitDriver;

public class Testjsoup {
public static void main(String[] args) throws IOException {
HtmlUnitDriver driver = new HtmlUnitDriver(true);
//WebDriver driver = new FirefoxDriver();
driver.get("file:///C:/Users/jgong/Desktop/test.html");
System.out.println(driver.getPageSource());
driver.quit();
}

}



运行后,输出的结果如下:

<?xml version="1.0" encoding="ISO-8859-1"?>
<html>
  <head>
    <title>
      Table sample
    </title>
  </head>
  <body>
    <form action="/foo" name="form1">
      <table id="table1">
        <script type="text/javascript">
//<![CDATA[

            for (i = 1; i <= 5; i++) {
                document.write("<tr><td>" + i
                    + "</td><td><input name='textfield" + i
                    + "' type='text'></td></tr>");
            }
        
//]]>
        </script>
        <tbody>
          <tr>
            <td>
              1
            </td>
            <td>
              <input name="textfield1" type="text"/>
            </td>
          </tr>
          <tr>
            <td>
              2
            </td>
            <td>
              <input name="textfield2" type="text"/>
            </td>
          </tr>
          <tr>
            <td>
              3
            </td>
            <td>
              <input name="textfield3" type="text"/>
            </td>
          </tr>
          <tr>
            <td>
              4
            </td>
            <td>
              <input name="textfield4" type="text"/>
            </td>
          </tr>
          <tr>
            <td>
              5
            </td>
            <td>
              <input name="textfield5" type="text"/>
            </td>
          </tr>
        </tbody>
      </table>
    </form>
  </body>
</html>

PS: 更多selenium webdriver 可访问:http://jarvi.iteye.com 或都 http://www.seleniumhq.org --------------------编程问答-------------------- file:///C:/Users/jgong/Desktop/test.html  这个是那个html的路径,自己改。 有什么问题到http://jarvi.iteye.com留言,谢谢 --------------------编程问答-------------------- 亲哥哥们啊,怎么就是没有htmlunit解决js加载问题的代码 --------------------编程问答--------------------
引用 58 楼 barrychenzhipinglan 的回复:
TO #27 & #28 & 所有认为js都会访问服务器的朋友:
你们的这种观点是不正确的,并不是所有js都会与服务器通信(常见的ajax),如:
$('#id').html('xxxxxxxx');
html脚本中直接包含有需要填充的数据,现在很多网站都有这种,比如新浪图片浏览页,京东首页等等。

TO #58 & #27 &28:
js当然可以不访问服务器,我想他们的意思模拟那些发起http请求的js,完成他们的功能。这个方法肯定可行,只是对比较复杂的网页(ajax泛滥),分析其http请求和数据包以及与服务器交互过程会比较复杂。理论上,模拟js(那些跟服务器交互的js),是万能的方法,但是缺点是不通用、繁琐。 --------------------编程问答--------------------
引用 57 楼 lgqjeson126 的回复:
htmlunit可以解析js,但会抛出很多异常,虽然可以运行,但看到这么多异常好烦

htmlunit的异常确实很烦,打开百度首页,就进入异常死掉了。 --------------------编程问答-------------------- 本人也在做这方面得探索,用python模拟登录某些热门网站。但是遇到了很尴尬
的事,即:
1)若使用比较高级(通用)的库来模拟交互,往往无法处理不规范网页,如htmlunit无法处理没有name,没有id的tag;
2)若从最底层做起,解析html,构造http请求,模拟js,会发现很繁琐且不通用,一个网站一个程序,改版了还得重来,而且对那些ajax泛滥的网站模拟js会非常困难。 --------------------编程问答-------------------- WebClient webClient = new WebClient(BrowserVersion.FIREFOX_17);
webClient.setAjaxController(new NicelyResynchronizingAjaxController());

String str1="http://ningbo.qd8.com.cn/renli/xinxi12_4799666.html";
HtmlPage htmlPage = webClient.getPage(str1);

System.out.println(htmlPage.asText());
webClient.closeAllWindows(); --------------------编程问答-------------------- view-source:http://www.163.com/ Use-agent 设置成火狐 试试 --------------------编程问答-------------------- 这个需要js引擎,另外,即使你有js引擎也无法根本性的解决问题
因为js里面还有事件,而事件要交互才能触发
即使你把所有事件都执行一遍,还有动态添加的事件监听器呢?
即便你能解决这问题,有的事件第一次运行和第二次运行走的程序不一样呢?今天运行和明天运行又不一样呢?

所以你永远不可能捕捉到js的全部结果 --------------------编程问答-------------------- 只要能获取dom就行,交给jsoup解析 --------------------编程问答-------------------- 我可以告诉楼主 这是个天坑 因为本人曾今搞过这个很长时间 但是最终没有找到一个可以快速爬取ajax页面的方法 其实楼主应该发现 百度google的爬虫为了快速爬取 也是不能获取ajax页面信息的 所以在设计网站的时候 如果希望被搜索引擎快速的收录 都会谨慎使用ajax延迟加载的技术 另外说一下 我当时用过mozilla浏览器插件 htmlunit+web-harvest 等等  --------------------编程问答-------------------- 本人最近也在研究这个问题,主要是获取新浪微博的内容。发现如果使用rhino,java再带的js引擎的话,需要自己构建html dom,让后在js中调用的document实际值java中构造的document对象,而对于document.write这样的方法,都需要自己再java的代码中按照功能去构建,不知道有没有现成的类似与浏览器构建的document window那样的对象java的实现 --------------------编程问答--------------------
引用 82 楼 liujj619 的回复:
本人最近也在研究这个问题,主要是获取新浪微博的内容。发现如果使用rhino,java再带的js引擎的话,需要自己构建html dom,让后在js中调用的document实际值java中构造的document对象,而对于document.write这样的方法,都需要自己再java的代码中按照功能去构建,不知道有没有现成的类似与浏览器构建的document window那样的对象java的实现
用htmlunit。 --------------------编程问答--------------------
引用 83 楼 barrychenzhipinglan 的回复:
Quote: 引用 82 楼 liujj619 的回复:

本人最近也在研究这个问题,主要是获取新浪微博的内容。发现如果使用rhino,java再带的js引擎的话,需要自己构建html dom,让后在js中调用的document实际值java中构造的document对象,而对于document.write这样的方法,都需要自己再java的代码中按照功能去构建,不知道有没有现成的类似与浏览器构建的document window那样的对象java的实现
用htmlunit。


引用 70 楼 qi_ling 的回复:
用selenium webdriver 可以实现 或者PhantomJS
我试了这种方法确实可以解析,但是有的网页会报错直接跳出来,新浪微博可以执行,最终会抛出很多异常,而且还会处理css,htmlunit没有试过,不知道会不会处理css。我只需要js执行过后的纯文本和链接信息。 --------------------编程问答--------------------
引用 84 楼 liujj619 的回复:
Quote: 引用 83 楼 barrychenzhipinglan 的回复:

Quote: 引用 82 楼 liujj619 的回复:

本人最近也在研究这个问题,主要是获取新浪微博的内容。发现如果使用rhino,java再带的js引擎的话,需要自己构建html dom,让后在js中调用的document实际值java中构造的document对象,而对于document.write这样的方法,都需要自己再java的代码中按照功能去构建,不知道有没有现成的类似与浏览器构建的document window那样的对象java的实现
用htmlunit。


引用 70 楼 qi_ling 的回复:
用selenium webdriver 可以实现 或者PhantomJS
我试了这种方法确实可以解析,但是有的网页会报错直接跳出来,新浪微博可以执行,最终会抛出很多异常,而且还会处理css,htmlunit没有试过,不知道会不会处理css。我只需要js执行过后的纯文本和链接信息。

htmlunit是无界面的java浏览器,不会加载css、图片等,会减少很多网络请求的开销 --------------------编程问答-------------------- 也在弄爬虫,楼主,麻烦私信给我下,谢谢。 --------------------编程问答-------------------- 顶一顶
我试过htmlunit,可以模拟执行js,可以提交表单,但是不能执行滚动窗口的js(Javascript:Window.scroll(0,600);)

还试过Cobra,也可以简单提交表单,但效果没htmlunit好。

希望有牛人可以介绍一下如何执行js,或者是能够模拟用户点击按钮、滚动窗口的一些工具。 --------------------编程问答-------------------- 除 --------------------编程问答-------------------- 除 --------------------编程问答-------------------- 顶上去 俺也遇到这样的问题!
如:
public class Test extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doPost(request, response);
}

public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

response.setContentType("text/html");
PrintWriter out = response.getWriter();
String js="JavaScript";
request.setAttribute("result", js);
request.getRequestDispatcher("/test.jsp").forward(request, response);
out.flush();
out.close();
}

}

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>My JSP 'test.jsp' starting page</title>
     <meta http-equiv="content-type" content="text/html; charset=GBK">
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">    
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<script type="text/javascript" src="http://code.jquery.com/jquery-1.5.min.js"></script>
<script type="text/javascript">
function test(){
  var result = '${result}';
    document.getElementById("text1").innerHTML=result;
   //$("#text1").innerHTML =result;
   //$("#text1").text(result);
//$("#text1").html(result);
}
$(document).ready(function(){
 var a=$("#text1").html('<h2 class="title">sssssssssssssssssssssssssssssss</h2> ');
 alert(a);
});
   </script>
  </head>
  
  <body> 
   <span id="text1">  </span>
  </body>
</html>


package com.test;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.methods.GetMethod;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;

public class Test1 {

public static void main(String[] args)throws Exception {
String url="http://localhost:8080/test/servlet/Test";
//String url="http://localhost:8080/springmvc001/";
HttpClient client=new HttpClient();
//PostMethod method=new PostMethod(url);
GetMethod method=new GetMethod(url);
int status=client.executeMethod(method);
if(status==HttpStatus.SC_OK){
String html=method.getResponseBodyAsString();
Document doc=Jsoup.parse(html);
System.out.println(doc.toString());
}else{
System.err.println("URL Exception");
}
}
}
--------------------编程问答-------------------- 除 --------------------编程问答-------------------- 同求解决方法 --------------------编程问答-------------------- 用 jsoup ,先把js运行掉再解析 --------------------编程问答--------------------
引用 24 楼 mohaijiang 的回复:
最近也在玩httpClient,发现很不方便,后来就想找可以通过以节点形式读取html的工具。发现jsoup非常好用。本人新手,代码不太健全,请见谅。

/**
 * 读取url地址,封装一个新闻实体对象
 * @param url 
 * @param title 新闻标题
 * @return
 */
public News readNews(String url, String title) {

News news = null;

try {
//jsoup读取html
org.jsoup.nodes.Document doc = Jsoup.parse(new URL(url), 2000);

//body
Element content = doc.body();
//所有的h1 node
Elements links = content.getElementsByTag("h1");

String html = null;
if (links.isEmpty()) {
return null;
}

Element e = null;

for (Element link : links) {
//如果该node的文本节点包含新闻标题title
if (link.text().contains(title)) {
e = link;
break;
}
}

if (e != null) {
html = e.parent().toString();
news = new News();
news.setTitle(title);
news.setContent(html);
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (ParseException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

return news;

}


jsoup能很方便的读取和操作html,就想jquery一样。希望能给与楼主帮助。

我也用的是jsoup,但是现在也遇到楼主所说的问题,我可以解析html文件,但是其中带有内嵌的形如:
<script type="text/javascript">
 function Div(exp1, exp2){
     ..................
 </script>的JS代码,解析了也没有任何意义,我们想得到JS执行后的html文件,不知道有什么方法没,我猜想这种代码必须要借助浏览器的功能
--------------------编程问答-------------------- 同在纠结这个问题~看过的时间最长的帖子了~~ --------------------编程问答-------------------- 我用HttpURLConnection爬取网页数据,也是不能得到dwr执行的动态数据,有没有研究出来的求指导啊 --------------------编程问答-------------------- --------------------编程问答-------------------- 晕,从头看到现在居然没有一个肯粘贴一下代码来解决这问题,太能藏了吧! --------------------编程问答--------------------
引用 98 楼 qq814889301 的回复:
晕,从头看到现在居然没有一个肯粘贴一下代码来解决这问题,太能藏了吧!
求解决方案啊,有没有使用Rhino解决问题了的,送点有用的代码出来参考参考啊 --------------------编程问答-------------------- 有个工具  QTwebkit 里面有个webpage 可以帮你解决这个问题  python的我知道  但java
的不熟
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,