java簡易爬蟲Crawler

小型簡易爬蟲源碼(java版)



一,介紹:
          >這是我的第一個爬蟲,比較簡單,沒有隊列,廣度優先算法等,用list集合代替了隊列。
       >而且只爬取一個網址上面的圖片,並不是將網址中的鏈接<href>加入隊列,然後下載一個網址一個網址下載其中的圖片。
       >不過,這是前期的,處於摸索階段,後期學完隊列和廣算後,在涉及一點多線程,肯定會比想象中的更實用。

二,代碼:

Start_Crawler類:
[java] view plain copy
  1. package com.xhs.crawler;  
  2.   
  3. import java.util.Scanner;  
  4.   
  5. /** 
  6.  * @author XHS_12302 
  7.  * @version  1.0 
  8.  * @date  2017_07_11 
  9.  *  
  10.  *  
  11.  * @description 這是我的第一個爬蟲,比較簡單,沒有隊列,廣度優先算法等,用list集合代替了隊列。 
  12.  *              而且只爬取一個網址上面的圖片,並不是將網址中的鏈接<href>加入隊列,然後下載一個網址一個網址下載其中的圖片。 
  13.  *              不過,這是前期的,處於摸索階段,後期學完隊列和廣算後,在涉及一點多線程,肯定會比想象中的更實用 
  14.  */  
  15. public class Start_Crawler {  
  16.     public static void main(String[] args) {  
  17.         System.out.println("請輸入網址:");  
  18.           
  19.         //獲取用戶要爬取的網址  
  20.         Scanner in=new Scanner(System.in);  
  21.         String url=in.next();  
  22.           
  23.         //通過用戶的輸入建立一個Get_Html的一個g對象  
  24.         Get_Html g=new Get_Html(url);  
  25.         //調用g中的get()方法模擬請求網站服務器,返回迴應的字符串  
  26.         String htmlstr=g.get();  
  27.           
  28.         //建立一個Html_analyze對象ha用來分析服務器返回來的字符串  
  29.         Html_analyze ha=new Html_analyze(htmlstr);  
  30.           
  31.         /*for (String href :ha.analyzeHtmlHref()) { 
  32.             System.out.println(href); 
  33.         }*/  
  34.           
  35.         //調用ha.analyzeHtmlImage()方法將分析出來的圖片地址放進list裏面,傳回來一個圖片地址集合,  
  36.         //然後新建下載。  
  37.         new Download_pic().Download(ha.analyzeHtmlImage());  
  38.           
  39.         System.out.println("program has done!");  
  40.         in.close();  
  41.     }  
  42. }  

Get_Html類:

[java] view plain copy
  1. package com.xhs.crawler;  
  2.   
  3. import java.io.BufferedReader;  
  4. import java.io.FileWriter;  
  5. import java.io.IOException;  
  6. import java.io.InputStream;  
  7. import java.io.InputStreamReader;  
  8. import java.net.HttpURLConnection;  
  9. import java.net.URL;  
  10. import java.net.URLConnection;  
  11.   
  12. public class Get_Html {  
  13.     private String url_path;  
  14.     private String htmlstr;  
  15.     StringBuffer contentBuffer = new StringBuffer();  
  16.     Get_Html(String url){  
  17.         this.url_path=url;  
  18.     }  
  19.   
  20.     public String get(){  
  21.            FileWriter fw=null;  
  22.         try {  
  23.             fw=new FileWriter("C:\\Users\\Administrator\\Desktop\\crawler.txt");  
  24.             URL url=new URL(url_path);  
  25.             URLConnection hc=url.openConnection();  
  26.             hc.setConnectTimeout(5000);  
  27.             hc.setDoInput(true);  
  28.             ((HttpURLConnection) hc).setRequestMethod("GET");  
  29.             int returnCode=((HttpURLConnection) hc).getResponseCode();  
  30.             if(returnCode==200){  
  31.                 InputStream input=hc.getInputStream();  
  32.                   
  33.                  InputStreamReader istreamReader = new InputStreamReader(input, "utf-8");    
  34.                  BufferedReader buffStr = new BufferedReader(istreamReader);    
  35.             
  36.                 String str = null;    
  37.                while ((str = buffStr.readLine()) != null)   
  38.                   contentBuffer.append(str);  
  39.                   htmlstr=contentBuffer.toString();  
  40.                   fw.write(htmlstr);  
  41.                input.close();  
  42.                istreamReader.close();  
  43.                buffStr.close();  
  44.                fw.close();  
  45.             }  
  46.         } catch (IOException e) {  
  47.             // TODO Auto-generated catch block  
  48.             e.printStackTrace();  
  49.         }  
  50.         return htmlstr;  
  51.           
  52.     }  
  53.       
  54.       
  55. }  

