Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用java获取网站的源代码_Java_Url - Fatal编程技术网

用java获取网站的源代码

用java获取网站的源代码,java,url,Java,Url,我想使用java获取网站的源代码(安全),然后解析该网站中的链接。我已经找到了如何连接到该url的方法,但是我如何才能轻松地获得源代码,最好是DOM文档oso,这样我就可以轻松地获得所需的信息 或者有没有更好的方法连接到https站点,获取源代码(我需要这样做才能获得一个数据表…非常简单),然后这些链接就是我要下载的文件 我希望它是FTP,但这些是存储在我的tivo上的文件(我想通过编程将它们下载到我的计算机上(Try or)。虽然前者表面上是用于编写集成测试,但它有一个方便的API,用于以编程

我想使用java获取网站的源代码(安全),然后解析该网站中的链接。我已经找到了如何连接到该url的方法,但是我如何才能轻松地获得源代码,最好是DOM文档oso,这样我就可以轻松地获得所需的信息

或者有没有更好的方法连接到https站点,获取源代码(我需要这样做才能获得一个数据表…非常简单),然后这些链接就是我要下载的文件

我希望它是FTP,但这些是存储在我的tivo上的文件(我想通过编程将它们下载到我的计算机上(

Try or)。虽然前者表面上是用于编写集成测试,但它有一个方便的API,用于以编程方式迭代网页链接,类似于以下使用:


您可以使用来获取站点的html,并对其进行分析。

您可以获取低级别,只需使用套接字进行请求

// Arg[0] = Hostname
// Arg[1] = File like index.html
public static void main(String[] args) throws Exception {
    SSLSocketFactory factory = (SSLSocketFactory) SSLSocketFactory.getDefault();

    SSLSocket sslsock = (SSLSocket) factory.createSocket(args[0], 443);

    SSLSession session = sslsock.getSession();
    X509Certificate cert;
    try {
        cert = (X509Certificate) session.getPeerCertificates()[0];
    } catch (SSLPeerUnverifiedException e) {
        System.err.println(session.getPeerHost() + " did not present a valid cert.");
        return;
    }

    // Now use the secure socket just like a regular socket to read pages.
    PrintWriter out = new PrintWriter(sslsock.getOutputStream());
    out.write("GET " + args[1] + " HTTP/1.0\r\n\r\n");
    out.flush();

    BufferedReader in = new BufferedReader(new InputStreamReader(sslsock.getInputStream()));
    String line;
    String regExp = ".*<a href=\"(.*)\">.*";
    Pattern p = Pattern.compile( regExp, Pattern.CASE_INSENSITIVE );

    while ((line = in.readLine()) != null) {
        // Using Oscar's RegEx.
        Matcher m = p.matcher( line );  
        if( m.matches() ) {
            System.out.println( m.group(1) );
        }
    }

    sslsock.close();
}
//Arg[0]=主机名
//Arg[1]=类似index.html的文件
公共静态void main(字符串[]args)引发异常{
SSLSocketFactory=(SSLSocketFactory)SSLSocketFactory.getDefault();
SSLSocket sslsock=(SSLSocket)factory.createSocket(args[0],443);
SSLSession session=sslsock.getSession();
X509证书;
试一试{
证书=(X509Certificate)会话。getPeerCertificates()[0];
}捕获(SSLPEEUNVERIFIEDEXE){
System.err.println(session.getPeerHost()+“未提供有效的证书”);
返回;
}
//现在使用安全套接字就像使用普通套接字一样读取页面。
PrintWriter out=新的PrintWriter(sslsock.getOutputStream());
out.write(“GET”+args[1]+“HTTP/1.0\r\n\r\n”);
out.flush();
BufferedReader in=新的BufferedReader(新的InputStreamReader(sslsock.getInputStream());
弦线;
字符串regExp=“.*”;
Pattern p=Pattern.compile(regExp,Pattern.CASE\u不区分大小写);
而((line=in.readLine())!=null){
//使用奥斯卡的正则表达式。
匹配器m=p.匹配器(线);
如果(m.matches()){
系统输出println(m.group(1));
}
}
sslsock.close();
}

也许你可以从Pete's或sktrdie的选项中获得更好的结果。如果你想知道如何“通过had”完成,这里有一个额外的方法

我不太擅长正则表达式,所以在本例中,它返回一行中的最后一个链接。这是一个开始

import java.io.*;
import java.net.*;
import java.util.regex.*;

public class Links { 
    public static void main( String [] args ) throws IOException  { 

        URL url = new URL( args[0] );
        InputStream is = url.openConnection().getInputStream();

        BufferedReader reader = new BufferedReader( new InputStreamReader( is )  );

        String line = null;
        String regExp = ".*<a href=\"(.*)\">.*";
        Pattern p = Pattern.compile( regExp, Pattern.CASE_INSENSITIVE );

        while( ( line = reader.readLine() ) != null )  {
            Matcher m = p.matcher( line );  
            if( m.matches() ) {
                System.out.println( m.group(1) );
            }
        }
        reader.close();
    }
}
import java.io.*;
导入java.net。*;
导入java.util.regex.*;
公共类链接{
公共静态void main(字符串[]args)引发IOException{
URL=新URL(参数[0]);
InputStream=url.openConnection().getInputStream();
BufferedReader reader=新的BufferedReader(新的InputStreamReader(is));
字符串行=null;
字符串regExp=“.*”;
Pattern p=Pattern.compile(regExp,Pattern.CASE\u不区分大小写);
而((line=reader.readLine())!=null){
匹配器m=p.匹配器(线);
如果(m.matches()){
系统输出println(m.group(1));
}
}
reader.close();
}
}
编辑


哎呀,我完全错过了“安全”部分。无论如何,我还是忍不住,我不得不写下这个示例:p

非常相似的问题:


    • 在网络环境中,资源有两种含义:

      HTML源:如果您通过URL请求网页,您总是可以获得HTML源代码。事实上,您从URL中无法获得任何其他内容。网页总是以源代码形式传输,没有编译过的网页。对于您正在尝试的,这应该足以完成您的任务

      脚本源:如果网页是动态生成的,那么它是用一些服务器端脚本语言(如PHP、Ruby、JSP…)编码的。在这个级别上也有一个源代码。但是使用HTTP连接您无法获得这种源代码。这不是缺少的功能,而是完全出于目的

      解析:话虽如此,您还是需要以某种方式解析HTML代码。如果您只需要链接,使用正则表达式(如Oscar Reyes所示)将是最实用的方法,但您也可以“手动”编写一个简单的解析器。这会很慢,需要更多的代码…但很有效

      如果您想在更具逻辑性的级别上访问代码,将其解析为DOM将是一个不错的选择。如果代码是有效的XHTML,您可以将其解析为org.w3c.DOM.Document并对其执行任何操作。如果它至少是有效的HTML,您可以应用一些技巧将其转换为XHTML(在一些罕见的情况下,用
      替换
      并更改doctype就足够了)并将其作为XML使用


      如果它不是有效的XML,您将需要一个HTML DOM解析器。我不知道Java是否存在这样的解析器,它的性能是否良好。

      您的Tivo上存在FTP服务器,可以安装该服务器以允许下载节目,请参见此处


      这个问题的表述方式不同(如何在java中处理http/html),但最后您提到了您想要的是下载节目因此在另一台机器上安装驱动器并不容易,相反,在Tivo上运行http或ftp服务器并从这些服务器下载更容易尝试使用jsoup库

      import java.io.IOException;
      import org.jsoup.Jsoup;
      import org.jsoup.nodes.Document;
      
      
      public class ParseHTML {
      
          public static void main(String args[]) throws IOException{
              Document doc = Jsoup.connect("https://www.wikipedia.org/").get();
              String text = doc.body().text();
      
              System.out.print(text);
          }
      }
      

      你可以下载jsoup库。

      不错的选择,我建议将HtmlUnit添加到列表中。不要滥用它的用途。HtmlUnit是一个专门用于进行单元测试的库。@Adeel:我不知道HtmlUnit是什么,但在链接的URL上,HtmlUnit在第一段和第三段中说它是“Java程序浏览器”,列出了“测试目的或从网站检索信息”。我不认为Adam想要什么与这种典型用法相矛盾。我以为他说他需要安全访问支持。url.open吗
      import java.io.IOException;
      import org.jsoup.Jsoup;
      import org.jsoup.nodes.Document;
      
      
      public class ParseHTML {
      
          public static void main(String args[]) throws IOException{
              Document doc = Jsoup.connect("https://www.wikipedia.org/").get();
              String text = doc.body().text();
      
              System.out.print(text);
          }
      }