欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java 爬蟲服務(wù)器被屏蔽的解決方案

 更新時(shí)間:2019年10月17日 09:37:14   作者:平頭哥的技術(shù)博文  
這篇文章主要介紹了Java 爬蟲服務(wù)器被屏蔽的解決方案,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

這是 Java 爬蟲系列博文的第四篇,在上一篇Java 爬蟲數(shù)據(jù)異步加載如何解決,試試這兩種辦法! 中,我們從內(nèi)置瀏覽器內(nèi)核和反向解析法兩個(gè)角度簡單的聊了聊關(guān)于處理數(shù)據(jù)異步加載問題。在這篇文章中,我們簡單的來聊一聊爬蟲時(shí),資源網(wǎng)站根據(jù)用戶訪問行為屏蔽掉爬蟲程序及其對(duì)應(yīng)的解決辦法。

屏蔽爬蟲程序是資源網(wǎng)站的一種保護(hù)措施,最常用的反爬蟲策略應(yīng)該是基于用戶的訪問行為。比如限制每臺(tái)服務(wù)器在一定的時(shí)間內(nèi)只能訪問 X 次,超過該次數(shù)就認(rèn)為這是爬蟲程序進(jìn)行的訪問,基于用戶訪問行為判斷是否是爬蟲程序也不止是根據(jù)訪問次數(shù),還會(huì)根據(jù)每次請(qǐng)求的User Agent 請(qǐng)求頭、每次訪問的間隔時(shí)間等。總的來說是由多個(gè)因數(shù)決定的,其中以訪問次數(shù)為主。

反爬蟲是每個(gè)資源網(wǎng)站自保的措施,旨在保護(hù)資源不被爬蟲程序占用。例如我們前面使用到的豆瓣網(wǎng),它會(huì)根據(jù)用戶訪問行為來屏蔽掉爬蟲程序,每個(gè) IP 在每分鐘訪問次數(shù)達(dá)到一定次數(shù)后,后面一段時(shí)間內(nèi)的請(qǐng)求返回直接返回 403 錯(cuò)誤,以為著你沒有權(quán)限訪問該頁面。所以我們今天再次拿豆瓣網(wǎng)為例,我們用程序模擬出這個(gè)現(xiàn)象,下面是我編寫的一個(gè)采集豆瓣電影的程序

/**
 * 采集豆瓣電影
 */
public class CrawlerMovie {

