Membuat Download Manager Menggunakan Java untuk Mengunduh Seluruh Gambar yang Ada di WordPress


sebenarnya kita tidak perlu membuat download manager sendiri untuk mengunduh gambar-gambar di halaman web. banyak sekali download manager yang sudah ada. namun yang menjadi masalah adalah saat ini kebanyakan yang diunduh adalah link bukan image, jadi tag lah yang didownload, sedangkan jika gambarnya dalam biasanya tidak didownload.

kenapa tidak menggunakan mirror? wew, yang saya inginkan itu cuma gambarnya, bukan seluruh websitenya πŸ˜€ So? Saatnya membuat download manager sendiri πŸ˜€

Pengetahuan yang Diperlukan

pengetahuan yang diperlukan untuk membuat download manager sebuah website adalah :

  1. tau cara nge-crawl halaman-halaman website
  2. tau cara nge-parsing halaman html
  3. tau cara mendownload berkas dari internet
  4. tau pemetaan lokasi link-link pada website yang akan didownload πŸ˜€

karena saya mau mendownload seluruh gambar yang ada di wordpress, jadi kita harus tau bagaimana pemetaan website di wordpress πŸ˜€

  1. pertama! setiap blog di wordpress itu memiliki halaman dari halaman 1 sampai terakhir, dan penulisannya adalah seperti ini : http://namablog.wordpress.com/page/1/ dan seterusnya…
  2. kedua! pada setiap halaman terdapat artikel-artikel, dan biasanya banyaknya artikel pada setiap halaman tergantung pengaturan pemilik blog itu πŸ˜€
  3. ketiga! penamaan link artikel pada wordpress adalah sebagai berikut : http://namablog.wordpress.com/2010/04/07/judul-artikel/ dimana untuk 2010 adalah tahun pembuatan artikel, untuk 04 adalah bulan pembuatan, untuk 07 adalah tanggal pembuatan dan untuk judul-artikel adalah judul artikelnya pastinya πŸ˜€
  4. jadi untuk mengunduh seluruh gambar yang ada di wordpress, pertama kita harus dapatkan lokasi link artikel dengan cara menelusuri halaman, setelah dapat semua linknya, baru cari tag yang berisikan gambar πŸ˜€

jadi seperti ini Β kode program yang harus dibuat :

package khannedy.wordpress.image.downloader;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.HashSet;
import java.util.Set;
import java.util.logging.Logger;
import org.cyberneko.html.parsers.DOMParser;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;

/**
 *
 * @author echo
 */
public class Downloader {

    private Logger log;

    private final String downloadUrl;

    private final String downloadTarget;

    private final int first;

    private final int last;

    /**
     * Membuat Downloader
     * @param downloadUrl url wordpress
     * @param downloadTarget target disimpan gambar
     * @param first
     * @param last
     */
    public Downloader(String downloadUrl, String downloadTarget, int first, int last) {
	if (!downloadUrl.endsWith("/")) {
	    downloadUrl += "/";
	}
	this.downloadUrl = downloadUrl;
	this.downloadTarget = downloadTarget;
	this.log = Logger.getLogger(Downloader.class.getName());

	this.first = first;
	this.last = last;
    }

