跟朋友聊天總會用到大量表情包,有些人甚至專門收集各類各樣的表情包,看看誰能戰勝誰。今天我就用java爬取了一個鬥圖網站上的全部表情包,用來充實本身的表情包庫。代碼邏輯有可能並不完美,哈哈,也花了我幾個小時才完成呢。
下載完全部圖片,總共有225M.思路:主要經過解析頁面的源代碼來獲取圖片的URL地址,而後經過圖片地址下載圖片到本地,因此要學會使用瀏覽器進行分析。javascript
jsoup-1.8.1.jar
https://doutushe.com/portal/index/index/p/1
Chrome
/** * 獲取網頁源代碼 * @author Augustu * @param url 網頁地址 * @param encoding 網頁編碼 * @return 網頁源代碼 */ public static String getUrlResource(String url,String encoding) { //網頁源代碼,用String這個容器記錄 String htmlResource = ""; //記錄讀取網頁的每一行數據 String temp = null; try { //1,找到網站地址 URL theUrl = new URL(url); //2,創建起與網站的鏈接 URLConnection urlConnection = theUrl.openConnection(); //3,建立輸入流,此處讀取的是網頁的源代碼 InputStreamReader isr = new InputStreamReader(urlConnection.getInputStream(),encoding); //4,對輸入流進行緩衝,加快讀取速度 BufferedReader reader = new BufferedReader(isr); //5,一行一行讀取源代碼,存到htmlResource中 while((temp = reader.readLine()) != null) { htmlResource += temp; } } catch (IOException e) { e.printStackTrace(); } return htmlResource; }
/** * 獲取頁面全部組圖片的UrL地址 * @author Augustu * @param context 每一個頁面的urL * @return 獲取頁面全部組圖片的UrL地址 */ public static String findPictureUrl(String context) { String temp = "";//暫時存儲獲得的每一個url String pictureUrl = "";//獲得全部URL //1,Jsoup將讀取的網頁源代碼解析爲Html文檔,即可以使用Jsoup的方法操做html元素了,就像javascript同樣 Document document = Jsoup.parse(context); //2,觀察網頁源代碼,發現每組圖片都鏈接到了另外一個URL地址,這個a標籤的class爲「link-2」 Elements groupUrl = document.getElementsByClass("link-2"); //3,遍歷每一個a標籤,獲得href for(Element ele: groupUrl) { //此處我發現每次Url都輸出兩次,也沒找到緣由,就用此方法先解決他 if(ele.attr("href") == temp) { continue; } temp = ele.attr("href"); //4,將全部URL存入String中,並使用空格分開,便於後面分割 //原本我使用「|」分隔開來,分割的結果居然是每一個字符都分開了 pictureUrl += "https://doutushe.com"+ele.attr("href")+" "; } return pictureUrl; }
/** * 下載單張圖片 * @param picturl 圖片地址 * @param filePath 下載路徑 * @param fileName 下載名 */ public static void downPicture(String picturl,String filePath,String fileName) { FileOutputStream fos = null;//輸出文件流 BufferedOutputStream bos = null;//緩衝輸出 File file = null;//建立文件對象 File dir = new File(filePath);//建立文件保存目錄 Connection.Response response; try { //1,Jsoup鏈接地址,獲得響應流,ignoreContentType表示忽略網頁類型,若是不加會報錯(默認只支持文本),由於咱們頁面是圖片 response = Jsoup.connect(picturl).ignoreContentType(true).execute(); //2,將頁面內容按字節輸出 byte[] img = response.bodyAsBytes(); //3,寫入本地文件中 //判斷文件目錄是否存在, if(!dir.exists() ){ dir.mkdir();//建立文件夾 } file = new File(filePath+"\\"+fileName);//建立文件 fos = new FileOutputStream(file); bos = new BufferedOutputStream(fos); bos.write(img);//寫入本地 } catch (IOException e) { e.printStackTrace(); }finally{ //4,釋放資源 if(bos!=null){ try { bos.close(); } catch (IOException e) { e.printStackTrace(); } } if(fos!=null){ try { fos.close(); } catch (IOException e) { e.printStackTrace(); } } } }
/** * 下載全部圖片 * @author Augustu * @param pictureUrl 每組圖片url */ public static void downallPicture(String pictureUrl,String downLoadPath) { String picturl = ""; String pictureName ="";// String[] pictureUrlArry = pictureUrl.split(" ");//圖片組的url for(int i=0;i<pictureUrlArry.length;i++) { //遍歷獲得每組圖片的url String pictureHtml = getUrlResource(pictureUrlArry[i],"utf-8"); Document document = Jsoup.parse(pictureHtml); //獲得該組圖片的分類名稱 String dir = document.getElementsByTag("blockquote").first().child(0).text(); //該標籤包含全部圖片url Elements elements = document.getElementsByClass("lazy"); for(Element ele: elements) { //獲得每張圖片url picturl = ele.attr("data-original"); //觀察源代碼,發現獲取的圖片地址多了/themes/doutushe/Public/assets/images/doutushe-erweima.jpg,將其刪除 if(picturl.equals("/themes/doutushe/Public/assets/images/doutushe-erweima.jpg")) { continue; } //獲得每張圖片的名字,別忘了加後綴 pictureName = ele.attr("title")+".gif"; //下載該圖片 downPicture(picturl,downLoadPath+"\\"+dir,pictureName); } } }
public static void main(String[] args) { String context = ""; //觀察源代碼,發現共有28個頁面 for(int i=1;i<=28;i++) { //獲取每一個頁面 context = getUrlResource("https://doutushe.com/portal/index/index/p/"+i+"","utf-8"); //獲取該頁面全部組圖片的url String pictureUrl = findPictureUrl(context); downallPicture(pictureUrl,"E:\\image\\表情包"); } }