Java網絡爬蟲基礎


做Java爬蟲相比於python較爲複雜一點,python的幾行代碼就可以抓取一個網頁,Java可能需要幾十行甚至跟多,因此從代碼量來看python更具有爬蟲優勢,但是Java也不是不可以做爬蟲,由於我們學習Java基礎語法,爲了鞏固自己的基礎知識,我們可以通過爬蟲來掌握相關知識。

Java的java.net包中還提供了高層次網絡編程類——URL,通過URL類訪問互聯網資源。

一、使用URL類

Java 的java.net.URL類用於請求互聯網上的資源,採用HTTP/HTTPS協議,請求方法是GET方法,一般 是請求靜態的、少量的服務器端數據。
URL類常用構造方法:

  • URL(String spec):根據字符串表示形式創建URL對象。
  • URL(String protocol, String host, String file):根據指定的協議名、主機名和文件名稱創建URL對 象。
  • URL(String protocol, String host, int port, String file):根據指定的協議名、主機名、端口號和文件 名稱創建URL對象。

URL類常用方法:

  • InputStream openStream():打開到此URL的連接,並返回一個輸入流。
  • URLConnection openConnection():打開到此URL的新連接,返回一個URLConnection對象。

下面介紹一下如何使用java.net.URL類來做簡單的網頁抓取,示例代碼如下:

mport java.io.*;
import java.net.MalformedURLException;
import java.net.URL;

/**
 * @author : 蔡政潔
 * @email :[email protected]
 * @date : 2020/2/21
 * @time : 11:04 下午
 */
//Java網絡爬蟲
public class HelloWorld {
    public static void main(String[] args) {
//        Web網址
        String url = "https://www.sina.com.cn/";
        URL reqURL = null;
        try {
            reqURL = new URL(url);

        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
        try (
//                打開網絡通信輸入流
                InputStream inputStream = reqURL.openStream();
                InputStreamReader inputStreamReader = new InputStreamReader(inputStream,"utf-8");
                BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
                ){
            StringBuilder sb = new StringBuilder();
            String line = bufferedReader.readLine();
            while (line !=null){
                sb.append(line);
                sb.append('\n');
                line = bufferedReader.readLine();
            }
//            日誌輸出
            System.out.println(sb);
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

二、使用HttpURLConnection發送GET請求

由於URL類只能發送HTTP/HTTPS的GET方法請求,如果要想發送其他的情況或者對網絡請求有更深入的控制時,可以使用HttpURLConnection類型。
代碼如下:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

/**
 * @author : 蔡政潔
 * @email :[email protected]
 * @date : 2020/2/21
 * @time : 11:29 下午
 */

public class HelloWorld {
    static String urlString = "https://blog.csdn.net/weixin_45366499";

    public static void main(String[] args) {
        BufferedReader br = null;
        HttpURLConnection conn = null;
        try {
            URL reqURL = new URL(urlString);
//            用reqURL.openConnection()打開一個連接,返回HttpURLConnection對象
            conn = (HttpURLConnection) reqURL.openConnection();
//            請求方法設置爲get方法
            conn.setRequestMethod("GET");

//            打開網絡通信輸入流
            InputStream is = conn.getInputStream();
//            通過is創建InputStreamReader對象
            InputStreamReader isr = new InputStreamReader(is,"utf-8");
//            通過isr創建
            br = new BufferedReader(isr);

            StringBuilder sb = new StringBuilder();
            String line = br.readLine();
            while (line !=null){
                sb.append(line);
                sb.append('\n');
                line = br.readLine();
            }
//            輸出日誌
            System.out.println(sb);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        finally {
            if (conn != null){
//                斷開連接
                conn.disconnect();
            }
            if (br != null){
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

三、使用HttpURLConnection發送POST請求

HttpURLConnection也可以發送HTTP/HTTPS的POST請求,下面介紹如何使用HttpURLConnection發送POST請求。

import java.io.*;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

/**
 * @author : 蔡政潔
 * @email :[email protected]
 * @date : 2020/2/22
 * @time : 6:45 下午
 */
public class HelloWorld {
//    web服務網址
    static String urlstring = "https://blog.csdn.net/weixin_45366499";
    public static void main(String[] args) {
        BufferedReader br = null;
        HttpURLConnection conn = null;
        try {
            URL reqURL = new URL(urlstring);
            //            用reqURL.openConnection()打開一個連接,返回HttpURLConnection對象
            conn = (HttpURLConnection) reqURL.openConnection();
//            HTTP請求方法爲POST
            conn.setRequestMethod("POST");
//            設置請求過程中可以傳遞參數給服務器
            conn.setDoInput(true);

            String parm = " ";
//            設置參數
            DataOutputStream dataOutputStream = new DataOutputStream(conn.getOutputStream());
            dataOutputStream.writeBytes(parm);
            dataOutputStream.close();

//            打開網絡通信輸入流
            InputStream is = conn.getInputStream();
//            通過is創建 InputStreamReader對象
            InputStreamReader isr = new InputStreamReader(is,"utf-8");
//            通過isr創建BufferedReader對象
            br = new BufferedReader(isr);

            StringBuilder sb = new StringBuilder();
            String line = br.readLine();

            while (line != null){
                sb.append(line);
                sb.append('\n');
                line = br.readLine();
            }
//            日誌輸出
            System.out.println(sb);

        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if (conn != null){
                conn.disconnect();
            }
            if (br != null){
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }
}

四、下載案例

爲了進一步熟悉URL類,介紹一個下載案例程序Downloader。通過下載網上圖片

import java.io.*;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

/**
 * @author : 蔡政潔
 * @email :[email protected]
 * @date : 2020/2/22
 * @time : 7:55 下午
 */

public class Downloader {
//    web服務網址
    static String urlString = "http://a3.att.hudong.com/68/61/300000839764127060614318218_950.jpg";

    public static void main(String[] args) {
        dowmload();
    }
    private static void dowmload(){
        HttpURLConnection conn = null;
        try {
//            創建URL對象
            URL requrl = new URL(urlString);
//            打開鏈接
            conn= (HttpURLConnection) requrl.openConnection();
            try (
//                    從連接對象獲得輸入流
                    InputStream is = conn.getInputStream();
                    BufferedInputStream bufferedInputStream = new BufferedInputStream(is);
//                    創建文件輸出流
                    OutputStream os = new FileOutputStream("./download.jpg");
                    BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(os);
                    ){
                byte[] buffer = new byte[1024];
                int bytesRead =bufferedInputStream.read(buffer);

                while (bytesRead !=-1){
                    bufferedOutputStream.write(buffer,0,bytesRead);
                    bytesRead = bufferedInputStream.read(buffer);
                }

            }catch (IOException e){
                e.printStackTrace();
            }
            System.out.println("下載完成!");
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if (conn != null){
                conn.disconnect();
            }
        }
    }
}

運行結果就是把網上的一張圖片下載到自己的電腦上,有興趣可以試一下。

以上內容僅供參考學習,如有侵權請聯繫我刪除!
如果這篇文章對您有幫助,左下角的大拇指就是對博主最大的鼓勵。
您的鼓勵就是博主最大的動力!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章