获取java的网站源码

时间:2009-01-08 02:00:24

标签: java url dvr tivo

我想使用java来获取网站的来源(安全),然后解析该网站中的链接。我已经找到了如何连接到该URL,但是我怎样才能轻松获得源代码,更喜欢DOM Document Oso,我可以轻松获得我想要的信息。

或者是否有更好的方式连接到https站点,获取源(我需要做的是获取数据表...非常简单)然后这些链接是我要下载的文件。

我希望它是FTP,但这些是存储在我的tivo上的文件(我想以编程方式将它们下载到我的电脑上(

8 个答案:

答案 0 :(得分:5)

您可以获得低级别,只需使用套接字请求它。在java中它看起来像

// 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();
}

答案 1 :(得分:5)

答案 2 :(得分:3)

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

WebConversation wc = new WebConversation();
WebResponse resp = wc.getResponse("http://stackoverflow.com/questions/422970/");
WebLink[] links = resp.getLinks();
// Loop over array of links...

答案 3 :(得分:3)

可能你可以从Pete或sktrdie选项中获得更好的结果。如果你想知道怎么做,这是另一种方式“by 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();
    }
}

修改

哎呀我完全错过了“安全”部分。无论如何我无法帮助它,我不得不写下这个样本:P

答案 4 :(得分:1)

您可以使用javacurl获取网站的HTML,并使用java DOM进行分析。

答案 5 :(得分:1)

尝试使用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库here

答案 6 :(得分:0)

网络环境中有两种含义:

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

脚本来源:如果网页是动态生成的,那么它是用某种服务器端脚本语言编写的(如PHP,Ruby,JSP ......)。此级别还有存在源代码。但是使用HTTP连接你无法获得这种源代码。这不是缺少的功能,但完全是出于目的。

解析:说完了,你需要以某种方式解析HTML代码。如果您只需要链接,使用RegEx(如Oscar Reyes所示)将是最实用的方法,但您也可以“手动”编写一个简单的解析器。这将是缓慢的,更多的代码......但是有效。

如果您想在更合乎逻辑的级别上访问代码,那么将其解析为DOM将是最佳选择。如果代码是有效的XHTML ,您可以将其解析为org.w3c.dom.Document并对其执行任何操作。如果它至少是有效HTML ,您可以应用一些技巧将其转换为XHTML(在极少数情况下,用&lt; br /&gt;替换&lt; br&gt;并更改doctype就足够了)并且将它用作XML。

如果它不是有效的XML,则需要一个HTML DOM解析器。我不知道Java是否存在这样的东西,如果它表现得很好。

答案 7 :(得分:0)

可以在Tivo上安装FTP服务器以允许节目下载,请参阅此处http://dvrpedia.com/MFS_FTP

问题的表达方式不同(如何在java中处理http / html),但最后你提到你想要的是下载节目。 Tivo使用他们自己的独特文件系统(MFS - 媒体文件系统),因此在另一台机器上安装驱动器并不容易 - 而是更容易在Tivo上运行http或ftp服务器并从这些下载