  public static void main(String[] args) {
    try {
      CrawlerMovie crawlerMovie = new CrawlerMovie();
      // 豆瓣電影鏈接
      List<String> movies = crawlerMovie.movieList();
      //創(chuàng)建10個(gè)線程的線程池
      ExecutorService exec = Executors.newFixedThreadPool(10);
      for (String url : movies) {
        //執(zhí)行線程
        exec.execute(new CrawlMovieThread(url));
      }
      //線程關(guān)閉
      exec.shutdown();
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

  /**
   * 豆瓣電影列表鏈接
   * 采用反向解析法
   *
   * @return
   */
  public List<String> movieList() throws Exception {
    // 獲取100條電影鏈接
    String url = "https://movie.douban.com/j/search_subjects?type=movie&tag=熱門&sort=recommend&page_limit=200&page_start=0";
    CloseableHttpClient client = HttpClients.createDefault();
    List<String> movies = new ArrayList<>(100);
    try {
      HttpGet httpGet = new HttpGet(url);
      CloseableHttpResponse response = client.execute(httpGet);
      System.out.println("獲取豆瓣電影列表,返回驗(yàn)證碼:" + response.getStatusLine().getStatusCode());
      if (response.getStatusLine().getStatusCode() == 200) {
        HttpEntity entity = response.getEntity();
        String body = EntityUtils.toString(entity, "utf-8");
        // 將請(qǐng)求結(jié)果格式化成json
        JSONObject jsonObject = JSON.parseObject(body);
        JSONArray data = jsonObject.getJSONArray("subjects");
        for (int i = 0; i < data.size(); i++) {
          JSONObject movie = data.getJSONObject(i);
          movies.add(movie.getString("url"));
        }
      }
      response.close();
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      client.close();
    }
    return movies;
  }
}
/**
 * 采集豆瓣電影線程
 */
class CrawlMovieThread extends Thread {
  // 待采集鏈接
  String url;

  public CrawlMovieThread(String url) {
    this.url = url;
  }
  public void run() {
    try {
      Connection connection = Jsoup.connect(url)
          .method(Connection.Method.GET)
          .timeout(50000);
      Connection.Response Response = connection.execute();
      System.out.println("采集豆瓣電影,返回狀態(tài)碼:" + Response.statusCode());
    } catch (Exception e) {
      System.out.println("采集豆瓣電影,采集出異常:" + e.getMessage());
    }
  }
}

這段程序的邏輯比較簡單,先采集到豆瓣熱門電影,這里使用直接訪問 Ajax 獲取豆瓣熱門電影的鏈接,然后解析出電影的詳情頁鏈接,多線程訪問詳情頁鏈接,因?yàn)橹挥性诙嗑€程的情況下才能達(dá)到豆瓣的訪問要求。豆瓣熱門電影頁面如下:

多次運(yùn)行上面的程序,你最后會(huì)得到下圖的結(jié)果

從上圖中我們可以看出,httpclient 訪問返回的狀態(tài)碼為 403 ,說明我們已經(jīng)沒有權(quán)限訪問該頁面了,也就是說豆瓣網(wǎng)已經(jīng)認(rèn)為我們是爬蟲程序啦,拒接掉了我們的訪問請(qǐng)求。我們來分析一下我們現(xiàn)在的訪問架構(gòu),因?yàn)槲覀兪侵苯釉L問豆瓣網(wǎng)的,所以此時(shí)的訪問架構(gòu)如下圖所示:

我們想要突破這層限制的話,我們就不能直接訪問豆瓣網(wǎng)的服務(wù)器,我們需要拉入第三方,讓別人代替我們?nèi)ピL問,我們每次訪問都找不同的人,這樣就不會(huì)被限制了,這個(gè)也就是所謂的 IP代理。 此時(shí)的訪問架構(gòu)就變成了下面這張圖:

我們使用的 IP代理,我們就需要有 IP代理池,接下來我們就來聊一聊 IP 代理池

IP 代理池

代理服務(wù)器有很多廠商在做這一塊,具體的我就不說了,自己百度 IP 代理可以搜出一大堆,這些 IP代理商都有提供收費(fèi)和免費(fèi)的代理 IP,收費(fèi)的代理 IP可用性高,速度快,在線上環(huán)境如果需要使用代理的話,建議使用收費(fèi)的代理 IP。如果只是自己研究的話,我們就可以去采集這些廠商的免費(fèi)公開代理 IP,這些 IP 的性能和可用性都比較差,但是不影響我們使用。

因?yàn)槲覀兪?Demo 項(xiàng)目,所以我們就自己搭建 IP代理池。我們?cè)撛趺丛O(shè)計(jì)一個(gè) IP代理池呢?下圖是我畫的簡單 IP代理池架構(gòu)圖

從上面的架構(gòu)圖中,可以看出一個(gè) IP 代理系統(tǒng)會(huì)涉及到 4 個(gè)模塊,分別為 IP 采集模塊、 IP 存儲(chǔ)模塊、IP 檢測模塊和 API 接口模塊。

IP 采集模塊

負(fù)責(zé)從各大 IP代理廠商采集代理 IP,采集的網(wǎng)站越多,代理 IP 的可用性就越高

IP 存儲(chǔ)模塊

存儲(chǔ)采集回來的代理 IP,比較常用的是 Redis 這樣的高性能的數(shù)據(jù)庫,在存儲(chǔ)方面我們需要存儲(chǔ)兩種數(shù)據(jù),一種是檢測可用的代理 IP,另一種是采集回來還未檢測的代理 IP。

IP 檢測模塊

