Получить источник сайта в Java - PullRequest
3 голосов
/ 08 января 2009

Я хотел бы использовать java, чтобы получить источник веб-сайта (безопасный), а затем проанализировать этот веб-сайт на наличие ссылок в нем. Я нашел, как подключиться к этому URL, но как я могу легко получить только источник, предпочитая в качестве документа DOM, чтобы я мог легко получить необходимую информацию.

Или есть лучший способ подключиться к сайту https, получить источник (который я не хочу сделать, чтобы получить таблицу данных ... это довольно просто), тогда эти ссылки - это файлы, которые я собираюсь скачать. *

Хотелось бы, чтобы это был FTP, но это файлы, хранящиеся на моем tivo (я хочу программно загрузить их на мой компьютер (

Ответы [ 8 ]

5 голосов
/ 08 января 2009

Вы можете получить низкий уровень и просто запросить его с помощью сокета. В 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();
}
3 голосов
/ 08 января 2009

Возможно, вы могли бы получить лучшие результаты из опций Пита или Скртди. Вот еще один способ, если вы хотите знать, как это сделать "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();
    }
}

EDIT

Упс Я полностью пропустил "безопасную" часть. Во всяком случае, я не мог с этим поделать, мне пришлось написать этот пример: P

3 голосов
/ 08 января 2009

Попробуйте HttpUnit или HttpClient . Хотя первый якобы предназначен для написания интеграционных тестов, он имеет удобный API-интерфейс для программной итерации по ссылкам веб-страницы, например, с использованием WebResponse.getLinks () :

WebConversation wc = new WebConversation();
WebResponse resp = wc.getResponse("/256333/poluchit-istochnik-saita-v-java");
WebLink[] links = resp.getLinks();
// Loop over array of links...
1 голос
/ 21 мая 2014

Попробуйте использовать библиотеку 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 здесь .

1 голос
/ 08 января 2009

Вы можете использовать javacurl для получения html сайта и java DOM для его анализа.

0 голосов
/ 12 ноября 2010

Существует FTP-сервер, который можно установить на вашем Tivo, чтобы разрешить загрузку шоу, см. Здесь http://dvrpedia.com/MFS_FTP

Вопрос сформулирован по-другому (как обращаться с http / html в Java), но в конце вы упоминаете, что вы хотите, чтобы загрузить шоу. Tivo использует собственную уникальную файловую систему (MFS - Media File System), поэтому не так просто смонтировать диск на другом компьютере - вместо этого проще запустить http или ftp-сервер на Tivo и загрузить их с этих

0 голосов
/ 08 января 2009

В веб-контексте есть два значения souce:

Источник HTML: Если вы запрашиваете веб-страницу по URL, вы всегда получаете исходный код HTML. На самом деле, ничего другого, что вы могли бы получить по URL. Веб-страницы всегда передаются в исходном виде, такого понятия как скомпилированная веб-страница не существует. И для того, что вы пытаетесь, этого должно быть достаточно для выполнения вашей задачи.

Источник сценария: Если веб-страница генерируется динамически, то она кодируется на некотором языке сценариев на стороне сервера (например, PHP, Ruby, JSP ...). Там также существует исходный код на этом уровне. Но используя HTTP-соединение, вы не можете получить этот вид исходного кода. Это не отсутствующая функция , но полностью по назначению.

Синтаксический анализ: Сказав это, вам нужно как-то разобрать HTML-код. Если вам просто нужны ссылки, использование RegEx (как показал Оскар Рейес) будет наиболее практичным подходом, но вы также можете написать простой парсер "вручную". Было бы медленно, больше кода ... но работает.

Если вы хотите расширить доступ к коду на более логичном уровне, лучше всего разобрать его в DOM. Если код допустимый XHTML , вы можете просто проанализировать его в org.w3c.dom.Document и сделать с ним что-нибудь. Если это хотя бы допустимый HTML , вы можете применить некоторые приемы для его преобразования в XHTML (в некоторых редких случаях достаточно заменить
на
и изменить тип документа) и использовать его в качестве XML .

Если это недопустимый XML, вам понадобится анализатор HTML DOM. Я понятия не имею, существует ли такая вещь для Java и работает ли она хорошо.

...