中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java實現爬取百度圖片的方法分析

發布時間:2020-10-08 17:10:44 來源:腳本之家 閱讀:326 作者:Joker_Ye 欄目:編程語言

本文實例講述了Java實現爬取百度圖片的方法。分享給大家供大家參考,具體如下:

在以往用java來處理解析HTML文檔或者片段時,我們通常會采用htmlparser(http://htmlparser.sourceforge.net/)這個開源類庫。現在我們有了JSOUP,以后的處理HTML的內容只需要使用JSOUP就已經足夠了,JSOUP有更快的更新,更方便的API等。

jsoup 是一款 Java 的HTML 解析器,可直接解析某個URL地址、HTML文本內容。它提供了一套非常省力的API,可通過DOM,CSS以及類似于jQuery的操作方法來取出和操作數據,可以看作是java版的jQuery。

jsoup的主要功能如下:

  • 從一個URL,文件或字符串中解析HTML;
  • 使用DOM或CSS選擇器來查找、取出數據;
  • 可操作HTML元素、屬性、文本;

jsoup是基于MIT協議發布的,可放心使用于商業項目。官方網站:http://jsoup.org/

步驟大致可以分為三個模塊:一是獲取網頁的資源,二是解析獲取的資源,取出我們想要的圖片URL地址,三是通過java的io存儲在本地文件中。

獲取網頁資源的核心模塊就是通過Jsoup去獲取網頁的內容,具體核心代碼如下:

private static List<JsoupImageVO> findImageNoURl(String hotelId, String url, int timeOut) {
    List<JsoupImageVO> result = new ArrayList<JsoupImageVO>();
    Document document = null;
    try {
      document = Jsoup.connect(url).data("query", "Java")//請求參數
          .userAgent("Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)")//設置urer-agent get();
          .timeout(timeOut)
          .get();
      String xmlSource = document.toString();
      result = dealResult(xmlSource, hotelId);
    } catch (Exception e) {
      String defaultURL = "https://cache.yisu.com/upload/information/20200623/121/99971.jpg";
      result = dealResult(defaultURL,hotelId);
    }
    return result;
}

其中URL地址是百度圖片搜索的地址,具體調用代碼如下:

public static List<JsoupImageVO> findImage(String hotelName, String hotelId, int page) {
    int number=5;
    String url = "http://image.baidu.com/search/avatarjson?tn=resultjsonavatarnew&ie=utf-8&word=" + hotelName + "&cg=star&pn=" + page * 30 + "&rn="+number+"&itg=0&z=0&fr=&width=&height=&lm=-1&ic=0&s=0&st=-1&gsm=" + Integer.toHexString(page * 30);
    int timeOut = 5000;
    return findImageNoURl(hotelId, url, timeOut);
}

這里需要注意的是:word是我們要搜索的關鍵字,pn是顯示的頁碼,rn是一頁顯示多少個數據。

解析網頁的資源,然后封裝起來。核心代碼如下:

private static List<JsoupImageVO> dealResult(String xmlSource, String hotelId) {
    List<JsoupImageVO> result = new ArrayList<JsoupImageVO>();
    xmlSource = StringEscapeUtils.unescapeHtml3(xmlSource);
    String reg = "objURL\":\"http://.+?\\.(gif|jpeg|png|jpg|bmp)";
    Pattern pattern = Pattern.compile(reg);
    Matcher m = pattern.matcher(xmlSource);
    while (m.find()) {
      JsoupImageVO jsoupImageVO = new JsoupImageVO();
      String imageURL = m.group().substring(9);
      if(imageURL==null || "".equals(imageURL)){
        String defaultURL = "https://cache.yisu.com/upload/information/20200623/121/99971.jpg";
        jsoupImageVO.setUrl(defaultURL);
      }else{
        jsoupImageVO.setUrl(imageURL);
      }
      jsoupImageVO.setName(hotelId);
      result.add(jsoupImageVO);
    }
    return result;
}

這里最主要的地方就是reg這個正則表達式,通過正則表達式,去網頁中解析符合規定的圖片URL地址,然后封裝在對象中。

最后一部分就是通過java的io流去圖片地址獲取圖片,并保存在本地。核心代碼如下:

//根據圖片網絡地址下載圖片
public static void download(String url,String name,String path){
    File file= null;
    File dirFile=null;
    FileOutputStream fos=null;
    HttpURLConnection httpCon = null;
    URLConnection con = null;
    URL urlObj=null;
    InputStream in =null;
    byte[] size = new byte[1024];
    int num=0;
    try {
      dirFile = new File(path);
      if(dirFile.exists()){
        dirFile.delete();
      }
      dirFile.mkdir();
      file = new File(path+"http://"+name+".jpg");
      fos = new FileOutputStream(file);
      if(url.startsWith("http")){
        urlObj = new URL(url);
        con = urlObj.openConnection();
        httpCon =(HttpURLConnection) con;
        in = httpCon.getInputStream();
        while((num=in.read(size)) != -1){
          for(int i=0;i<num;i++)
            fos.write(size[i]);
        }
      }
    }catch (FileNotFoundException notFoundE) {
      LogUtils.writeLog("找不到該網絡圖片....");
    }catch(NullPointerException nullPointerE){
      LogUtils.writeLog("找不到該網絡圖片....");
    }catch(IOException ioE){
      LogUtils.writeLog("產生IO異常.....");
    }catch (Exception e) {
      e.printStackTrace();
    }finally{
      try {
        fos.close();
      } catch (Exception e) {
        e.printStackTrace();
      }
    }
}

這里面的操作都是java中io篇一些基礎的操作,有不懂的可以去看看java中io模塊的內容。

因為我這邊是maven項目,所以在開發前需要引入Jsoup依賴才可以。

源碼可點擊此處本站下載

更多關于java相關內容感興趣的讀者可查看本站專題:《Java網絡編程技巧總結》、《Java Socket編程技巧總結》、《Java文件與目錄操作技巧匯總》、《Java數據結構與算法教程》、《Java操作DOM節點技巧總結》和《Java緩存操作技巧匯總》

希望本文所述對大家java程序設計有所幫助。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

德惠市| 文昌市| 八宿县| 昌都县| 隆化县| 黄平县| 汪清县| 耿马| 琼海市| 青浦区| 临洮县| 枞阳县| 兴海县| 安达市| 津市市| 庄浪县| 邯郸市| 宝清县| 邳州市| 阿尔山市| 南丰县| 高要市| 桂林市| 巴里| 湖北省| 明水县| 德化县| 辽阳县| 贵定县| 福贡县| 含山县| 黎城县| 那曲县| 长寿区| 体育| 吉首市| 曲阳县| 浦县| 山丹县| 长汀县| 咸阳市|