檢測采集回來的 IP 是否可用,這樣能夠讓我們提供的 IP 可用性變高,我們先過濾掉不可用的 IP。

API 接口模塊

以接口的形式對(duì)外提供可用代理 IP

上面就是關(guān)于 IP代理池的相關(guān)設(shè)計(jì),對(duì)于這些我們只需要簡單了解一下就行了,因?yàn)楝F(xiàn)在基本上不需要我們?nèi)ゾ帉?IP代理池服務(wù)啦,在 GitHub 上已經(jīng)有大量優(yōu)秀的開源項(xiàng)目,沒必要重復(fù)造輪子啦。我為大家選取了在 GitHub 上有 8K star 的開源 IP代理池項(xiàng)目 proxy_pool ,我們將使用它作為我們 IP 代理池。關(guān)于 proxy_pool 請(qǐng)?jiān)L問:https://github.com/jhao104/proxy_pool

部署 proxy_pool

proxy_pool 是用 python 語言寫的,不過這也沒什么關(guān)系,因?yàn)楝F(xiàn)在都可以容器化部署,使用容器化部署可以屏蔽掉一些環(huán)境的安裝,只需要運(yùn)行鏡像就可以運(yùn)行服務(wù)了,并不需要知道它里面的具體實(shí)現(xiàn),所以這個(gè)項(xiàng)目不懂 Python 的 Java 程序員也是可以使用的。proxy_pool 使用的是 Redis 來存儲(chǔ)采集的 IP,所以在啟動(dòng) proxy_pool 前,你需要先啟動(dòng) Redis 服務(wù)。下面是 proxy_pool docker啟動(dòng)步驟。

拉取鏡像

docker pull jhao104/proxy_pool

運(yùn)行鏡像

docker run --env db_type=REDIS --env db_host=127.0.0.1 --env db_port=6379 --env db_password=pwd_str -p 5010:5010 jhao104/proxy_pool

運(yùn)行鏡像后,我們等待一段時(shí)間,因?yàn)榈谝淮螁?dòng)采集數(shù)據(jù)和處理數(shù)據(jù)需要一段時(shí)間。等待之后訪問 http://{your_host}:5010/get_all/,如果你得到下圖所示的結(jié)果,說明 proxy_pool 項(xiàng)目你已經(jīng)部署成功。

使用 IP 代理

搭建好 IP代理池之后,我們就可以使用代理 IP 來采集豆瓣電影啦,我們已經(jīng)知道了除了 IP 之外,User Agent 請(qǐng)求頭也會(huì)是豆瓣網(wǎng)判斷訪問是否是爬蟲程序的一個(gè)因素,所以我們也對(duì) User Agent 請(qǐng)求頭進(jìn)行偽造,我們每次訪問使用不同的 User Agent 請(qǐng)求頭。

我們?yōu)槎拱觌娪安杉绦蛞?IP代理和 隨機(jī) User Agent 請(qǐng)求頭,具體代碼如下:

public class CrawlerMovieProxy {

  /**
   * 常用 user agent 列表
   */
  static List<String> USER_AGENT = new ArrayList<String>(10) {
    {
      add("Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19");
      add("Mozilla/5.0 (Linux; U; Android 4.0.4; en-gb; GT-I9300 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30");
      add("Mozilla/5.0 (Linux; U; Android 2.2; en-gb; GT-P1000 Build/FROYO) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1");
      add("Mozilla/5.0 (Windows NT 6.2; WOW64; rv:21.0) Gecko/20100101 Firefox/21.0");
      add("Mozilla/5.0 (Android; Mobile; rv:14.0) Gecko/14.0 Firefox/14.0");
      add("Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.94 Safari/537.36");
      add("Mozilla/5.0 (Linux; Android 4.0.4; Galaxy Nexus Build/IMM76B) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.133 Mobile Safari/535.19");
      add("Mozilla/5.0 (iPad; CPU OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3");
      add("Mozilla/5.0 (iPod; U; CPU like Mac OS X; en) AppleWebKit/420.1 (KHTML, like Gecko) Version/3.0 Mobile/3A101a Safari/419.3");
    }
  };

