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


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

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

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

  現在自己寫了一個簡單爬取網頁圖片的代碼,先分析一下自己寫的代碼吧

            //獲得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>,所以

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

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

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

//獲取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初學者,能力有限,如有更好的代碼或者教程可以留言,我們可以交流學習。
以上還有不足或者不對之處請指出,非常感謝個位。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM