谢谢楼上的回复,
目前有用httpclient,但是它不能获取到执行js后的网页源代码。

解决方案 »

  1.   

    你好,我现在遇到和你同样的问题,但是我现在连JS解析都无法做好,可以将你的源代码给我看一看吗?或者加我的QQ:445714189,希望能得到您的指点
      

  2.   

    这样不知道行不行
    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这样的形式
      

  3.   

    至于JApplet完全可以用JFrame代替
      

  4.   

    求助:
    不知道有没有其他的可替代方案,如:通过java的脚本执行引擎执行js来获取网页代码,或者其他的方案。请各位大侠帮忙,感激不尽!好像没办法实现吧,js执行过程需要构建运行环境才能实现。例如页面引用了jquery、extjs这些东西,js运行后必须要修改了dom的结构的。
    除非你自己写个js引擎,呵呵
      

  5.   

    楼主有兴趣的话,可以看看HtmlUnit,http://htmlunit.sourceforge.net/
      

  6.   

    HtmlUnit模拟浏览器的行为,但因为没有GUI,所以比浏览器更快,不过也还是需要几秒的时间
      

  7.   


    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流了。
      

  8.   

      手工模拟js的执行流程,至于有数值要取的话,有jdk自带的js引擎,得出的结果附上去,用Httpclient模拟跳转。。就行了。。具体的代码就只好楼主自己去写了
      

  9.   

    有没有人用HtmlUnit这个,怎么获取加载完的页面的源文件啊。网上例子太少也查不到,哪个大虾知道了,告知一下
      

  10.   

    怎么我自己写的爬虫程序,使用HttpUrlConnection方式,获取网页内容比,浏览器打开的速度还要慢呢?
      

  11.   

    最近也在玩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一样。希望能给与楼主帮助。
      

  12.   

    可以想简单一点。JS也是会请求服务器的。
    首先你要获取请求的地址,这个可以利用谷歌浏览器查看一下,然后用HttpClient模拟请求那个地址就可以了。我之前做爬虫爬取新浪微博就是这样做的。
      

  13.   


    纠正一下你的观点哈,不是所有js都要请求服务器的,如:document.getElementById("content").innerHTML="content";这个就不会去请求服务器。
      

  14.   

    还没有好的解决方案,继续等解答哈。
    谁知道使用java调用webkit的方式(非android平台那种调用哈)呢?
      

  15.   

    目前想到一种方式:通过swing调用javaFX里面的webview webegine来加载页面,但是不知道如何才能让webkit不去下载页面中的图片,类似实现浏览器的无图片模式。对于webkit肯定是有这个功能的,就是不知道有没有类似的java api可直接设置。
      

  16.   

    htmlunit + jsoup可以搞定楼主需要的问题
      

  17.   

    htmlunit 完全能满足楼主的要求
      

  18.   

    比如一个简单例子,一个网站的首页是:
    <script type="text/javascript">
    document.ready(function(){
        $.ajax({
              ......
              success: function(data){
                  $("#div1").html(data);
              }
        });
    });
    </script>
    <div id="div1">
    </div>
    那么你的搜索排名永远都无法靠前
      

  19.   

    ScriptEngine,楼主,java能直接执行js脚本的,但是需要你构建html环境放到参数里面去,这个比较困难
      

  20.   

    同求,jsoup.Connect和httpclient的response获得的html含有js异步加载的信息,拿不到,而js向服务器的请求需要一些参数,这些参数又是不同的js之类的动态生成的,,,,没法模拟请求,,,纠结,求教!!
      

  21.   

    楼主是怎么解决的    现在我正在头疼这个问题,如何能获得firebug那样的完整数据。qq:372990820
      

  22.   

    用HtmlUnit。它本身就是一个单元测试组件,包含了极高的容错性。只要你有足够的异常处理,不会导致程序崩溃。只是API比较复杂。。要研究
      

  23.   

    htmlunit 我也在求解这方面的难题