  /**
   * 隨機(jī)獲取 user agent
   *
   * @return
   */
  public String randomUserAgent() {
    Random random = new Random();
    int num = random.nextInt(USER_AGENT.size());
    return USER_AGENT.get(num);
  }

  /**
   * 設(shè)置代理ip池
   *
   * @param queue 隊(duì)列
   * @throws IOException
   */
  public void proxyIpPool(LinkedBlockingQueue<String> queue) throws IOException {


    // 每次能隨機(jī)獲取一個(gè)代理ip
    String proxyUrl = "http://192.168.99.100:5010/get_all/";

    CloseableHttpClient httpclient = HttpClients.createDefault();

    HttpGet httpGet = new HttpGet(proxyUrl);
    CloseableHttpResponse response = httpclient.execute(httpGet);
    if (response.getStatusLine().getStatusCode() == 200) {
      HttpEntity entity = response.getEntity();
      String body = EntityUtils.toString(entity, "utf-8");

      JSONArray jsonArray = JSON.parseArray(body);
      int size = Math.min(100, jsonArray.size());
      for (int i = 0; i < size; i++) {
        // 將請(qǐng)求結(jié)果格式化成json
        JSONObject data = jsonArray.getJSONObject(i);
        String proxy = data.getString("proxy");
        queue.add(proxy);
      }
    }
    response.close();
    httpclient.close();
    return;
  }


  /**
   * 隨機(jī)獲取一個(gè)代理ip
   *
   * @return
   * @throws IOException
   */
  public String randomProxyIp() throws IOException {

    // 每次能隨機(jī)獲取一個(gè)代理ip
    String proxyUrl = "http://192.168.99.100:5010/get/";

    String proxy = "";

    CloseableHttpClient httpclient = HttpClients.createDefault();

    HttpGet httpGet = new HttpGet(proxyUrl);
    CloseableHttpResponse response = httpclient.execute(httpGet);
    if (response.getStatusLine().getStatusCode() == 200) {
      HttpEntity entity = response.getEntity();
      String body = EntityUtils.toString(entity, "utf-8");
      // 將請(qǐng)求結(jié)果格式化成json
      JSONObject data = JSON.parseObject(body);
      proxy = data.getString("proxy");
    }
    return proxy;
  }

  /**
   * 豆瓣電影鏈接列表
   *
   * @return
   */
  public List<String> movieList(LinkedBlockingQueue<String> queue) {
    // 獲取60條電影鏈接
    String url = "https://movie.douban.com/j/search_subjects?type=movie&tag=熱門&sort=recommend&page_limit=40&page_start=0";
    List<String> movies = new ArrayList<>(40);
    try {
      CloseableHttpClient client = HttpClients.createDefault();
      HttpGet httpGet = new HttpGet(url);
      // 設(shè)置 ip 代理
      HttpHost proxy = null;
      // 隨機(jī)獲取一個(gè)代理IP
      String proxy_ip = randomProxyIp();
      if (StringUtils.isNotBlank(proxy_ip)) {
        String[] proxyList = proxy_ip.split(":");
        System.out.println(proxyList[0]);
        proxy = new HttpHost(proxyList[0], Integer.parseInt(proxyList[1]));
      }
      // 隨機(jī)獲取一個(gè)請(qǐng)求頭
      httpGet.setHeader("User-Agent", randomUserAgent());
      RequestConfig requestConfig = RequestConfig.custom()
          .setProxy(proxy)
          .setConnectTimeout(10000)
          .setSocketTimeout(10000)
          .setConnectionRequestTimeout(3000)
          .build();
      httpGet.setConfig(requestConfig);
      CloseableHttpResponse response = client.execute(httpGet);
      System.out.println("獲取豆瓣電影列表,返回驗(yàn)證碼:" + response.getStatusLine().getStatusCode());
      if (response.getStatusLine().getStatusCode() == 200) {
        HttpEntity entity = response.getEntity();
        String body = EntityUtils.toString(entity, "utf-8");
        // 將請(qǐng)求結(jié)果格式化成json
        JSONObject jsonObject = JSON.parseObject(body);
        JSONArray data = jsonObject.getJSONArray("subjects");
        for (int i = 0; i < data.size(); i++) {
          JSONObject movie = data.getJSONObject(i);
          movies.add(movie.getString("url"));
        }
      }
      response.close();
    } catch (Exception e) {
      e.printStackTrace();
    } finally {

    }
    return movies;
  }