Html_analyze類:
[java] view plain copy
  1. package com.xhs.crawler;  
  2.   
  3.   
  4. import java.util.ArrayList;  
  5. import java.util.List;  
  6. import java.util.regex.Matcher;  
  7. import java.util.regex.Pattern;  
  8.   
  9. public class Html_analyze {  
  10.     private String src;  
  11.     Html_analyze(String src){  
  12.         this.src=src;  
  13.     }  
  14.     public List<String> analyzeHtmlImage(){  
  15.         String regex="http[s]{0,1}://[^\\s]*\\.(jpg|bmp|png)";  
  16.         //String sr="http://img5.imgtn.bdimg.com/it/u=1380084653,2448555822&fm=26&gp=0.jpg";  
  17.         List<String> listImgUrl=new ArrayList<>();  
  18.         Pattern p=Pattern.compile(regex);  
  19.         Matcher m=p.matcher(src);  
  20.         while(m.find()){  
  21.             System.out.println(m.group());  
  22.             listImgUrl.add(m.group());  
  23.         }  
  24.         System.out.println("\n\n總共找到記錄:"+listImgUrl.size()+"\n");  
  25.         return listImgUrl;  
  26.     }  
  27.     public List<String>  analyzeHtmlHref(){  
  28.         //分析href標籤   並且加入listHref  
  29.         String regex="<a.*?href=\"(.*?)\">";  
  30.         List<String> listHref=new ArrayList<>();  
  31.         Pattern p=Pattern.compile(regex);  
  32.         Matcher m=p.matcher(src);  
  33.         while(m.find()){  
  34.             listHref.add(m.group());  
  35.         }  
  36.         return listHref;  
  37.     }  
  38. }  

Download_pic類:
[java] view plain copy
  1. package com.xhs.crawler;  
  2.   
  3. import java.io.File;  
  4.   
  5. import java.io.FileOutputStream;  
  6. import java.io.IOException;  
  7. import java.io.InputStream;  
  8. import java.net.HttpURLConnection;  
  9. import java.net.URL;  
  10.   
  11. import java.util.List;  
  12.   
  13. public class Download_pic {  
  14.     public void Download(List<String> listImgSrc) {  
  15.         int count = 1;  
  16.         for (String url_path : listImgSrc) {  
  17.             InputStream in = null;  
  18.             FileOutputStream fo = null;  
  19.             String imageName = url_path.substring(  
  20.                     url_path.lastIndexOf("/") + 1, url_path.length());  
  21.             try {  
  22.                 byte[] data = new byte[500];// 1024  
  23.                 File f = new File(  
  24.                         "C:\\Users\\Administrator\\Desktop\\crawler\\");  
  25.                 if (!f.exists()) {  
  26.                     f.mkdir();  
  27.                 }  
  28.                 fo = new FileOutputStream(new File(f.getAbsolutePath() + "\\"  
  29.                         + imageName));  
  30.                 URL url = new URL(url_path);  
  31.                 HttpURLConnection con = (HttpURLConnection) url  
  32.                         .openConnection();  
  33.                 con.setConnectTimeout(5000);  
  34.                 con.setDoInput(true);  
  35.                 con.setRequestMethod("GET");  
  36.                 // con.setRequestProperty("user-agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");  
  37.                 // 設置代理  
  38.                 int numCode = con.getResponseCode();  
  39.                 in = con.getInputStream();// int length  
  40.                 int lengthZ = 0;  
  41.                 if (numCode == 200) {  
  42.                     while ((lengthZ = in.read(data)) != -1) {  
  43.                         fo.write(data, 0, lengthZ); // write(data,0,length);  
  44.                         fo.flush();  
  45.                     }  
  46.                     System.out.println("下載成功:\t" + imageName + "\t剩餘:\t"  
  47.                             + (listImgSrc.size() - count));  
  48.                 } else {  
  49.                     System.out.println("訪問失敗,返回碼不是200");  
  50.                 }  
  51.   
  52.             } catch (Exception e) {  
  53.                 // TODO Auto-generated catch block  
  54.                 e.printStackTrace();  
  55.                 System.out.println(imageName + "下載失敗");  
  56.             } finally {  
  57.                 try {  
  58.                     if (in != null)  
  59.                         in.close();  
  60.                     if (fo != null)  
  61.                         fo.close();  
  62.                     count++;  
  63.                 } catch (IOException e) {  
  64.                     // TODO Auto-generated catch block  
  65.                     // e.printStackTrace();  
  66.                     System.out.println("關閉流出現點問題··");  
  67.                 }  
  68.             }  
  69.   
  70.         }  
  71.     }  
  72.   
  73. }  

三:截圖




這個只是簡易的小東西,不過感覺挺好玩的。
       感興趣的朋友可以自己試試,如果不能滿足你要求,
               這兒給你提供一種想法,你可以利用這種特性爬
                      取csdn博客文章訪問量。^_^



聯繫郵箱:[email protected]

                                                                                                                                                                                                                                                                                                                                                               2017_07_11
發佈了78 篇原創文章 · 獲贊 26 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章