プログラムでJavaのWebページをダウンロードする方法


117

Webページのhtmlをフェッチしてに保存できるようにしたいStringので、処理を行うことができます。また、さまざまな種類の圧縮をどのように処理できますか?

Javaを使用してそれを行うにはどうすればよいですか?


これは基本的に、stackoverflow.com
Robin Green

回答:


110

以下は、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
        }
    }
}

16
DataInputStream.readLine()は非推奨ですが、それ以外の非常に良い例です。BufferedReader()にラップされたInputStreamReader()を使用して、readLine()関数を取得しました。
mjh2007

2
これは文字エンコーディングを考慮に入れていないため、ASCIIテキストでは機能するように見えますが、不一致があると最終的には「奇妙な文字」になります。
artbristol 2012

3行目では交換してくださいDataInputStreamBufferedReader。そして、置き換える"dis = new DataInputStream(new BufferedInputStream(is));""dis = new BufferedReader(new InputStreamReader(is));"
kolobok

1
@akapelkoありがとうございます。回答を更新して、廃止されたメソッドの呼び出しを削除しました。
トカゲに請求する2013

2
を閉じるのはInputStreamReaderどうですか?
アレクサンダー-モニカを復活させる

170

Jsoupのような適切なHTMLパーサーを使用します。その場合、次のように簡単です。

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

GZIPとチャンクされた応答、文字エンコーディングを完全に透過的に処理します。jQueryのようにHTML トラバースやCSSセレクターによる操作など、より多くの利点も提供します。あなたはそれをとしてDocumentではなく、としてつかむ必要がありStringます。

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

基本的なStringメソッドを実行したり、HTMLで正規表現を実行したりする必要はありません。

以下も参照してください。


3
いい答えだ。少し遅れて。;)
jjnguy

59
ないよりはましだ。
BalusC、2011年

素晴らしいライブラリ:)そのためのThx。
Jakub P.

以前、誰も.html()について教えてくれなかったのはなぜですか。Jsoupが取得したhtmlを簡単に保存する方法を探しましたが、これは非常に役立ちます。
Avamander 2016

初心者の場合、このライブラリをAndroidで使用する場合、デフォルトで同じアプリケーションスレッドで実行され、アプリケーションがスローされるため、これを別のスレッドで使用する必要がありますNetworkOnMainThreadException
Mohammed Elrashied

25

ビルの答えは非常に良いですが、圧縮やユーザーエージェントのようなリクエストでいくつかのことをしたいかもしれません。次のコードは、リクエストに対してさまざまなタイプの圧縮を行う方法を示しています。

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

ユーザーエージェントも設定するには、次のコードを追加します。

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

InputStreamを文字列に変換する方法については、この回答を参照してください。
SSight3

setFollowRedirectsが役立ちます。私の場合はsetInstanceFollowRedirectsを使用します。それを使用する前に、多くの場合空のWebページを取得していました。私はあなたがより速くファイルをダウンロードするために圧縮を使用しようとすると仮定します。
gouessej

12

ええと、URLURLConnectionなどの組み込みライブラリを使用することもできますが、それらはあまり制御を提供しません。

個人的には、Apache HTTPClientライブラリを使用します。
編集: HTTPClientは、Apacheによってサポート終了に設定されています。置き換えは次のとおりです。HTTPコンポーネント


System.Net.WebRequestのJavaバージョンはありませんか?
FlySwat、2008年

1
一種の、それはURLになります。:-)例:new URL( " google.com")。openStream() // => InputStream
Daniel Spiewak 2008年

1
@ジョナサン:ダニエルが言ったこと、大部分は-WebRequestはURLよりもコントロールを与えます。HTTPClientは、IMOの機能がより近くなっています。
Jon Skeet、

9

上記のすべてのアプローチは、ブラウザーで表示されるWebページのテキストをダウンロードしません。最近では、HTMLページのスクリプトを介して多くのデータがブラウザに読み込まれています。上記のテクニックはいずれもスクリプトをサポートしていません。HTMLテキストのみをダウンロードするだけです。HTMLUNITはjavascriptsをサポートしています。そのため、ブラウザで表示されているWebページのテキストをダウンロードする場合は、HTMLUNITを使用する必要があります。


1

安全なWebページ(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();
    }
}

0

Unix / Linuxボックスでは、 'wget'を実行することもできますが、クロスプラットフォームクライアントを作成している場合、これは実際にはオプションではありません。もちろん、これは、ダウンロードした時点からディスクに到達するまでの間に、ダウンロードしたデータをあまり処理したくないことを前提としています。


私もこのアプローチから始め、不十分な場合は後でリファクタリングします
ダスティンゲッツ

0

Jettyには、Webページのダウンロードに使用できる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();
            }
        }
    }
}

この例では、単純なWebページのコンテンツを印刷します。

では、JavaでWebページを読んで、私はHtmlCleanerは、Apache HttpClientを、突堤のHttpClient、URL、JSoupを使用してJavaでprogrammaticaly Webページをdowloadingの6つの例を書いて、HtmlUnitきたチュートリアル。


0

このクラスから助けを得て、コードを取得し、いくつかの情報をフィルタリングします。

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

これを行うには、NIO.2の強力なFiles.copy(InputStream in、Path target)を使用します。

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

-1

この投稿に対する実際の回答(url)を使用して、出力をファイルに書き込みました。

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

        }

    }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.