  public static void main(String[] args) {
    // 存放代理ip的隊(duì)列
    LinkedBlockingQueue<String> queue = new LinkedBlockingQueue(100);

    try {
      CrawlerMovieProxy crawlerProxy = new CrawlerMovieProxy();
      // 初始化ip代理隊(duì)列
      crawlerProxy.proxyIpPool(queue);
      // 獲取豆瓣電影列表
      List<String> movies = crawlerProxy.movieList(queue);

      //創(chuàng)建固定大小的線程池
      ExecutorService exec = Executors.newFixedThreadPool(5);
      for (String url : movies) {
        //執(zhí)行線程
        exec.execute(new CrawlMovieProxyThread(url, queue, crawlerProxy));
      }
      //線程關(guān)閉
      exec.shutdown();
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

}

/**
 * 采集豆瓣電影線程
 */
class CrawlMovieProxyThread extends Thread {
  // 待采集鏈接
  String url;
  // 代理ip隊(duì)列
  LinkedBlockingQueue<String> queue;
  // 代理類
  CrawlerMovieProxy crawlerProxy;

  public CrawlMovieProxyThread(String url, LinkedBlockingQueue<String> queue, CrawlerMovieProxy crawlerProxy) {
    this.url = url;
    this.queue = queue;
    this.crawlerProxy = crawlerProxy;
  }

  public void run() {
    String proxy;
    String[] proxys = new String[2];
    try {
      Connection connection = Jsoup.connect(url)
          .method(Connection.Method.GET)
          .timeout(50000);

      // 如果代理ip隊(duì)列為空,則重新獲取ip代理
      if (queue.size() == 0) crawlerProxy.proxyIpPool(queue);
      // 從隊(duì)列中獲取代理ip
      proxy = queue.poll();
      // 解析代理ip
      proxys = proxy.split(":");
      // 設(shè)置代理ip
      connection.proxy(proxys[0], Integer.parseInt(proxys[1]));
      // 設(shè)置 user agent
      connection.header("User-Agent", crawlerProxy.randomUserAgent());
      Connection.Response Response = connection.execute();
      System.out.println("采集豆瓣電影,返回狀態(tài)碼:" + Response.statusCode() + " ,請(qǐng)求ip:" + proxys[0]);
    } catch (Exception e) {
      System.out.println("采集豆瓣電影,采集出異常:" + e.getMessage() + " ,請(qǐng)求ip:" + proxys[0]);
    }
  }
}

運(yùn)行修改后的采集程序,可能需要多次運(yùn)行,因?yàn)槟愕拇?IP 不一定每次都有效。代理 IP 有效的話,你將得到如下結(jié)果

結(jié)果中我們可以看出,40 次的電影詳情頁訪問,有大量的代理 IP 是無效的,只有一小部分的代理 IP 有效。結(jié)果直接證明了免費(fèi)的代理 IP 可用性不高,所以如果線上需要使用代理 IP 的話,最好使用收費(fèi)的代理 IP。盡管我們自己搭建的 IP代理池可用性不是太高,但是我們?cè)O(shè)置的 IP 代理訪問豆瓣電影已經(jīng)成功了,使用 IP 代理成功繞過了豆瓣網(wǎng)的限制。

關(guān)于爬蟲服務(wù)器被屏蔽,原因有很多,我們這篇文章主要介紹的是通過 設(shè)置 IP 代理和偽造 User Agent 請(qǐng)求頭來繞過豆瓣網(wǎng)的訪問限制。如何讓我們的程序不被資源網(wǎng)站視為爬蟲程序呢?需要做好以下三點(diǎn):

  • 偽造 User Agent 請(qǐng)求頭
  • 使用 IP 代理
  • 不固定的采集間隔時(shí)間

