java爬蟲-簡單爬取網頁圖片

  剛剛接觸到「爬蟲」這個詞的時候是在大一,那時候什麼都不明白,但知道了百度、谷歌他們的搜索引擎就是個爬蟲。html

如今大二。再次燃起對爬蟲的熱愛,查閱資料,知道經常使用java、python語言編程,此次我選擇了java。在網上查找的java

代碼在本地跑大部分都不能使用,查找相關的資料教程也沒有適合的。實在頭疼、、、python

  如今本身寫了一個簡單爬取網頁圖片的代碼,先分析一下本身寫的代碼吧正則表達式

            //得到html文本內容
            String HTML = cm.getHtml(URL);
            //獲取圖片標籤
            List<String> imgUrl = cm.getImageUrl(HTML);
            //獲取圖片src地址
            List<String> imgSrc = cm.getImageSrc(imgUrl);
            //下載圖片
            cm.Download(imgSrc);

  簡單分爲四個功能方法(函數),首先是要獲取html文本編程

 //獲取HTML內容
    private String getHtml(String url)throws Exception{
        URL url1=new URL(url);//使用java.net.URL
        URLConnection connection=url1.openConnection();//打開連接
        InputStream in=connection.getInputStream();//獲取輸入流
        InputStreamReader isr=new InputStreamReader(in);//流的包裝
        BufferedReader br=new BufferedReader(isr);

        String line;
        StringBuffer sb=new StringBuffer();
        while((line=br.readLine())!=null){//整行讀取
            sb.append(line,0,line.length());//添加到StringBuffer中
            sb.append('\n');//添加換行符
        }
        //關閉各類流,先聲明的後關閉
        br.close();
        isr.close();
        in.close();
        return sb.toString();
    }

而後在獲取的html文本中尋找圖片,根據html標記語言不難發現圖片一般帶有<img>,因此app

寫一個關於img的正則表達式函數

    // 獲取img標籤正則
    private static final String IMGURL_REG = "<img.*src=(.*?)[^>]*?>";

接着是獲取img標籤信息,大部分涉及的是集合接口和正則表達式的知識oop

//獲取ImageUrl地址
    private List<String> getImageUrl(String html){
        Matcher matcher=Pattern.compile(IMGURL_REG).matcher(html);
        List<String>listimgurl=new ArrayList<String>();
        while (matcher.find()){
            listimgurl.add(matcher.group());
        }
        return listimgurl;
    }

而後獲取img標籤信息中找取圖片的地址信息,須要構造圖片地址的正則表達式學習

// 獲取src路徑的正則
    private static final String IMGSRC_REG = "[a-zA-z]+://[^\\s]*";

接着是獲取圖片地址的信息,大部分涉及的也是集合接口和正則表達式的知識搜索引擎

//獲取ImageSrc地址
    private List<String> getImageSrc(List<String> listimageurl){
        List<String> listImageSrc=new ArrayList<String>();
        for (String image:listimageurl){
            Matcher matcher=Pattern.compile(IMGSRC_REG).matcher(image);
            while (matcher.find()){
                listImageSrc.add(matcher.group().substring(0, matcher.group().length()-1));
            }
        }
        return listImageSrc;
    }

最後經過圖片地址信息下載圖片

//下載圖片
    private void Download(List<String> listImgSrc) {
        try {
            //開始時間
            Date begindate = new Date();
            for (String url : listImgSrc) {
                //開始時間
                Date begindate2 = new Date();
                String imageName = url.substring(url.lastIndexOf("/") + 1, url.length());
                URL uri = new URL(url);
                InputStream in = uri.openStream();
                FileOutputStream fo = new FileOutputStream(new File("src/res/"+imageName));//文件輸出流
                byte[] buf = new byte[1024];
                int length = 0;
                System.out.println("開始下載:" + url);
                while ((length = in.read(buf, 0, buf.length)) != -1) {
                    fo.write(buf, 0, length);
                }
                //關閉流
                in.close();
                fo.close();
                System.out.println(imageName + "下載完成");
                //結束時間
                Date overdate2 = new Date();
                double time = overdate2.getTime() - begindate2.getTime();
                System.out.println("耗時:" + time / 1000 + "s");
            }
            Date overdate = new Date();
            double time = overdate.getTime() - begindate.getTime();
            System.out.println("總耗時:" + time / 1000 + "s");
        } catch (Exception e) {
            System.out.println("下載失敗");
        }
    }    

