it-swarm.com.ru

Как программно загрузить веб-страницу в Java

Я хотел бы иметь возможность получить html веб-страницы и сохранить его в String, чтобы я мог выполнить некоторую обработку на нем. Кроме того, как я могу справиться с различными типами сжатия.

Как бы я поступил так с помощью Java?

116
jjnguy

Вот некоторый протестированный код с использованием класса Java URL . Я бы порекомендовал сделать лучшую работу, чем я здесь, по обработке исключений или передаче их в стек вызовов.

public static void main(String[] args) {
    URL url;
    InputStream is = null;
    BufferedReader br;
    String line;

    try {
        url = new URL("http://stackoverflow.com/");
        is = url.openStream();  // throws an IOException
        br = new BufferedReader(new InputStreamReader(is));

        while ((line = br.readLine()) != null) {
            System.out.println(line);
        }
    } catch (MalformedURLException mue) {
         mue.printStackTrace();
    } catch (IOException ioe) {
         ioe.printStackTrace();
    } finally {
        try {
            if (is != null) is.close();
        } catch (IOException ioe) {
            // nothing to see here
        }
    }
}
104
Bill the Lizard

Я бы использовал приличный HTML-парсер, например Jsoup . Это так же просто, как:

String html = Jsoup.connect("http://stackoverflow.com").get().html();

Он полностью прозрачно обрабатывает GZIP и чанкованные ответы и кодировку символов. Он также предлагает больше преимуществ, таких как HTML обход и манипулирование с помощью селекторов CSS, как это делает jQuery. Вам нужно только захватить его как Document, а не как String.

Document document = Jsoup.connect("http://google.com").get();

Вы действительно не хотите запустить базовые методы String или даже регулярное выражение в HTML для его обработки.

Смотрите также:

169
BalusC

Ответ Билла очень хороший, но вы можете сделать некоторые вещи с запросом, такие как сжатие или пользовательские агенты. Следующий код показывает, как вы можете использовать различные типы сжатия для ваших запросов.

URL url = new URL(urlStr);
HttpURLConnection conn = (HttpURLConnection) url.openConnection(); // Cast shouldn't fail
HttpURLConnection.setFollowRedirects(true);
// allow both GZip and Deflate (ZLib) encodings
conn.setRequestProperty("Accept-Encoding", "gzip, deflate");
String encoding = conn.getContentEncoding();
InputStream inStr = null;

// create the appropriate stream wrapper based on
// the encoding type
if (encoding != null && encoding.equalsIgnoreCase("gzip")) {
    inStr = new GZIPInputStream(conn.getInputStream());
} else if (encoding != null && encoding.equalsIgnoreCase("deflate")) {
    inStr = new InflaterInputStream(conn.getInputStream(),
      new Inflater(true));
} else {
    inStr = conn.getInputStream();
}

Чтобы также установить user-agent, добавьте следующий код:

conn.setRequestProperty ( "User-agent", "my agent name");
24
jjnguy

Ну, вы можете использовать встроенные библиотеки, такие как URL и RLConnection , но они не дают большого контроля.

Лично я бы пошел с библиотекой Apache HTTPClient .
Редактировать: HTTPClient был установлен на конец срока службы Apache. Замена: Компоненты HTTP

12
Jon Skeet

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

7
user3690910

Скорее всего, вам нужно извлечь код с защищенной веб-страницы (протокол https). В следующем примере HTML-файл сохраняется в папке c:\temp\filename.html. Наслаждайтесь!

import Java.io.BufferedReader;
import Java.io.BufferedWriter;
import Java.io.FileWriter;
import Java.io.InputStream;
import Java.io.InputStreamReader;
import Java.net.URL;

import javax.net.ssl.HttpsURLConnection;

/**
 * <b>Get the Html source from the secure url </b>
 */
public class HttpsClientUtil {
    public static void main(String[] args) throws Exception {
        String httpsURL = "https://stackoverflow.com";
        String FILENAME = "c:\\temp\\filename.html";
        BufferedWriter bw = new BufferedWriter(new FileWriter(FILENAME));
        URL myurl = new URL(httpsURL);
        HttpsURLConnection con = (HttpsURLConnection) myurl.openConnection();
        con.setRequestProperty ( "User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:63.0) Gecko/20100101 Firefox/63.0" );
        InputStream ins = con.getInputStream();
        InputStreamReader isr = new InputStreamReader(ins, "Windows-1252");
        BufferedReader in = new BufferedReader(isr);
        String inputLine;

        // Write each line into the file
        while ((inputLine = in.readLine()) != null) {
            System.out.println(inputLine);
            bw.write(inputLine);
        }
        in.close(); 
        bw.close();
    }
}
1
QA Specialist

Получить справку из этого класса, получить код и отфильтровать некоторую информацию.

public class MainActivity extends AppCompatActivity {

    EditText url;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate( savedInstanceState );
        setContentView( R.layout.activity_main );

        url = ((EditText)findViewById( R.id.editText));
        DownloadCode obj = new DownloadCode();

        try {
            String des=" ";

            String tag1= "<div class=\"description\">";
            String l = obj.execute( "http://www.nu.edu.pk/Campus/Chiniot-Faisalabad/Faculty" ).get();

            url.setText( l );
            url.setText( " " );

            String[] t1 = l.split(tag1);
            String[] t2 = t1[0].split( "</div>" );
            url.setText( t2[0] );

        }
        catch (Exception e)
        {
            Toast.makeText( this,e.toString(),Toast.LENGTH_SHORT ).show();
        }

    }
                                        // input, extrafunctionrunparallel, output
    class DownloadCode extends AsyncTask<String,Void,String>
    {
        @Override
        protected String doInBackground(String... WebAddress) // string of webAddress separate by ','
        {
            String htmlcontent = " ";
            try {
                URL url = new URL( WebAddress[0] );
                HttpURLConnection c = (HttpURLConnection) url.openConnection();
                c.connect();
                InputStream input = c.getInputStream();
                int data;
                InputStreamReader reader = new InputStreamReader( input );

                data = reader.read();

                while (data != -1)
                {
                    char content = (char) data;
                    htmlcontent+=content;
                    data = reader.read();
                }
            }
            catch (Exception e)
            {
                Log.i("Status : ",e.toString());
            }
            return htmlcontent;
        }
    }
}
0
Sohaib Aslam

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

0
optimus0127

У Jetty есть HTTP-клиент, который можно использовать для загрузки веб-страницы.

package com.zetcode;

import org.Eclipse.jetty.client.HttpClient;
import org.Eclipse.jetty.client.api.ContentResponse;

public class ReadWebPageEx5 {

    public static void main(String[] args) throws Exception {

        HttpClient client = null;

        try {

            client = new HttpClient();
            client.start();

            String url = "http://www.something.com";

            ContentResponse res = client.GET(url);

            System.out.println(res.getContentAsString());

        } finally {

            if (client != null) {

                client.stop();
            }
        }
    }
}

В примере печатается содержимое простой веб-страницы.

В учебнике чтение веб-страницы на Java я написал шесть примеров программной загрузки веб-страницы в Java с использованием URL, JSoup, HtmlCleaner, Apache HttpClient, Jetty HttpClient и HtmlUnit. ,.

0
Jan Bodnar

На Unix/Linux box вы можете просто запустить 'wget', но это не совсем вариант, если вы пишете кроссплатформенный клиент. Конечно, это предполагает, что вы на самом деле не хотите много делать с данными, которые вы загружаете между моментом загрузки и попадания на диск.

0
Timo Geusch