希望這篇文章對(duì)你有所幫助,下一篇是關(guān)于多線程爬蟲的探索。如果你對(duì)爬蟲感興趣,不妨關(guān)注一波,相互學(xué)習(xí),相互進(jìn)步

文章不足之處,望大家多多指點(diǎn),共同學(xué)習(xí),共同進(jìn)步

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • java實(shí)現(xiàn)隨機(jī)抽取獎(jiǎng)品工具類

    java實(shí)現(xiàn)隨機(jī)抽取獎(jiǎng)品工具類

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)隨機(jī)抽取獎(jiǎng)品工具類,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • idea運(yùn)行java的配置詳細(xì)教程(包含maven,mysql下載配置)

    idea運(yùn)行java的配置詳細(xì)教程(包含maven,mysql下載配置)

    程序員們?cè)陂_發(fā)的時(shí)候,一定會(huì)用到Intellij?IDEA這個(gè)集成開發(fā)環(huán)境,這篇文章主要給大家介紹了關(guān)于idea運(yùn)行java的配置(包含maven,mysql下載配置)的相關(guān)資料,需要的朋友可以參考下
    2024-05-05
  • SpringBoot中的CSRF攻擊及預(yù)防方法

    SpringBoot中的CSRF攻擊及預(yù)防方法

    CSRF攻擊是一種常見的網(wǎng)絡(luò)攻擊方式,可以通過欺騙用戶來執(zhí)行惡意操作,在Spring Boot應(yīng)用程序中,我們可以采取多種措施來預(yù)防CSRF攻擊,本文將給大家介紹一下CSRF攻擊以及如何預(yù)防攻擊,需要的朋友可以參考下
    2023-07-07
  • 如何基于js及java分析并封裝排序算法

    如何基于js及java分析并封裝排序算法

    這篇文章主要介紹了如何基于js及java分析并封裝排序算法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • Java動(dòng)態(tài)循環(huán)隊(duì)列是如何實(shí)現(xiàn)的

    Java動(dòng)態(tài)循環(huán)隊(duì)列是如何實(shí)現(xiàn)的

    今天帶大家學(xué)習(xí)java隊(duì)列的相關(guān)知識(shí),文章圍繞著如何實(shí)現(xiàn)Java動(dòng)態(tài)循環(huán)隊(duì)列展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • 淺談Java垃圾回收機(jī)制

    淺談Java垃圾回收機(jī)制

    這篇文章主要介紹了淺談Java垃圾回收機(jī)制,文中有非常詳細(xì)的圖文示例及代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有很好的幫助,需要的朋友可以參考下
    2021-05-05
  • Java while(scanner.hasNext())無法跳出的解決方案

    Java while(scanner.hasNext())無法跳出的解決方案

    這篇文章主要介紹了Java while(scanner.hasNext())無法跳出的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • drools規(guī)則動(dòng)態(tài)化實(shí)踐解析

    drools規(guī)則動(dòng)態(tài)化實(shí)踐解析

    這篇文章主要為大家介紹了drools規(guī)則動(dòng)態(tài)化實(shí)踐解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • IDEA創(chuàng)建Maven一直爆紅無法下載的問題解決辦法

    IDEA創(chuàng)建Maven一直爆紅無法下載的問題解決辦法

    這篇文章主要介紹了關(guān)于IDEA創(chuàng)建Maven一直爆紅無法下載的問題的解決辦法,文中圖文結(jié)合的方式給大家講解的非常詳細(xì),對(duì)大家解決辦法非常有用,需要的朋友可以參考下
    2024-06-06
  • 關(guān)于Java中Json的各種處理

    關(guān)于Java中Json的各種處理

    這篇文章主要介紹了關(guān)于Java中Json的各種處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06

最新評(píng)論