    /**
     * untuh semua halaman
     * @return
     */
    protected Set downloadPage() {
	Set set = new HashSet();
	int index = first;
	int i = 0;
	while (true) {
	    if (index > last) {
		break;
	    }
	    try {
		String target = downloadUrl + "page/" + index + "/";
		URL url = new URL(target);
		log.info("memproses halaman " + url);
		HttpURLConnection connection = (HttpURLConnection) url.openConnection();
		connection.setRequestProperty("User-Agent", "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.8) Gecko/20100214 Ubuntu/9.10 (karmic) Firefox/3.5.3");
		connection.connect();
		if (connection.getContentType().startsWith("text/html")) {
		    DOMParser parser = new DOMParser();
		    parser.parse(new InputSource(connection.getInputStream()));
		    Document document = parser.getDocument();
		    NodeList list = document.getElementsByTagName("a");
		    boolean valid = true;
		    for (i = 0; i < list.getLength(); i++) { 			valid = true; 			Node node = list.item(i); 			Node node1 = node.getAttributes().getNamedItem("href"); 			String href = node1.getNodeValue(); 			if (href.startsWith(downloadUrl)) { 			    if (!href.contains("#")) { 				String replace = href.replace(downloadUrl, "").replace("/", ""); 				if (replace.length() > 8) {
				    String number = replace.substring(0, 8);
				    char[] array = number.toCharArray();
				    for (char c : array) {
					if (!Character.isDigit(c)) {
					    valid = false;
					    break;
					}
				    }
				    array = null;
				    number = null;
				} else {
				    valid = false;
				}
				replace = null;
			    } else {
				valid = false;
			    }
			} else {
			    valid = false;
			}
			if (valid) {
			    set.add(href);
			} else {
			    href = null;
			}
		    }
		    list = null;
		}
		connection.disconnect();
		connection = null;
		url = null;
		target = null;
		System.gc();
		index++;
	    } catch (Throwable t) {
		break;
	    }
	}
	return set;
    }

    /**
     * unduh semua gambar
     * @param articleUrl
     * @return
     */
    protected Set downloadArticle(String articleUrl) {
	Set set = new HashSet();
	int i = 0;
	try {
	    URL url = new URL(articleUrl);
	    log.info("memproses artikel " + articleUrl);
	    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
	    connection.setRequestProperty("User-Agent", "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.8) Gecko/20100214 Ubuntu/9.10 (karmic) Firefox/3.5.3");
	    connection.connect();
	    if (connection.getContentType().startsWith("text/html")) {
		DOMParser parser = new DOMParser();
		parser.parse(new InputSource(connection.getInputStream()));
		Document document = parser.getDocument();
		NodeList list = document.getElementsByTagName("img");
		for (i = 0; i < list.getLength(); i++) {
		    Node node = list.item(i);
		    Node node1 = node.getAttributes().getNamedItem("src");
		    String href = node1.getNodeValue();

		    String replace = articleUrl.replace(downloadUrl, "").replace("/", "");

		    Gambar gambar = new Gambar();
		    gambar.setLokasi(href);
		    gambar.setFolder(replace.substring(0, 8));
		    gambar.setSubFolder(replace.substring(8));

		    set.add(gambar);

		    replace = null;
		}
		list = null;
	    }
	    connection.disconnect();
	    connection = null;
	    url = null;
	    System.gc();
	} catch (Throwable t) {
	}

	return set;
    }

    /**
     * simpan gambar ke disk
     * @param gambar
     */
    protected void downloadImag(Gambar gambar) {
	try {
	    URL url = new URL(gambar.getLokasi());
	    log.info("mengunduh gambar " + gambar.getLokasi());
	    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
	    connection.setRequestProperty("User-Agent", "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.8) Gecko/20100214 Ubuntu/9.10 (karmic) Firefox/3.5.3");
	    connection.connect();

	    if (connection.getContentType().startsWith("image")) {
		InputStream inputStream = connection.getInputStream();

		File folder = new File(new File(downloadTarget, gambar.getFolder()), gambar.getSubFolder());
		folder.mkdirs();

		FileOutputStream outputStream = new FileOutputStream(new File(folder, gambar.getNama()));

		byte[] buffer = new byte[1042 * 8];
		int length = 0;

		while ((length = inputStream.read(buffer)) != -1) {
		    outputStream.write(buffer, 0, length);
		}

		outputStream.close();
	    }

	    connection.disconnect();
	    connection = null;
	    url = null;
	    System.gc();
	} catch (Throwable t) {
	}
    }

    /**
     * memulai download
     */
    public void start() {
	Set articles = downloadPage();
	Set images = new HashSet();

	log.info("mengunduh seluruh halaman...");
	for (String string : articles) {
	    images.addAll(downloadArticle(string));
	}

	log.info("mengunduh seluruh gambar...");
	for (Gambar gambar : images) {
	    downloadImag(gambar);
	}

	log.info("selesai...");
    }
}
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package khannedy.wordpress.image.downloader;

/**
 *
 * @author echo
 */
public class Gambar {

    private String folder;

    private String subFolder;

    private String lokasi;

