আপনি কীভাবে প্রোগ্রামে জাভাতে কোনও ওয়েবপৃষ্ঠা ডাউনলোড করবেন


117

আমি কোনও ওয়েব পৃষ্ঠার এইচটিএমএল আনতে এবং এটি একটিতে সংরক্ষণ করতে সক্ষম হতে চাই String, যাতে আমি এটিতে কিছু প্রক্রিয়াজাত করতে পারি। এছাড়াও, আমি কীভাবে বিভিন্ন ধরণের সংক্ষেপন পরিচালনা করতে পারি।

জাভা ব্যবহার করে কীভাবে করব?


উত্তর:


110

জাভা ইউআরএল ক্লাস ব্যবহার করে এখানে কিছু পরীক্ষিত কোড দেওয়া আছে । যদিও আমি এখানে ব্যতিক্রমগুলি পরিচালনা করতে বা কল স্ট্যাকটি পাস করার চেয়ে ভাল কাজ করার পরামর্শ দিই।

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
ডেটা ইনপুটস্ট্রিম.ড্রেডলাইন () হ্রাস করা হয়েছে তবে এটি খুব ভাল উদাহরণ ছাড়া অন্য। রিডলাইন () ফাংশনটি পেতে আমি একটি ইনপুটস্ট্রিম রিডার () ব্যাফারড্রিডার () এ মোড়ানো ব্যবহার করি।
mjh2007

2
এটি চরিত্রের এনকোডিংটিকে অ্যাকাউন্টে গ্রহণ করে না, সুতরাং এটি ASCII পাঠ্যের জন্য কাজ করার সময় উপস্থিত হবে না, ফলস্বরূপ 'অদ্ভুত অক্ষরগুলি' দেখা দেবে যখন কোনও মিল নেই।
আর্টব্রিস্টল

3 য় লাইনে প্রতিস্থাপন DataInputStreamকরুন BufferedReader। এবং প্রতিস্থাপন "dis = new DataInputStream(new BufferedInputStream(is));"করুন"dis = new BufferedReader(new InputStreamReader(is));"
kolobok

1
@ ক্যাপেলকো আপনাকে ধন্যবাদ অবজ্ঞাত পদ্ধতিতে কলগুলি সরিয়ে দিতে আমি আমার উত্তর আপডেট করেছি।
বিলটি

2
কি বন্ধ InputStreamReader?
আলেকজান্ডার - মনিকা

170

আমি জসুপের মতো একটি শালীন HTML পার্সার ব্যবহার করব । এটি এতটা সহজ:

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

এটি GZIP পরিচালনা করে এবং সম্পূর্ণ প্রতিক্রিয়া এবং চরিত্রের এনকোডিং সম্পূর্ণ স্বচ্ছভাবে করে। এটি আরও সুবিধা দেয় যেমন এইচটিএমএল ট্র্যাভার্সিং এবং সিএসএস নির্বাচকরা যেমন jQuery করতে পারে তেমন ম্যানিপুলেশন । আপনাকে কেবল এটি হিসাবে ধরতে হবে Document, একটি হিসাবে নয় String

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

আপনি সত্যিই না মৌলিক স্ট্রিং পদ্ধতি চালানো বা এমনকি এটি প্রক্রিয়া এইচটিএমএল উপর Regex করতে চাই।

আরো দেখুন:


3
ভাল উত্তর. একটু দেরী. ;)
jjnguy

59
কখনও না থেকে ভাল।
বালুসসি

কল্পনাপ্রসূত গ্রন্থাগার :) তার জন্য থেক্স।
জাকুব পি।

কেন আমাকে আগে html () সম্পর্কে নুন জানাননি। আমি খুব শক্তভাবে তাকিয়েছিলাম যে কীভাবে সহজেই জসুপের দ্বারা প্রাপ্ত এইচটিএমএল সংরক্ষণ করা যায় এবং এটি অনেক সাহায্য করে।
অ্যাভামান্ডার

নতুনদের জন্য, আপনি যদি অ্যান্ড্রয়েডে এই লাইব্রেরিটি ব্যবহার করেন তবে আপনাকে এটি বিভিন্ন থ্রেডে ব্যবহার করতে হবে কারণ এটি একই অ্যাপ্লিকেশন থ্রেডে ডিফল্টরূপে চালিত হয় যা অ্যাপ্লিকেশনটি ছুঁড়ে ফেলতে পারেNetworkOnMainThreadException
মোহাম্মদ এলরেশিড

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

যারা ইনপুট স্ট্রিমটিকে স্ট্রিংয়ে রূপান্তর করতে চান তাদের জন্য এই উত্তরটি দেখুন
এসএসাইট 3

