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 :
- tau cara nge-crawl halaman-halaman website
- tau cara nge-parsing halaman html
- tau cara mendownload berkas dari internet
- 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 π
- 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…
- kedua! pada setiap halaman terdapat artikel-artikel, dan biasanya banyaknya artikel pada setiap halaman tergantung pengaturan pemilik blog itu π
- 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 π
- 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 :
- Java Networking, untuk koneksi ke websitenya
- Java IO, untuk proses streaming nya
- 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 :
- [url] adalah halaman blog wordpress, misal https://eecchhoo.wordpress.com/
- [target] adalah lokasi folder tempat gambar disimpan misal : /hom/echo/Desktop/Wordpress/
- [first] halaman awal (default 1)
- [last] halaman akhir (default Integer.MAX_VALUE)
contohnya :
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 :
-6.520104
107.638648