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

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

Как бы я сделал это с помощью Java?

10 ответов


вот некоторый протестированный код, использующий 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
        }
    }
}

Я бы использовал приличный парсер 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();

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

Читайте также:


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

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");

Ну, вы можете пойти со встроенными библиотеками, такими как URL-адресом и URLConnection, но они не дают очень много контроля.

лично я бы пошел с Apache HTTPClient библиотека.
Edit: HTTPClient имеет значение конец жизни в Apache. Замена: HTTP компоненты


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


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


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


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.


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

public class MainActivity расширяет 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;
    }
}

}


я использовал фактический ответ на этот пост (URL-адресом) и запись вывода в a файл.

package test;

import java.net.*;
import java.io.*;

public class PDFTest {
    public static void main(String[] args) throws Exception {
    try {
        URL oracle = new URL("http://www.fetagracollege.org");
        BufferedReader in = new BufferedReader(new InputStreamReader(oracle.openStream()));

        String fileName = "D:\a_01\output.txt";

        PrintWriter writer = new PrintWriter(fileName, "UTF-8");
        OutputStream outputStream = new FileOutputStream(fileName);
        String inputLine;

        while ((inputLine = in.readLine()) != null) {
            System.out.println(inputLine);
            writer.println(inputLine);
        }
        in.close();
        } catch(Exception e) {

        }

    }
}