setFollowRedirects সাহায্য করে, আমি আমার ক্ষেত্রে setInstanceFollowRedirects ব্যবহার করি, এটি ব্যবহারের আগে আমি অনেক ক্ষেত্রে খালি ওয়েব পৃষ্ঠা পাচ্ছিলাম। আমি ধরে নিয়েছি যে আপনি ফাইলটি দ্রুত ডাউনলোড করতে সংক্ষেপণ ব্যবহার করার চেষ্টা করছেন।
গৌসেজ

12

ঠিক আছে, আপনি বিল্ট-ইন লাইব্রেরি যেমন URL এবং URL সংযোগের সাথে যেতে পারেন , তবে তারা খুব বেশি নিয়ন্ত্রণ দেয় না।

ব্যক্তিগতভাবে আমি অ্যাপাচি এইচটিটিপি ক্লায়েন্ট লাইব্রেরির সাথে যেতে চাই ।
সম্পাদনা করুন: HTTPClient আপাচে জীবনের শেষের দিকে সেট করেছে to প্রতিস্থাপনটি হ'ল: এইচটিটিপি উপাদান


System.Net.WebRequest এর কোন জাভা সংস্করণ নেই?
ফ্লাইওয়াত

1
বাছাই করুন, এটি ইউআরএল হবে। :-) উদাহরণস্বরূপ: নতুন URL ( " google.com") openStream ()। // => InputStream
ড্যানিয়েল Spiewak

1
@ জোনাথন: ড্যানিয়েল যা বলেছিলেন, বেশিরভাগ অংশে - যদিও ওয়েবরয়েস্ট আপনাকে URL এর চেয়ে বেশি নিয়ন্ত্রণ দেয় than এইচটিটিপি ক্লায়েন্ট কার্যকারিতা নিকটে, আইএমও।
জন স্কিটি

9

উপরে উল্লিখিত সমস্ত পন্থাগুলি ব্রাউজারে দেখতে দেখতে ওয়েব পৃষ্ঠার পাঠ্যটি ডাউনলোড করে না। আজকাল এইচটিএমএল পৃষ্ঠাগুলিতে স্ক্রিপ্টগুলির মাধ্যমে ব্রাউজারগুলিতে প্রচুর ডেটা লোড হয়। উল্লিখিত কোনও কৌশলই স্ক্রিপ্ট সমর্থন করে না, তারা কেবলমাত্র এইচটিএমএল পাঠ্য ডাউনলোড করে। এইচটিএমএলআইএনটি জাভাস্ক্রিপ্টগুলি সমর্থন করে। তাই আপনি যেমন ব্রাউজারে দেখায় ওয়েবপৃষ্ঠাটি টেক্সট ডাউনলোড করতে খুঁজছি হয় তাহলে ব্যবহার করা উচিত HTMLUNIT


1

আপনাকে সম্ভবত কোনও সুরক্ষিত ওয়েব পৃষ্ঠা (https প্রোটোকল) থেকে কোডটি বের করতে হবে। নিম্নলিখিত উদাহরণে, এইচটিএমএল ফাইলটি 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

ইউনিক্স / লিনাক্স বাক্সে আপনি কেবল 'উইজেট' চালাতে পারেন তবে আপনি যদি ক্রস প্ল্যাটফর্ম ক্লায়েন্ট লিখছেন তবে এটি সত্যিই কোনও বিকল্প নয়। অবশ্যই এটি ধরে নিয়েছে যে আপনি যে ডেটা ডাউনলোড করেন সেটি ডাউনলোড করার পয়েন্ট এবং এটি ডিস্কের সাথে আঘাত করার মধ্যে আপনি খুব বেশি কিছু করতে চান না।


আমিও এই পদ্ধতির সাথে শুরু করব এবং যদি অপর্যাপ্ত হয় তবে এটি পুনরায় চুল্লী করব
ডাস্টিন গেটেজ

0

জেটির একটি এইচটিটিপি ক্লায়েন্ট রয়েছে যা ওয়েব পৃষ্ঠা ডাউনলোড করতে ব্যবহার করা যেতে পারে।

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 URL- এ JSoup, HtmlCleaner, এ্যাপাচি 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 শক্তিশালী ফাইলসকপি ব্যবহার করে এটি করতে (ইনপুটস্ট্রিম ইন, পাথ লক্ষ্য):

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

-1

আমি এই পোস্টের ( ইউআরএল ) আসল উত্তরটি ব্যবহার করেছি এবং একটি ফাইলে আউটপুট লিখছি।

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.