    private String nama;

    public String getNama() {
	return nama;
    }

    public void setNama(String nama) {
	this.nama = nama;
    }

    public String getFolder() {
	return folder;
    }

    public void setFolder(String folder) {
	this.folder = folder;
    }

    public String getLokasi() {
	return lokasi;
    }

    public void setLokasi(String lokasi) {
	this.lokasi = lokasi;
	this.nama = lokasi.substring(lokasi.lastIndexOf("/") + 1);
    }

    public String getSubFolder() {
	return subFolder;
    }

    public void setSubFolder(String subFolder) {
	this.subFolder = subFolder;
    }

    @Override
    public boolean equals(Object obj) {
	if (obj == null) {
	    return false;
	}
	if (getClass() != obj.getClass()) {
	    return false;
	}
	final Gambar other = (Gambar) obj;
	if ((this.lokasi == null) ? (other.lokasi != null) : !this.lokasi.equals(other.lokasi)) {
	    return false;
	}
	return true;
    }

    @Override
    public int hashCode() {
	int hash = 3;
	hash = 71 * hash + (this.lokasi != null ? this.lokasi.hashCode() : 0);
	return hash;
    }
}
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package khannedy.wordpress.image.downloader;

/**
 *
 * @author echo
 */
public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {

	// melakukan pengecekan argumen
	if (args.length < 2) { 	    // terjadi kesalahan argumen, beri tahu cara penggunaan 	    System.out.println("Argumen salah...\n\n" 		    + "Gunakan :\n" 		    + "java -jar wordpress-image-downloader.jar [url] [target] [first] [last]\n" 		    + "  [url]      : url wordpress, misal https://eecchhoo.wordpress.com/\n" 		    + "  [target]   : lokasi target gambar disimpan, misal : /home/echo/Desktop/target/\n" 		    + "  [first]    : halaman pertama (default 1)\n" 		    + "  [last]     : halaman terakhir (default Integer.MAX_VALUE)\n\n" 		    + "Bye...\n"); 	} else { 	    int first = 1; 	    int last = Integer.MAX_VALUE; 	    if (args.length >= 3) {
		first = Integer.parseInt(args[2]);
		if (first < 1) { 		    first = 1; 		} 	    } 	    if (args.length >= 4) {
		last = Integer.parseInt(args[3]);
	    }

	    new Downloader(args[0], args[1], first, last).start();
	}

    }
}

penjelasannya? duh saya lagi males ngejelasin tahapan-tahapannya πŸ˜€

intinya untuk mengerti kode-kode diatas, anda harus tau :

  1. Java Networking, untuk koneksi ke websitenya
  2. Java IO, untuk proses streaming nya
  3. NecoHTML, untuk parsing HTML nya πŸ˜€

untuk aplikasi yang sudah jadi silahkan download sisini :

DOWNLOAD

cara penggunaannya cukup ketikkan :

java -jar wordpress-image-downloader.jar [url] [target] [first] [last]

dimana :

  1. [url] adalah halaman blog wordpress, misal https://eecchhoo.wordpress.com/
  2. [target] adalah lokasi folder tempat gambar disimpan misal : /hom/echo/Desktop/Wordpress/
  3. [first] halaman awal (default 1)
  4. [last] halaman akhir (default Integer.MAX_VALUE)

contohnya :

java -jar wordpress-image-downloader.jar https://eecchhoo.wordpress.com/ /home/echo/Desktop/Wordpress/ 1 2

artinya saya mendownload seluruh gambar yang ada di blog https://eecchhoo.wordpress.com/ pada halaman 1 sampai 2 dan disimpan di disk yang beralamatkan di /home/echo/Desktop/Wordpress/

hasilnya, seluruh gambar akan terdownload seperti terlihat pada gambar dibawah ini :

Iklan

12 pemikiran pada “Membuat Download Manager Menggunakan Java untuk Mengunduh Seluruh Gambar yang Ada di WordPress

  1. Kalau yang didownload file gmna kang????
    kn itu yg didownload gmbarnya…klau mau file yg didownload dimna yang diganti???
    thnx atas artikelnya…sangat membantu kerjaan saya saat ini…

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s