Java'da bir Web Sayfasını Programlı Olarak Nasıl İndirirsiniz?


Yanıtlar:


110

İşte Java'nın URL sınıfını kullanan bazı test edilmiş kodlar . Yine de, istisnaları ele almak veya çağrı yığınını aktarmak için burada yaptığımdan daha iyi bir iş yapmanızı öneririm.

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
        }
    }
}

16
DataInputStream.readLine () kullanımdan kaldırıldı, ancak bu çok iyi örnek dışında. ReadLine () işlevini elde etmek için BufferedReader () içine sarılmış bir InputStreamReader () kullandım.
mjh2007

2
Bu, karakter kodlamasını hesaba katmaz, bu nedenle ASCII metni için işe yarıyor gibi görünse de, bir uyumsuzluk olduğunda sonunda 'tuhaf karakterler' ile sonuçlanacaktır.
artbristol

3 doğrultusunda değiştirmek DataInputStreamiçin BufferedReader. Ve şu şekilde değiştirin "dis = new DataInputStream(new BufferedInputStream(is));":"dis = new BufferedReader(new InputStreamReader(is));"
kolobok

1
@akapelko Teşekkürler. Kullanımdan kaldırılan yöntemlere yapılan çağrıları kaldırmak için cevabımı güncelledim.
Bill the Lizard

2
kapatmaya ne dersin InputStreamReader?
İskender - Eski Monica

170

Jsoup gibi düzgün bir HTML ayrıştırıcı kullanırım . O zaman şu kadar kolaydır:

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

GZIP ve yığın yanıtları ve karakter kodlamasını tamamen şeffaf bir şekilde işler. Ayrıca jQuery'nin yapabildiği gibi CSS seçiciler tarafından HTML geçişi ve manipülasyonu gibi daha fazla avantaj da sunar . Bir olarak Documentdeğil, sadece olarak yakalamalısın String.

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

Gerçekten yok temel String yöntemlerini çalıştırmak veya hatta bunu işlemek için HTML regex istiyorum.

Ayrıca bakınız:


3
İyi cevap. Biraz geç. ;)
jjnguy

59
Hiç yoktan iyidir.
BalusC

Fantastik kütüphane :) Bunun için teşekkürler.
Jakub P.

Neden daha önce kimse bana .html () 'den bahsetmemişti. Jsoup tarafından getirilen html'yi nasıl kolayca saklayacağımı çok düşündüm ve bu çok yardımcı oldu.
Avamander

Eğer android bu kütüphaneyi kullanmak eğer uygulama atımına neden olur aynı uygulama parçacığı üzerinde varsayılan olarak çalıştığı için yeni gelenler için, farklı iş parçacığı bu kullanmak gerekirNetworkOnMainThreadException
Mohammed Elrashied

25

Bill'in cevabı çok güzel, ancak istekte sıkıştırma veya kullanıcı aracıları gibi bazı şeyler yapmak isteyebilirsiniz. Aşağıdaki kod, isteklerinize çeşitli sıkıştırma türlerini nasıl yapabileceğinizi gösterir.

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

Kullanıcı aracısını da ayarlamak için aşağıdaki kodu ekleyin:

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

InputStream'i dizeye dönüştürmek isteyenler için bu yanıta bakın .
SSight3

setFollowRedirects yardımcı oluyor, benim durumumda setInstanceFollowRedirects kullanıyorum, bunu kullanmadan önce birçok durumda boş web sayfaları alıyordum. Dosyayı daha hızlı indirmek için sıkıştırmayı kullanmayı denediğinizi varsayıyorum.
gouessej

12

URL ve URLConnection gibi yerleşik kitaplıklarla gidebilirsiniz , ancak çok fazla kontrol sağlamazlar.

Şahsen ben Apache HTTPClient kitaplığı ile giderdim .
Düzenleme: HTTPClient, Apache tarafından kullanım ömrünün sonuna ayarlandı . Bunun yerine: HTTP Bileşenleri


System.Net.WebRequest'in java sürümü yok mu?
FlySwat

1
Sıralaması, bu URL olacaktır. :-) Örneğin: yeni URL (" google.com"). OpenStream () // => InputStream
Daniel Spiewak

1
@Jonathan: Daniel'in söylediği şey, çoğunlukla - WebRequest size URL'den daha fazla kontrol sağlasa da. HTTPClient işlevsellikte daha yakındır, IMO.
Jon Skeet

9

Yukarıda belirtilen tüm yaklaşımlar, web sayfası metnini tarayıcıda göründüğü gibi indirmez. Bu günlerde tarayıcılara html sayfalarındaki komut dosyaları aracılığıyla çok fazla veri yüklenmektedir. Yukarıda bahsedilen tekniklerin hiçbiri komut dosyalarını desteklemez, sadece html metnini indirirler. HTMLUNIT, javascripts'i destekler. bu yüzden, web sayfası metnini tarayıcıda göründüğü gibi indirmek istiyorsanız, HTMLUNIT kullanmalısınız .


1

Büyük olasılıkla güvenli bir web sayfasından (https protokolü) kod çıkarmanız gerekir. Aşağıdaki örnekte, html dosyası c: \ temp \ dosyaadı.html içine kaydedilmektedir. Keyfini çıkarın!

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

0

Bir Unix / Linux kutusunda sadece 'wget' çalıştırabilirsiniz, ancak bir çapraz platform istemcisi yazıyorsanız bu gerçekten bir seçenek değildir. Elbette bu, indirdiğiniz verilerle, indirme noktasıyla diske vurma noktası arasında fazla bir şey yapmak istemediğinizi varsayar.


Ayrıca bu yaklaşıma başlayıp yetersiz kalırsa daha sonra yeniden düzenleyecektim
Dustin Getz

0

Jetty, bir web sayfasını indirmek için kullanılabilen bir HTTP istemcisine sahiptir.

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

Örnek, basit bir web sayfasının içeriğini yazdırır.

Bir de Java Okuma bir web sayfası ben URL'yi JSoup, HtmlCleaner, Apaçi HttpClient İskele HttpClient ve HtmlUnit'in kullanarak Java programmaticaly bir web sayfası geçir altı örneklerini yazdım öğretici.


0

Bu sınıftan yardım alın, kod alır ve bazı bilgileri filtreler.

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

Bunu NIO.2 güçlü Files.copy (InputStream in, Path target) kullanarak yapmak için:

URL url = new URL( "http://download.me/" );
Files.copy( url.openStream(), Paths.get("downloaded.html" ) );

-1

Bu yazının asıl cevabını ( url ) kullandım ve çıktıyı bir dosyaya yazdım .

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) {

        }

    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.