Java爬蟲之下載IMDB中Top250電影的圖片

介紹

  在博客:Scrapy爬蟲(4)爬取豆瓣電影Top250圖片中咱們利用Python的爬蟲框架Scrapy,將豆瓣電影Top250圖片下載到本身電腦上。那麼,在Java的爬蟲的也能夠下載圖片嗎?答案固然是確定的!
  在本次分享中,咱們將利用Java的Jsoup包和FileUtils.copyURLToFile()函數來實現圖片的下載。咱們將會爬取IMDB中Top250電影的圖片到本身電腦上,其網頁截圖以下:java

IMDB中Top250電影的圖片

思路

  咱們實現圖片下載的爬蟲思路以下:node

  • 利用Jsoup解析網頁,獲得電影圖片的url和name
  • 利用FileUtils.copyURLToFile()函數將圖片下載到本地

準備

  在本文程序中,除了Jsoup包外,還用到了commons-io包,其下載地址爲:https://mvnrepository.com/art... ,咱們主要利用該package中的FileUtils.copyURLToFile(). 讀者須要下載這兩個包,並將它們在Eclipse中加入到項目的路徑中。apache

程序

  本次分享的主要程序爲ImageScraper.java,其完整代碼以下:框架

package wikiScrape;

/* 本爬蟲爬取http://www.imdb.cn/IMDB250/中Top250的圖片
 * 先利用Jsoup解析獲得該網頁中的圖片的url
 * 而後利用FileUtils.copyURLToFile()函數將圖片下載到本地
 */

import java.io.*;
import java.net.*;
import java.util.Date;
import java.util.ArrayList;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;
import org.apache.commons.io.FileUtils;


public class ImageScraper {

    public static void main(String[] args) {
        Date d1 = new Date();
        
        System.out.println("爬蟲開始......");
        
        // 爬取的網址列表,一共十個網頁
        ArrayList<String> urls = new ArrayList<String>();
        urls.add("http://www.imdb.cn/IMDB250/");
        for(int i=2; i<=10; i++) {
            urls.add("http://www.imdb.cn/imdb250/"+ Integer.toString(i));
        }
        
        String dir = "E://log/";  // 圖片儲存目錄
        
        // 利用循環下載每一個頁面中的圖片
        for(String url: urls) {
            int index = urls.indexOf(url)+1;
            System.out.println("開始下載第"+index+"個網頁中的圖片...");
            getPictures(url, dir);
            System.out.println("第"+index+"個網頁中的圖片下載完畢!\n");
        }
        
        System.out.println("程序運行完畢!");
        Date d2 = new Date();
        
        // 計算程序的運行時間,並輸出
        long seconds = (d2.getTime()-d1.getTime())/1000;
        System.out.println("一共用時: "+seconds+"秒.");
        
    }
    
    // getContent()函數: 將網頁中的電影圖片下載到本地
    public static void getPictures(String url, String dir){
        
        // 利用URL解析網址
        URL urlObj = null;
        try{
            urlObj = new URL(url);

        }
        catch(MalformedURLException e){
            System.out.println("The url was malformed!");
        }

        // URL鏈接
        URLConnection urlCon = null;
        try{
            // 打開URL鏈接
            urlCon = urlObj.openConnection(); 
            // 將HTML內容解析成UTF-8格式
            Document doc = Jsoup.parse(urlCon.getInputStream(), "utf-8", url);
            // 提取電影圖片所在的HTML代碼塊
            Elements elems = doc.getElementsByClass("ss-3 clear");
            Elements pic_block = elems.first().getElementsByTag("a");
            
            for(int i=0; i<pic_block.size(); i++) {
                // 提取電影圖片的url, name
                String picture_url = pic_block.get(i).getElementsByTag("img").attr("src");
                String picture_name = pic_block.get(i).getElementsByClass("bb").text()+".jpg";
                // 用download()函數將電影圖片下載到本地
                download(picture_url, dir, picture_name);
                System.out.println("第"+(i+1)+"張圖片下載完畢!");
            }
            
        }
        catch(IOException e){
            System.out.println("There was an error connecting to the URL");
        }

    }
    
    // download()函數利用圖片的url將圖片下載到本地
    public static void download(String url, String dir, String filename) {  
        try { 
            
            /* httpurl: 圖片的url
             * dirfile: 圖片的儲存目錄
             */
            URL httpurl = new URL(url);  
            File dirfile = new File(dir); 
            
            // 若是圖片儲存的目錄不存在,則新建該目錄
            if (!dirfile.exists()) {    
                dirfile.mkdirs();  
            }  
            
            // 利用FileUtils.copyURLToFile()實現圖片下載
            FileUtils.copyURLToFile(httpurl, new File(dir+filename));  
        } 
        catch(Exception e) {  
            e.printStackTrace();  
        }  
    }

}

運行

  運行以上程序,結果以下:函數

程序運行結果

  查看E盤中的log文件夾,內容以下:url

下載的電影圖片

  一共下載了244張圖片,用時140秒,有幾張圖片下載失敗,效果還算OK.
  本次分享就到此結束嘍,歡迎你們交流~~spa

相關文章
相關標籤/搜索