जावा में आप वेबपेज को प्रोग्रामेटिक रूप से कैसे डाउनलोड करते हैं


117

मैं एक वेब पेज के HTML को लाने और इसे एक में सहेजने में सक्षम होना चाहूंगा String, इसलिए मैं इस पर कुछ प्रसंस्करण कर सकता हूं। इसके अलावा, मैं विभिन्न प्रकार के संपीड़न कैसे संभाल सकता हूं।

मैं जावा का उपयोग करते हुए कैसे करूंगा?


जवाबों:


110

यहां जावा के 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 () पदावनत है, लेकिन इसके अलावा बहुत अच्छा उदाहरण है। मैंने रीडलाइन () फ़ंक्शन प्राप्त करने के लिए एक बफरस्टैंडर () में लिपटे एक InputStreamReader () का उपयोग किया।
mjh2007

2
यह कैरेक्टर एन्कोडिंग को ध्यान में नहीं रखता है, इसलिए जब यह ASCII टेक्स्ट के लिए काम करता है, तो यह अंततः 'विचित्र वर्णों' में परिणाम देगा जब कोई बेमेल हो।
आर्टब्रिस्टल

3 लाइन में बदलने के DataInputStreamलिए BufferedReader। और "dis = new DataInputStream(new BufferedInputStream(is));""dis = new BufferedReader(new InputStreamReader(is));"
कोलोबोक

1
@akapelko धन्यवाद। मैंने पदावनत विधियों में कॉल हटाने के लिए अपना उत्तर अपडेट किया।
छिपकली

2
बंद करने के बारे में क्या InputStreamReader?
अलेक्जेंडर - मोनिका

170

मैं Jsoup जैसे एक सभ्य HTML पार्सर का उपयोग करता हूँ । यह तब जितना आसान है:

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

यह GZIP को संभालता है और पूरी तरह से पारदर्शी तरीके से प्रतिक्रिया और चरित्र एन्कोडिंग को संभाला है। यह और अधिक लाभ प्रदान करता है, जैसे HTML ट्रैवर्सिंग और CSS चयनकर्ताओं द्वारा हेरफेर जैसे कि jQuery कर सकते हैं। आपको इसे केवल Documentएक के रूप में पकड़ना है , एक के रूप में नहीं String

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

आप वास्तव में इसे संसाधित करने के लिए HTML पर मूल स्ट्रिंग विधियों या यहां तक ​​कि regex को चलाना नहीं चाहते हैं।

यह सभी देखें:


3
अच्छा उत्तर। थोड़ी देर। ;)
jjnguy

59
कभी नहीं से बेहतर।
बालुस

शानदार पुस्तकालय :) उसके लिए Thx।
जकूब पी।

किसी ने मुझे .html () के बारे में पहले क्यों नहीं बताया। मैं बहुत मुश्किल से देखा कि कैसे आसानी से html को Jsoup द्वारा संग्रहीत किया जा सकता है और इससे बहुत मदद मिलती है।
अवामंदर १४'१६ को २०:

नवागंतुकों के लिए, यदि आप Android में इस लाइब्रेरी का उपयोग करते हैं, तो आपको इसे अलग-अलग थ्रेड में उपयोग करने की आवश्यकता है, क्योंकि यह डिफ़ॉल्ट रूप से एक ही एप्लिकेशन थ्रेड पर चलता है, जो एप्लिकेशन को फेंकने का कारण बनेगाNetworkOnMainThreadException
मोहम्मद 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");

इनपुटस्ट्रीम को स्ट्रिंग में बदलने की तलाश करने वालों के लिए, यह उत्तर देखें ।
SSight3

setFollowRedirects मदद करता है, मैं setInstanceFollowRedirects का उपयोग करता हूं मेरे मामले में, मुझे उपयोग करने से पहले कई मामलों में खाली वेब पेज मिल रहे थे। मुझे लगता है कि आप फ़ाइल को तेज़ी से डाउनलोड करने के लिए संपीड़न का उपयोग करने का प्रयास करते हैं।
gouessej

12

ठीक है, आप URL और URLConnection जैसी अंतर्निहित लाइब्रेरी के साथ जा सकते हैं , लेकिन वे बहुत अधिक नियंत्रण नहीं देते हैं।

व्यक्तिगत रूप से मैं अपाचे HTTPClient पुस्तकालय के साथ जाना होगा ।
संपादित करें: HTTPClient को अपाचे द्वारा जीवन के अंत में सेट किया गया है । प्रतिस्थापन है: HTTP घटक


System.Net.WebRequest का कोई जावा संस्करण नहीं है?
फ्लाईस्वात

1
इस प्रकार, वह URL होगा। :-) उदाहरण के लिए: नया URL (" google.com")। OpenStream () // => InputStream
डैनियल स्पाइवेक

1
@ जोनाथन: डैनियल ने क्या कहा, अधिकांश भाग के लिए - हालाँकि WebRequest आपको URL से अधिक नियंत्रण देता है। HTTPClient कार्यक्षमता में करीब है, IMO।
जॉन स्कीट

9

उपर्युक्त सभी दृष्टिकोण वेब पेज टेक्स्ट को डाउनलोड नहीं करते हैं क्योंकि यह ब्राउज़र में दिखता है। इन दिनों html पृष्ठों में बहुत सारा डेटा लिपियों के माध्यम से ब्राउज़रों में लोड किया जाता है। उपर्युक्त तकनीकों में से कोई भी स्क्रिप्ट का समर्थन नहीं करता है, वे केवल HTML पाठ को केवल डाउनलोड करते हैं। HTMLUNIT javascripts का समर्थन करता है। इसलिए यदि आप वेब पेज टेक्स्ट डाउनलोड करना चाहते हैं जैसा कि यह ब्राउज़र में दिखता है तो आपको HTMLUNIT का उपयोग करना चाहिए ।


1

आपको सबसे अधिक सुरक्षित वेब पेज (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

यूनिक्स / लिनक्स बॉक्स पर आप सिर्फ 'wget' चला सकते हैं, लेकिन यदि आप क्रॉस-प्लेटफ़ॉर्म क्लाइंट लिख रहे हैं तो यह वास्तव में कोई विकल्प नहीं है। बेशक यह मानता है कि आप वास्तव में इसे डाउनलोड करने के बिंदु के बीच डाउनलोड किए गए डेटा के साथ बहुत कुछ नहीं करना चाहते हैं और यह डिस्क को मार रहा है।


मैं भी इस दृष्टिकोण के साथ शुरू करूंगा और इसे बाद में फिर से पाऊंगा अगर अपर्याप्त
डस्टिन गेट्ज़

0

जेट्टी का एक 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();
            }
        }
    }
}

उदाहरण एक साधारण वेब पेज की सामग्री को प्रिंट करता है।

एक में जावा में एक वेब पेज पढ़ना ट्यूटोरियल मैं जावा में programmaticaly एक वेब पेज dowloading यूआरएल, JSoup, HtmlCleaner, Apache httpclient, जेट्टी HttpClient, और 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, 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) {

        }

    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.