展現一下運行結果:

 

上一下所有代碼:

import java.io.*;
import java.net.URL;
import java.net.URLConnection;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {

    // 地址
    private static final String URL = "http://www.tooopen.com/view/1439719.html";
    // 獲取img標籤正則
    private static final String IMGURL_REG = "<img.*src=(.*?)[^>]*?>";
    // 獲取src路徑的正則
    private static final String IMGSRC_REG = "[a-zA-z]+://[^\\s]*";


    public static void main(String[] args) {
        try {
            Main cm=new Main();
            //得到html文本內容
            String HTML = cm.getHtml(URL);
            //獲取圖片標籤
            List<String> imgUrl = cm.getImageUrl(HTML);
            //獲取圖片src地址
            List<String> imgSrc = cm.getImageSrc(imgUrl);
            //下載圖片
            cm.Download(imgSrc);

        }catch (Exception e){
            System.out.println("發生錯誤");
        }

    }

   //獲取HTML內容
    private String getHtml(String url)throws Exception{
        URL url1=new URL(url);
        URLConnection connection=url1.openConnection();
        InputStream in=connection.getInputStream();
        InputStreamReader isr=new InputStreamReader(in);
        BufferedReader br=new BufferedReader(isr);

        String line;
        StringBuffer sb=new StringBuffer();
        while((line=br.readLine())!=null){
            sb.append(line,0,line.length());
            sb.append('\n');
        }
        br.close();
        isr.close();
        in.close();
        return sb.toString();
    }

    //獲取ImageUrl地址
    private List<String> getImageUrl(String html){
        Matcher matcher=Pattern.compile(IMGURL_REG).matcher(html);
        List<String>listimgurl=new ArrayList<String>();
        while (matcher.find()){
            listimgurl.add(matcher.group());
        }
        return listimgurl;
    }

    //獲取ImageSrc地址
    private List<String> getImageSrc(List<String> listimageurl){
        List<String> listImageSrc=new ArrayList<String>();
        for (String image:listimageurl){
            Matcher matcher=Pattern.compile(IMGSRC_REG).matcher(image);
            while (matcher.find()){
                listImageSrc.add(matcher.group().substring(0, matcher.group().length()-1));
            }
        }
        return listImageSrc;
    }

    //下載圖片
    private void Download(List<String> listImgSrc) {
        try {
            //開始時間
            Date begindate = new Date();
            for (String url : listImgSrc) {
                //開始時間
                Date begindate2 = new Date();
                String imageName = url.substring(url.lastIndexOf("/") + 1, url.length());
                URL uri = new URL(url);
                InputStream in = uri.openStream();
                FileOutputStream fo = new FileOutputStream(new File("src/res/"+imageName));
                byte[] buf = new byte[1024];
                int length = 0;
                System.out.println("開始下載:" + url);
                while ((length = in.read(buf, 0, buf.length)) != -1) {
                    fo.write(buf, 0, length);
                }
                in.close();
                fo.close();
                System.out.println(imageName + "下載完成");
                //結束時間
                Date overdate2 = new Date();
                double time = overdate2.getTime() - begindate2.getTime();
                System.out.println("耗時:" + time / 1000 + "s");
            }
            Date overdate = new Date();
            double time = overdate.getTime() - begindate.getTime();
            System.out.println("總耗時:" + time / 1000 + "s");
        } catch (Exception e) {
            System.out.println("下載失敗");
        }
    }
}

  本人仍是java初學者,能力有限,若有更好的代碼或者教程能夠留言,咱們能夠交流學習。以上還有不足或者不對之處請指出,很是感謝個位。

相關文章
相關標籤/搜索