Menggunakan perintah wget

Kita semua familiar dengan browser Internet Explorer, Opera, Mozilla, dsb. Sebagian dari kita bahkan secara eksklusif hanya menggunakan browser untuk mengakses Web. Tapi browser bukanlah satu-satunya alat yang bisa dipakai. Ada berbagai program lain yang kadang lebih efisien untuk mengambil resource tertentu. Misalnya, ada sebuah halaman yang mengandung 200 link dokumen yang masing-masing perlu Anda ambil. Apakah Anda ingin jadi orang tolol dengan mengklik semuanya satu persatu lalu mensave dokumen demi dokumen dengan browser? Atau ada sebuah file besar .ISO 650MB yang ingin Anda download, di mana kemungkinan besar akan terjadi beberapa kali putus koneksi di tengah download dan di mana kebanyakan browser tidak menyediakan fitur resume? Atau Anda ingin mengambil seluruh isi situs atau cabang situs tertentu? Oke, browser tertentu, seperti Internet Explorer misalnya, saat ini sudah memiliki fasilitas Make Available Offline yang dapat menelusuri link hingga kedalaman tertentu, tapi bagaimana jika Anda ingin mengambil hanya jenis file tertentu (PDF dan PS, no thanks!)? Jika ingin mengambil hanya dari host tertentu? Jika ingin mendownload URL dengan pola tertentu? Jika ingin berpura-pura menjadi browser lain? Fitur-fitur ini umumnya tidak ada di browser.
Artikel ini akan membimbing Anda mempelajari penggunaan wget, salah satu tool download command line yang paling terkenal, agar Anda bisa mendownload apa saja yang Anda suka, hanya yang Anda suka, dan kapan saja Anda suka. Dengan kata lain, supaya Anda bisa jadi raja download!
Disclaimer: Di setiap seri artikel Hack, penulis akan mengajak pembaca bermain-main dengan sebuah sistem dengan tujuan untuk mengenalnya lebih dalam. Kadang topik dan gaya bahasannya akan sedikit nakal, sesuai konotasi nama serinya, namun percayalah semua ini demi tujuan edukatif. Apa pun yang terjadi akibat penerapan dari apa yang tertulis di sini, baik langsung maupun tak langsung, bukanlah tanggung jawab penulis. Anda harus setuju dulu sebelum melanjutkan. Tekan Cancel dan pilih halaman lain jika tidak setuju.
Pahamilah bahwa jika Anda menggunakan akses shell account hosting untuk melakukan download secara berlebihan, maka Anda bisa jadi melanggar aturan penggunaan. Umumnya account hosting Anda beli agar Anda bisa membuat situs yang didownload orang lain, bukan agar Anda bisa mendownload dari Web sesuka hati menggunakaan server hosting tersebut. Juga berhati-hatilah jika menggunakan wget di tempat dengan koneksi Internet yang cepat, sebab kesalahan memakai opsi wget bisa berakibat Anda mendownload banyak halaman tanpa henti hingga beratus-ratus mega atau bergiga-giga. Juga sebaiknya tidak melakukan download masal secara berlebihan pada satu situs, sebab mungkin situs tersebut jadi overload dan terganggu aktivitasnya.

Wget

Tentu saja ada banyak tool download lain, baik berbasis grafis maupun command line. Tapi saya akan memfokuskan pada tool command line karena dua hal. Yang pertama, tool command line tersedia di server dan dapat diakses melalui telnet/SSH. Ini penting sekali agar Anda tidak harus selalu online selama download berlangsung. Juga akan meningkatkan efisiensi terutama jika mendownload ribuan file kecil-kecil, karena server umumnya memiliki latensi koneksi yang lebih rendah daripada koneksi dialup rumahan. Setelah semua file Anda download di server, Anda bisa mengemasnya dalam .zip atau .tar.gz dan baru mendownload satu file saja ke rumah. Ini mengirit waktu. Yang kedua, tool command line amat fleksibel, terutama jika dikombinasikan tool-tool command line lainnya. Akan saya demonstrasikan melalui beberapa contoh nanti.
Anda pengguna Windows bisa berargumen bahwa tool grafis—seperti Gozilla atau GetRight—juga dapat dikendalikan secara remote melalui VNC atau PC Anywhere misalnya. Betul, tapi server hosting di Indonesia toh rata-rata berbasis Linux. Lagipula, wget tersedia baik di Linux maupun Windows. Learn once, use everywhere.
Wget pertama kali ditulis tahun 1995 oleh Hrvoje Niksic dan dirilis di bawah lisensi GNU. Wget dikategorikan sebagai web client tool, WWW retrieval program, dan sering juga disebut web robot. Program ini sudah jadi favorit saya sejak lama, karena telah terinstal default di banyak tempat dan fiturnya cukup lengkap. Saat pengembangan wget mandeg di versi 1.5.3 sejak 1998, saya sempat berpindah mencoba-coba pavuk. Saat itu wget belum memiliki dua fitur yang sering saya butuhkan: menangani cookie dan SSL. Namun sejak akhir 2000 tim wget bangkit dari masa tidurnya dan mulai aktif kembali mengeluarkan rilis baru. Hingga saat ini saya hampir selalu memakai wget untuk mendownload, kecuali saat membutuhkan fitur-fitur khusus pavuk tertentu—yang mana jarang saya pakai.

Versi-Versi Wget

Jika Anda memakai salah satu distro Linux, kemungkinan wget sudah bercokol di sistem (umumnya di /usr/bin/wget). Lihat Tabel 1 untuk mengetahui versi wget berapa yang jadi bawaan distro popular Red Hat dan Mandrake.
Saya amat menyarankan Anda mengambil wget versi (1.8.1 pada saat tulisan ini dibuat) terbaru supaya bisa mendapatkan fitur-fitur baru wget dan mencoba semua contoh di artikel ini. Lihat Tabel 2 untuk mengetahui fitur penting wget manakah yang tidak akan Anda peroleh jika masih menggunakan versi lama. Jika Anda menggunakan Red Hat 7.2 atau Mandrake terbaru, silakan cek RPM Find untuk mengambil RPM terbaru dari RawHide atau Mandrake Cooker. Jika Anda masih menggunakan Red Hat 6.x atau yang lebih lama, lebih baik kompile wget dari source. Jika Anda pengguna Windows, tinggal ke homepage wget lalu cari binary wget yang bisa langsung Anda gunakan. Jika malas atau tidak sempat download, semua yang Anda butuhkan ini telah disediakan di CD majalah.

Instalasi

Jika Anda memakai versi RPM, tentu saja tinggal melakukan ini:
# rpm -Uvh wget-*.rpm
untuk mengupdate wget Anda. Jika Anda ingin mengkompile dari source, lakukan ini:
# rpm -e wget --nodeps
# tar xfz wget-1.8.1.tar.gz
# cd wget-1.8.1
# ./configure --prefix=/usr
# make all install
Tambahkan opsi --with-ssl di baris configure jika Anda ingin dukungan SSL. Setelah semuanya selesai, Anda akan menjumpai wget baru di /usr/bin/wget yang siap melaksanakan kehendak dan titah Baginda.

Penggunaan Dasar

Keinginan: Saya ingin mengambil sebuah URL dengan wget.
Jawab: Cukup sebutkan URL (atau URL-URL) sebagai argumen wget.
$ wget http://mwmag.com
--22:41:14--  http://mwmag.com/
           => `index.html'
Resolving mwmag.com... done.
Connecting to mwmag.com[202.95.131.154]:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [text/html]
 
    [ <=>                       ] 5,219          4.98M/s
 
22:41:14 (4.98 MB/s) - `index.html' saved [5219]
Kita baru saja menyuruh wget untuk mengambil sebuah URL http://mwmag.com. Wget akan menyimpan ini di file index.html. Pertama-tama wget akan berusaha meresolve (mencari alamat IP) mwmag.com, melakukan koneksi ke server tersebut, lalu mengirim request HTTP untuk meminta URI / ke host mwmag.com. Sambil mendownload, ia akan menampilkan animasi progress bar. Kecepatan download tampak amat fantastis, karena wget saya jalankan di server yang sama dengan server mwmag.com.
Seandainya ada redirect, maka wget akan secara otomatis menelusurinya buat Anda.
Untuk mengambil beberapa file, sebutkan saja secara berurutan. http:// bersifat opsional dan boleh tidak kita sebutkan untuk mengirit ketikan.
$ wget mwmag.com/index01.html mwmag.com/index02.html
--22:48:12--  http://mwmag.com/index01.html
           => `index01.html'
Resolving mwmag.com... done.
Connecting to mwmag.com[202.95.131.154]:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [text/html]
 
    [    <=>                ] 6,191          5.46K/s
 
22:48:14 (5.46 KB/s) - `index01.html' saved [6191]
 
--22:48:14--  http://mwmag.com/index02.html
           => `index02.html'
Connecting to mwmag.com[202.95.131.154]:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [text/html]
 
    [    <=>                ] 6,048          5.48K/s
 
22:48:16 (5.48 KB/s) - `index02.html' saved [6048] 
 
FINISHED --22:48:16--
Downloaded: 12,239 bytes in 2 files
Bisa dilihat, kali ini saya mendownload dari koneksi dialup, sehingga kecepatannya hanya sekitar 5 KB/s.

Resume

Keinginan: Bagaimana agar jika file yang ingin saya ambil putus di tengah-tengah, saat wget dijalankan lagi maka file tersebut dilanjutkan dari titik putus, tidak didownload dari nol lagi?
Jawab: Gunakan opsi -c (continue).
$ wget -c ftp://ftp.linux.tucows.com/pub/ISO/RedHat/enigma-i386-disc1.iso
Tanpa opsi -c, jika koneksi putus maka wget akan berhenti, meninggalkan file yang baru setengah terdownload. Saat menjalankan wget lagi, Anda dapat menambahkan -c supaya wget berusaha meresume file setengah jadi itu. Agar praktis, saya biasa selalu menambahkan -c sebagai opsi standar agar resume selalu berusaha dilakukan.
Catatan: tentu saja tidak semua URL dapat diresume. Semua bergantung pada setting webserver. Konten dinamik hasil keluaran skrip misalnya, hampir selalu tidak dapat diresume. Ini berlaku juga bagi program-program download lainnya, jadi ini bukan sebuah keterbatasan wget.
Lawan dari -c adalah -nc (no-clobber). Jika download sebuah file terhenti di tengah, dan Anda menjalankan wget lagi dengan -nc, maka wget tidak akan mengutak-atik file yang baru setengah terdownload sebelumnya, melainkan akan menganggap file itu sudah diambil dan melanjutkan ke URL berikutnya (atau langsung selesai, jika tidak ada lagi URL yang harus didownload).
Tanpa kehadiran -c maupun -nc, maka kelakuan standar wget adalah sebagai berikut. Misalnya file A baru terdownload separuh. Anda memberi lagi perintah wget untuk mengambil A. Maka wget tidak akan mengganggu file A, tapi akan mendownload ulang dari nol ke file A.1 (atau A.2, jika A.1 kebetulan sudah ada, dst).
Pertama-tama mungkin berbagai kelakuan berbeda ini akan membingungkan. Tapi Anda nanti bisa memilih bagaimana sebaiknya wget bertindak seandainya. Patokan umum: selalu gunakan -c. Jika wget protes karena server tidak mendukung, Anda bisa hapus dulu file yang baru setengah terdownload, atau kembali memberi perintah wget tapi tanpa -c maupun -nc supaya file bisa terdownload ulang di *.1. -nc umumnya hanya digunakan dalam download rekursif (lihat subjudul “Rekursif”).

Retry

Keinginan: Bagaimana agar jika download terputus di tengah-tengah, wget tidak langsung berhenti melainkan mencoba lagi?
Jawab: Gunakan opsi -t (tries), diikuti sebuah angka. Dengan opsi ini Anda dapat mengatur berapa kali wget sebaiknya melakukan retry jika koneksi putus di tengah-tengah. -t 2 berarti coba hanya dua kali. Sebutkan -t 0 untuk mencoba tanpa kunjung lelah (alias, sebanyak tak hingga kali). Umumnya memang -t 0 yang dipakai, karena toh kita tidak pernah tahu berapa kali koneksi akan putus di perjalanan. Mirip dengan fitur resume, retry ini hanya bisa dilakukan jika server yang kita mintai mendukungnya. Tepatnya, retry hanya mungkin jika server mengeluarkan header Content-Length, sehingga wget dapat tahu berapa ukuran asli file yang diminta (dan jadi tahu bahwa jika yang terdownload masih lebih kecil ukurannya, berarti memang belum selesai). File-file statik secara otomatis diberi Content-Length oleh IIS, Apache, atau webserver lainnya. Tapi konten dinamik (termasuk PHP/ASP/SSI misalnya) umumnya tidak memberikan Content-Length sehingga wget tidak dapat melakukan retry. Meskipun demikian, ada trik-trik untuk bisa tetap melakukan retry, yang akan ditunjukkan nanti.
Ada opsi lain yang berhubungan dengan retry, yaitu --waitretry, yaitu berapa lama jeda (dalam detik) wget harus menunggu sebelum melakukan koneksi ulang. Defaultnya adalah 0, yaitu langsung mencoba koneksi ulang. Jika server yang kita minta melakukan banning kepada peminta yang terlalu sering melakukan koneksi, maka kita bisa menunggu dulu beberapa saat sebelum retry.
Jadi, berikut perintah untuk melakukan retry terus sampai seluruh file terdownload, tapi menunggu 1 menit di setiap kali sebelum retry. Jangan lupa memberi -c, sebab jika tidak maka wget akan mendownload dari awal setiap kali retry (Meskipun memang, jika servernya tidak mendukung resume, maka dengan -c pun wget harus mendownload dari awal).
$ wget -c -t0 --waitretry 60 \
  ftp://ftp.linux.tucows.com/pub/ISO/RedHat/enigma-i386-disc1.iso
Catatan: meskipun diset -t0, tapi wget akan langsung menyerah jika saat ingin retry ternyata server di ujung sana mati (Connection refused) atau ternyata filenya hilang atau berubah ukuran. Jika Anda yakin file itu masih ada di lokasi yang sama dan Anda ingin wget terus mencoba meskipun server sedang mati, maka bisa dipakai trik membungkus perintah wget dalam loop skrip sederhana. Wget akan mengembalikan status program 0 (sukses) jika file telah terdownload dengan sempurna, tapi 1 jika terputus. Karena itu . Berikut skrip shell Unix untuk melakukannya:
#!/bin/sh
# download terus cd red hat 7.2 sampe aku dapet!
# gak peduli putus berapa kali, gak peduli server di sana mati.
 
while true; do
  wget -c -t0 --waitretry 60 \
    ftp://ftp.linux.tucows.com/pub/ISO/RedHat/enigma-i386-disc1.iso
  if test $? -eq 0; then break; fi
  sleep 60
done
Di DOS/Windows pun batch file (.BAT) yang serupa bisa ditulis. Silakan dicoba, ini jadi PR buat Anda.

Download Dan Tinggal

Keinginan: Saya mendownload file besar di server lewat telnet/SSH, tapi meskipun wget otomatis melakukan resume dan retry, saya harus bengong menunggu wget sampai selesai. Jika window telnet saya tutup, maka wget mati dan download tidak dilanjutkan. Bagaimana supaya saya bisa menyuruh server mendownload file lalu saya sendiri keluar dan offline?
Jawab: Gunakan opsi -b (background).
$ wget -c -t0 –b \
  http://research.google.com/contest/prog-contest-sample.tarContinuing in background, pid 6294.
Output will be written to `wget-log'.
Karena ada -b, maka wget tidak akan menampilkan progress ke layar, melainkan semuanya akan ditulis dalam file log yang bernama wget-log. Jika di direktori yang sama kebetulan sudah ada file wget-log, maka log akan ditulis ke wget-log.1, dst. Jika Anda intip file log ini, maka isinya sebetulnya sama dengan laporan wget di mode foreground. Jadi wget menulis laporannya ke file dan bukan ke layar.
Setelah memberikan perintah wget (dan juga sebaiknya setelah Anda intip dulu sejenak wget-log untuk memastikan download sudah mulai), Anda dapat langsung log out dan mengecek lagi beberapa jam kemudian, atau keesokan harinya.
Jika Anda mendownload tanpa -b, lalu di tengah jalan karena tidak sabar menunggu Anda memutuskan ingin meninggalkan saja wget ke mode background, maka lakukan hal berikut: tekan Ctrl-Z, lalu ketik kill -HUP %1. Sinyal HUP akan memberi isyarat pada wget agar lalu mengarahkan output laporan ke wget-log dan tidak ke layar lagi. Baru setelah itu download bisa Anda tinggal.

Rekursif

Keinginan: saya ingin mendownload seluruh isi sebuah situs.
Jawab: Gunakan opsi -r (recursive).
Di sinilah saat manfaat tool noninteraktif seperti wget membantu kita. Jika kita ingin mendownload seluruh situs lewat browser misalnya, maka Anda mungkin harus melakukan ratusan kali klik dan pemilihan menu. Membosankan sekali. Dengan tool seperti wget, maka sebuah halaman HTML yang dibaca akan diparse dan dicari link-linknya, kemudian masing-masing link ini akan ditelusuri untuk memperoleh dokumen berikutnya, dst. Dengan kombinasi -b, Anda bisa meninggalkan download dan besok-besoknya, seluruh situs sudah termirror buat Anda!
-r menyatakan pada wget bahwa kita ingin menelusuri link. Berikut contoh yang saya buat dan terletak di mwmag.com:
$ wget -r mwmag.com/issue/04/content/hack-wget/file/sample01.html
Di file sample01.html terdapat beberapa link. Wget akan memparse halaman HTML tersebut dan mengambil link-linknya. Dia tidak akan mengikuti link ke situs lain (mis: www.cnn.com) melainkan hanya ke host yang sama (mwmag.com). Halaman yang sudah diambil (mis: sample02.html yang dilink dari sample01.html) akan juga bernasib sama: diparse link-linknya dan diikuti oleh wget. Demikian seterusnya hingga seluruh link yang ada habis terjelajahi. Jika terdapat sejumlah cukup link di awal penelusuran, seluruh objek di mwmag.com yang terjamah dan publik akan bisa terjaring dan terdownload.
File-file yang didownload secara otomatis akan disimpan dalam struktur direktori mengikuti struktur URL asli. Misalnya, http://mwmag.com/issue/04/content/ akan disimpan di file index.html yang berada di subdirektori mwmag.com/issue/04/. Pengaturan ini akan memudahkan dalam mirroring (dijelaskan nanti). Catatan: Jika Anda ingin URL disimpan dalam struktur seperti ini meskipun tanpa harus melakukan download rekursif, beri opsi -x (force directories). Contoh: wget -x mwmag.com/issue/04/.
Pada umumnya Anda jarang butuh harus mendownload seluruh isi situs. Kadang hanya ingin mengambil hingga kedalaman tertentu saja, kadang hanya jenis file tertentu saja, kadang hanya ingin mengambil satu cabang situs saja (mis: /archive/2001/), atau Anda hanya ingin mengambil satu halaman beserta objek-objeknya saja (imej, JS/CSS) tanpa benar-benar bermaksud mendownload rekursif.
Keinginan: Saya ingin mengambil situs satunet.com hingga tiga-empat level saja.
Jawab: Gunakan -l (level).
Sebetulnya rekan kerja saya di satunet.com dulu benar-benar pernah minta ini. Dia anggota tim advertising yang ingin mendemonstrasikan portal Satunet ke calon pengiklan. Diinginkan agar situs satunet.com didownload ke laptop dan bisa dibrowse offline (“bisa diceklak-ceklik”). Tidak perlu seluruh isi situs (karena itu akan menghabiskan ruang disk ratusan MB), tapi cukup hingga tiga atau empat level saja agar jika kita mengklik sebuah halaman dari halaman depan, di halaman kedua itu kita masih bisa mengklik sesuatu, dan sekali lagi demikian. Untuk lebih jelasnya mengenai level, silakan lihat Gambar 1.
Kita memberikan opsi -l untuk mengatur berapa level, atau kedalaman penelusuran. Jika tidak disebutkan (hanya -r), maka wget menganggap -l0, alias sampai kedalaman tak hingga (atau sampai semua link di situs ybs habis). Untuk memenuhi permintaan download empat level, kita berikan perintah ini:
$ wget -r -l4 -k http://satunet.com
Untuk apa -k (convert links)? Opsi ini penting jika kita ingin hasil download bisa dibrowse offline. -k akan mengkonversi link-link absolut (ke http://satunet.com/...) sehingga menjadi link relatif.
Tip: Anda juga bisa tambahkan -c dan -t untuk menambah reliabilitas, tapi waktu itu saya mendownload dari jaringan yang sama, jadi tidak ada masalah dengan kecepatan atau stabilitas koneksi.
Catatan: Grab rekursif memakai -r, -l0 (apalagi jika nanti Anda menggunakan -H) potensial berbahaya, karena Anda tidak pernah tahu berapa ukuran total sebuah situs. Jika di situs tersebut terdapat link yang dihasilkan secara dinamik (mis: /browseProduct.cgi?cat=foo yang lalu memuntahkan puluhan link lain), maka Anda bisa saja pada akhirnya menuai beratus-ratus halaman yang tidak diinginkan. Semakin cepat koneksi ke server, semakin berbahayalah, sebab Anda bisa membuat wget berkelana dan tersesat di rimba Web sambil mendownload segudang sampah.
Keinginan: Saya ingin mengambil hanya halaman HTML dari tucows.mweb.co.id (dengan kata lain, ingin mengambil katalog HTML-nya).
Jawab: Gunakan opsi -A (accept list), diikuti dengan daftar akhiran file yang diinginkan dan dipisahkan dengan koma.
$ wget -r -A htm,html -k tucows.mweb.co.id
Keinginan: Saya ingin mengambil semua gambar yang ada di situs satulelaki.com.
Jawab: Mungkin Anda berpikir menggunakan -A gif,jpg,jpeg. Tapi tunggu dulu: tanpa mengambil halaman HTML-nya juga, bagaimana Anda bisa menelusuri halaman demi halaman untuk menemukan gambarnya?
$ wget –c –t0 -r -A htm,html,gif,jpg,jpeg –k satulelaki.com
Keinginan: Saya ingin mengambil semua file yang ada di mwmag.com, tapi tidak ingin mengambil PDF-nya.
Jawab: Gunakan opsi -R (reject list). Perhatikan, ini berbeda dengan -r (huruf kecil). -R adalah lawan dari -A, yaitu untuk mengambil semua file berakhiran apa saja, kecuali yang disebutkan di daftar hitam.
$ wget -r –k -R pdf mwmag.com
Keinginan: Saya ingin mengambil halaman depan www.detik.com lengkap dengan gambar, iklan, dan semuanya.
Jawab: Gunakan opsi -p (page requisites).
$ wget -p www.detik.com
Keinginan: Saya ingin mengambil seluruh file di www.master.web.id/tutorial/ (tapi tidak ingin mengambil file di section yang lain).
Jawab: Gunakan opsi -np (no parent) sebagai pembatas -r. Dengan cara ini, -r tidak akan menelusuri ke atas path.
$ wget -r –k –np –l0 www.master.web.id/tutorial/
Keinginan: Saya ingin mengambil keseluruhan file HTML dan gambar di www.master.web.id/, tapi tidak ingin mengambil bagian forum, cgi-bin, download, dan daerah-daerah dinamik lainnya yang tidak diinginkan.
Jawab: Gunakan opsi -X (exclude directories), diikuti daftar direktori yang tidak ingin diikutsertakan dan dipisahkan dengan koma. Bedakan ini dengan -R. -R membatasi jenis file, -X membatasi direktori.
$ wget –r –l0 –A htm,html,gif,jpg,jpeg www.master.web.id \
    -X /download/,/links/,/cgi-bin/,/protect/
Keinginan: Download yang sebelumnya sudah selesai, tapi saya lupa saya ingin mengambil juga file-file PNG, ZIP, FLA, dan SWF. Tapi saya tidak ingin mendownload semuanya dari awal. Capek!
Jawab: Masih ingat opsi -nc? Kali ini berguna buat kita.
$ wget -r –l0 –nc –A htm,html,gif,jpg,jpeg,png,zip,fla,swf www.master.web.id \
    -X /download/,/links/,/cgi-bin/,/protect/
File-file yang sudah didownload tidak akan didownload lagi, tapi tetap diparse untuk mencari link.
Gunakan opsi -X (exclude directories), diikuti daftar direktori yang tidak ingin diikutsertakan dan dipisahkan dengan koma. Bedakan ini dengan -R. -R membatasi jenis file, sementara -X membatasi direktori.
Ada lagi opsi -I (include directories) yang merupakan kebalikan -X. Silakan dicoba sendiri efeknya.

Mirroring

Keinginan: Saya sudah mendownload seluruh cabang situs steven.haryan.to/email/. Sekarang saya lihat beberapa dokumen ada yang diupdate. Saya ingin pula mengupdate kopi lokal saya, tapi malas jika harus mendownload ulang semuanya.
Jawab: gunakan opsi -m (mirror). Dengan menyebutkan -m saja, Anda telah menginstruksikan wget untuk melakukan -r -N -l0 -nr. Detail tiap opsi bisa Anda baca di manual wget, yang jelas, -m ini digunakan untuk melakukan mirroring sebuah situs dan untuk mengupdatenya manakala perlu.
$ wget -m -np steven.haryan.to/email/
Pertama kali Anda menjalankan ini hingga selesai, cabang /email di homepage saya telah Anda download. Jika Anda jalankan lagi untuk kedua kalinya, wget akan mengecek dan membandingkan usia tiap file yang telah didownload dengan yang di server. Jika tidak ada yang lebih baru dari server, maka tidak ada yang didownload ulang. Enak bukan?

Fitur Lain

Ada beberapa kemampuan dan opsi pengatur lagi di wget. Saya sebutkan sekilas di sini untuk menghemat tempat: wget juga dapat mengambil file-file dari server FTP (ftp://), SSL (https://). Wget dapat mengeluarkan hasil download ke file lain atau ke stdout (opsi -O). Wget dapat menerima daftar URL untuk didownload dari file atau dari stdin (opsi -i). Tingkat kecerewetan wget dapat diatur (opsi -v dan -q). wget dapat menampilkan header response server (opsi -S, berguna untuk debugging). Kita dapat menginstruksikan wget untuk mendownload hingga mengisi sejumlah ruang disk tertentu saja (kuota, opsi -Q), dan juga dapat mengatur kecepatan downloadnya (opsi --limit-rate).
Sintaks dan detail penggunaan opsi-opsi tersebut bisa dibaca sendiri di manual wget. Sekarang kita akan segera masuk ke babak Tantangan.

Tantangan

Setelah beberapa kali mencoba wget, mungkin Anda akan mengalami hal berikut: dengan browser sebuah halaman dapat dilihat dan disave dengan baik, tapi dengan wget kok tidak bisa? Entah yang muncul Forbidden, entah halaman kosong, entah Not Found, entah halaman peringatan, entah redirect ke URL lain, dsb.
Ada kemungkinan si pembuat atau admin situs dengan sengaja memblok wget dan robot-robot lainnya, baik untuk alasan yang masuk akal maupun yang tidak masuk akal. Sebagian besar cara ini dapat ditembus dengan mudah. Mari kita lihat satu-persatu.

Tantangan 1: Halaman Berpassword (HTTP)

Ada dua macam cara utama membuat password situs: yang pertama dengan otentikasi HTTP dan yang kedua dengan cookie. Keduanya tidak akan saya bahas lagi, karena pernah muncul di mwmag. Cukuplah saya katakan di sini bahwa untuk kasus yang pertama, proteksi dengan otentikasi HTTP—yang kadang disebut juga proteksi .htaccess—biasanya akan memunculkan kotak dialog username/password di browser grafis Anda. Sekali username dan password diisi dengan benar, browser akan mengingat nilainya selama sisa sesi browsing dan mengizinkan kita membrowse halaman-halaman terproteksi tanpa harus berulang-ulang memasukkan password.
Jika Anda mencoba mengakses halaman yang diproteksi seperti ini lewat wget, hasilnya adalah Anda mendapatkan kode respon 401 Authorization Required, lalu wget mengatakan Authorization Failed. Ini karena Anda tidak menyuplai wget dengan password yang dibutuhkan. Gunakan opsi --http-user dan --http-passwd untuk menyuplainya. Bandingkan hasil dua perintah berikut:
$ wget http://steven.haryan.to/hack-wget/protected/
$ wget --http-user=hack --http-passwd=wget \
    http://steven.haryan.to/hack-wget/protected/
Beberapa penyedia software memproteksi area downloadnya dengan otentikasi HTTP. Biasanya mereka minta kita melakukan registrasi dahulu, baru kemudian username dan password dikirim lewat email. Contoh, lihat www.bitkeeper.com. Dengan kedua opsi di atas, kita dapat tetap menggunakan wget (dan memperoleh kemampuan resume) ketimbang harus menggunakan browser untuk mendownload file besar.

Tantangan 2: Pengecekan Header User-Agent

Beberapa situs hanya mau dibrowse jika kita menggunakan Internet Explorer misalnya. Menjengkelkan bukan? Ini biasanya dilakukan oleh skrip PHP/ASP/CGI dengan memeriksa nilai header User-Agent yang dikirim browser. Lihat Tabel 3 untuk melihat header-header yang dikirim berbagai program klien.
Secara default, wget mengaku dengan jujur bahwa dia memang wget. Beberapa situs tidak menyukai wget dan hanya mau menerima Netscape Navigator dan Internet Explorer. Untuk situs-situs seperti itu, kita bisa berikan opsi -U (user-agent) agar wget mengaku sebagai client lain. Misalnya: -U MSIE (karena kebanyakan skrip hanya memeriksa keberadaan potongan string ini), -U Mozilla/3.0 (meniru Netscape kuno), -U ' Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)' (benar-benar menjiplak User-Agent milik IE 5.01).
Bandingkan hasil dari dua perintah berikut:
$ wget http://steven.haryan.to/hack-wget/check-ua.cgi
$ wget -U Mozilla http://steven.haryan.to/hack-wget/check-ua.cgi

Tantangan 3: Pengecekan Referer

Mirip dengan tantangan sebelumnya, hanya kali ini halaman target mengecek header Referer. Biasanya si pemilik situs ingin agar URL tersebut dicapai hanya dari halaman lain yang diinginkan (misalnya: program atau video yang harus diklik dari halaman daftar film milik si pemilik situs itu sendiri, untuk mencegah orang yang “mencuri” [leeching] dengan melink langsung ke file program/video tersebut dari situs lain). Atau si pemilik situs ingin halaman dalam situsnya tidak dicapai langsung dari luar, melainkan harus dari pintu gerbang depan dulu (misalnya: karena ia ingin orang melihat banner atau halaman warning).
Sayangnya (kadang dibaca: untungnya), pengecekan ini mudah sekali dipatahkan. Skrip di server umumnya mengecek keberadaan header Referer, yang memang disuplai program klien (termasuk browser dan wget) jika URL yang sedang diminta diklik atau ditelusuri dari halaman lain. Untuk menipu si skrip, cukup berikan header yang diinginkannya. Opsi wget untuk menambahkan header adalah --header. Bandingkan hasil dari kedua perintah ini:
$ wget http://steven.haryan.to/hack-wget/download.cgi?program=download.cgi
$ wget --header 'Referer: http://steven.haryan.to/hack-wget/download/' \
    http://steven.haryan.to/hack-wget/download.cgi?program=download.cgi

Tantangan 4: File antirobot

Keinginan: Saya ingin mendownload situs ABC. Tapi waktu saya coba dengan wget -r, hanya halaman awal saja yang terdownload; wget tidak mau mengikuti link. Ketika melihat log hasil wget -r, saya amati file pertama yang didownload wget adalah /robots.txt. Bagaimana supaya saya bisa mendownload situs tersebut?
Jawab: robots.txt adalah sebuah konvensi untuk mengatur aktivitas robot yang datang ke sebuah situs. Sintaksnya bisa Anda lihat di situs referensi yang disebutkan di “Resource”. Pada intinya robots.txt mengatur wilayah mana yang boleh diakses robot, wilayah mana yang tidak. Contoh sebuah robots.txt:
User-Agent: Wget/*
Disallow: /
User-Agent: *
Disallow: /cgi-bin/
File tadi berbunyi: “Wget tidak boleh download mulai dari / (yang berarti tidak boleh sama sekali), sementara semua robot tidak boleh mendownload wilayah /cgi-bin.” Umumnya robots.txt ini membantu robot menghindari wilayah-wilayah yang “berbahaya” (misalnya: wilayah yang menghasilkan link secara dinamik dan tanpa akhir). Tapi beberapa pemilik situs amat anti dengan robot dan tanpa tedeng aling menutup semua akses robot:
User-Agent: *
Disallow: /
Yang perlu Anda ketahui: robots.txt ini sepenuhnya opsional dan advisory. Wget secara default bersikap sopan dan membaca robots.txt serta mengikuti aturannya. Tapi jika Anda tetap perlu mendownload sebuah file atau situs, berikan opsi -e "robots=off" agar wget tidak mengacuhkan robots.txt.
$ wget -e "robots.txt" -U Mozilla -r –l0 -k http://ABC

Tantangan 5: Pengecekan Cookie

Cookie digunakan untuk menciptakan stateful browsing. Maksudnya, sisi server jadi bisa tahu halaman-halaman mana saja yang sudah dikunjungi dalam sebuah sesi browsing. Berdasarkan hal ini, server bisa mencegat user yang belum masuk ke sebuah halaman tertentu dan memaksanya melewati halaman itu dulu (misalnya: untuk login).
Beberapa bulan yang lalu, untuk menyedot arsip milis yang ada di Yahoo! Groups, kita tinggal memanfaatkan pola URL:
http://groups.yahoo.com/group/NAMAMILIS/message/N
Besarnya N dapat kita intip dulu dengan mengunjungi halaman muka milis lewat browser:
http://groups.yahoo.com/group/NAMAMILIS
Lihatlah link posting terakhir, berapa id-nya. Katakanlah 500. Berarti kita tinggal melancarkan request untuk message 1 hingga 500. Caranya misalnya dengan skrip Perl berikut ini:
$ perl -le 'for(1..500) { print 
    "http://groups.yahoo.com/group/milis-masterweb/message/$_"' } > daftarurl.txt
$ wget –x –i daftarurl.txt 
Skrip Perl akan menghasilkan 500 baris berisi URL message 1 hingga 500 yang kita tulis ke file. Wget membaca file ini dan mengambil satu demi satu URL-nya. Jika Anda ingin mengambil attachment tiap posting, bisa dengan menggunakan opsi -p.
Tapi jika Anda coba perintah di atas ini sekarang, Anda tidak akan mendapat apa-apa. Situs groups.yahoo.com melarang orang menembak langsung ke halaman isi posting (message/N), melainkan harus dari halaman daftar posting (messages/). Jika Anda meminta sebuah halaman isi posting secara langsung, hasilnya adalah:
$ wget http://groups.yahoo.com/group/milis-masterweb/message/1 
--23:26:08--  http://groups.yahoo.com/group/milis-masterweb/message/1
           => `groups.yahoo.com/group/milis-masterweb/message/1'
Connecting to groups.yahoo.com:80... connected!
HTTP request sent, awaiting response... 302
Location: http://groups.yahoo.com/group/milis-masterweb/auth?done=%2F
+group%2Fmilis-masterweb%2Fmessage%2F1 [following]
--23:26:11--  http://groups.yahoo.com/group/milis-masterweb/auth?done
+=/group/milis-masterweb/message/1
           => `groups.yahoo.com/group/milis-masterweb/auth?done=/grou
+p/milis-masterweb/message/1'
Connecting to groups.yahoo.com:80... connected!
HTTP request sent, awaiting response... 302
Location: http://groups.yahoo.com/group/milis-masterweb/auth?check=G&
+done=%2Fgroup%2Fmilis-masterweb%2Fmessage%2F1 [following]
--23:26:22--  http://groups.yahoo.com/group/milis-masterweb/auth?chec
+k=G&done=/group/milis-masterweb/message/1
           => `groups.yahoo.com/group/milis-masterweb/auth?check=G&do
+ne=/group/milis-masterweb/message/1'
Connecting to groups.yahoo.com:80... connected!
HTTP request sent, awaiting response... 302
Location: http://groups.yahoo.com/group/milis-masterweb/message/1 [fo
+llowing]
http://groups.yahoo.com/group/milis-masterweb/message/1: Redirection 
+cycle detected.
Maaf, karena batas lebar kolom mungkin output di atas kurang jelas. Yang terjadi adalah, Yahoo! melempar kita ke halaman auth/ dan melempar kita kembali ke halaman message/1, hingga wget bingung dan menyerah (wget mengira redireksi balik ini adalah sebuah loop). Agar wget tidak bingung dengan loop redireksi, maka Anda perlu mempatch wget (untuk menambahkan opsi --no-cycle-detect, lihat “Resource”) atau menunggu versi wget berikutnya di mana pengecekan loop akan dihilangkan. Untuk saat ini saya anggap Anda menggunakan patch wget.
Pengecekan Yahoo! ini bukan pengecekan Referer (yang mana tentu akan mudah ditembus). Bagaimana saya bisa tahu? Karena saya telah mencobanya. Saya menyuntikkan header --header "Referer: …" tapi ternyata Yahoo! tetap melempar saya berulang kali ke auth/ > message/1 > auth/ > message/1 > dst. Karena halaman-halaman Yahoo! selalu memberikan cookie, ini menimbulkan kecurigaan kita bahwa pengecekan dilakukan terhadap cookie. Bagaimana cara mengatasinya? Jawabnya adalah dengan opsi --cookies on. Jadi saat Yahoo! melempar kita ke auth/, wget akan mengambil halaman ini dan menerima cookie. Setelah diredirect kembali ke message/1, wget akan mengirimkan cookie yang tadi diterimanya agar Yahoo! tahu bahwa auth/ telah dikunjungi. Ternyata Yahoo! melempar ke auth/ sekali lagi, kali ini dengan menyertakan parameter check=G. Setelah wget mengikuti dan mengambilnya, dan kembali dilempar ke message/1, akhirnya kita mendapatkan halaman tersebut. Berikut perintah untuk menyedot posting 1 hingga 500 dengan wget yang sadar-cookie:
$ perl –le'$|++;for(1..500){ print "$_";
    system "wget -x --no-cycle-detect --cookies=on -UMozilla/4.0
      http://groups.yahoo.com/group/milis-masterweb/message/$_"
  }'
--10:26:03--  http://groups.yahoo.com/group/milis-masterweb/message/1
           => `1'
Connecting to groups.yahoo.com:80... connected!
HTTP request sent, awaiting response... 302
Location: http://groups.yahoo.com/group/milis-masterweb/auth?...
[following]
--10:26:03--  http://groups.yahoo.com/group/milis-masterweb/auth?...
           => `auth?done=/group/milis-masterweb/message/1'
Connecting to groups.yahoo.com:80... connected!
HTTP request sent, awaiting response... 302
Location: http://groups.yahoo.com/group/milis-masterweb/auth?check=G...
[following]
--10:26:04--  http://groups.yahoo.com/group/milis-masterweb/auth?check...
           => `auth?check=G&done=/group/milis-masterweb/message/1'
Connecting to groups.yahoo.com:80... connected!
HTTP request sent, awaiting response... 302
Location: http://groups.yahoo.com/group/milis-masterweb/message/1
[following]
--10:26:11--  http://groups.yahoo.com/group/milis-masterweb/message/1
           => `1'
Connecting to groups.yahoo.com:80... connected!
HTTP request sent, awaiting response... 200 OK
Length: unspecified [text/html]
 
    0K .......... ...
 
10:26:12 (551.96 KB/s) - `1' saved [13565]
--10:26:03--  http://groups.yahoo.com/group/milis-masterweb/message/2
           => `2'
dst...

Tantangan 6: Cookie Persisten

Keinginan: Saya ingin mengambil arsip Yahoo! Groups, tapi arsip ini hanya terbuka untuk member.
Jawab: Pertama, login dulu ke Yahoo! di browser, atau gunakan browser Lynx berkemampuan SSL atau links. Jika menggunakan Lynx, pastikan setting PERSISTENT_COOKIES adalah TRUE di lynx.cfg. Di form login, centanglah pilihan Remember Me. Ini akan menyebabkan Yahoo! mengirim cookie persisten yang mengingat login kita. Cookie persisten ini akan kita ambil nanti, dan kita berikan pada wget.
Dua, jadilah member milis tersebut apabila belum.
Tiga, ambil cookienya. Dengan Lynx, cookie telah ada di direktori $HOME/.lynx_cookies, sementara di Netscape Anda bisa mengambilnya dalam bentuk file cookies.txt di direktori profile user Anda. Format cookie kedua program ini sama dan didukung oleh wget.
Sekarang, berikan opsi --load-cookies untuk memuat cookie persisten ini sebelum mendownload.
$ wget -UMozilla -x --load-cookies=/home/steven/.lynx_cookies --no-cycle-detect \
    --cookies=on http://groups.yahoo.com/group/NAMAMILIS/message/1 

Tantangan 7: Iklan Interupsi

Masih dengan Yahoo! Groups, setelah Anda berhasil mengambil posting 1 hingga 500, ternyata masalahnya belum selesai. Tiap posting dengan id kelipatan 4 (mis: 4, 8, 12, dst.) ternyata hilang dari hasil download. Yang ada bukan message/N, melainkan halaman-halaman bernama interrupt?st=…. Ini iklan interupsi. Memang sejak satu atau dua bulan lalu Yahoo! menerapkan iklan interupsi, yaitu halaman perantara yang harus kita lewati sebelum sampai ke URL akhir. Menjengkelkan bukan?
Berikut ini salah satu cara mengakalinya. Kita membuat loop dengan skrip Perl misalnya, agar bila halaman message/N yang kita inginkan belum ada, maka kita minta ulang.
#!/usr/bin/perl 
$|++;
open WGET,"| /usr/bin/wget -w3 -nc -x --no-cycle-detect --cookies=on -UMozilla/4.0 -i -";
for(;;) {
  $masih_ada=0;
  for(1..500) {
    $masihada++,print WGET "http://groups.yahoo.com/group/milis-masterweb/message/$_\n" x 2
      if !-e "./groups.yahoo.com/group/milis-masterweb/message/$_";
  }
  exit unless $masih_ada;
}
wait();
Lihat baris yang diakhiri x 2. Anda bisa ganti x 3 misalnya jika masih belum mendapatkan posting-posting bernomor kelipatan 4. Ini trik untuk mengakali halaman interupsi yang kadang diberikan dua kali berturut-turut oleh Yahoo!. Jadi kita dari awal sudah meminta pada wget agar URL yang kita inginkan diambil dua tiga kali. Tentu saja, dengan -nc kita tidak akan mendownload dobel seandainya halaman yang asli sudah kita peroleh.

Tantangan Pamungkas: Applet dan Javascript

Di tantangan-tantangan sebelumnya kita telah melihat bahwa usaha pemilik situs memblok wget tidaklah terlalu efektif. Wget dapat menyamar sebagai browser, juga mendukung cookie, dan dapat memalsukan header HTTP manapun. Kalau Anda jadi pemilik situs, sekarang bagaimana cara mengatasi hal ini? Anda perlu mencari apa yang betul-betul menjadi karakteristik browser grafis yang tidak dimiliki wget. Tahu jawabannya? Tentu saja: applet dan Javascript. Wget tidak memiliki engine Javascript maupun JRE, dan meskipun punya pun, kita bisa membuat kode Javascript yang betul-betul membutuhkan interaktivitas user agar dapat dibrowse. Tapi hati-hati, bisa-bisa tidak hanya wget yang Anda tolak kedatangannya, semua user juga bisa kesal dan meninggalkan situs Anda jauh-jauh.
Sebagai ganti <a href=...>, cobalah ganti dengan <a href=# onClick=…> dan letakkan URL yang ingin Anda sembunyikan di dalam kode Javascript. Atau gantilah dengan document.write("<a href=...>"). Buatlah ekspresi dan bukan literal sederhana agar URL tidak mudah diambil dengan regex. Misalnya: a="p://boo.com/peeka.html"; document.write("<a "+"href=htt"+a);.
Hati-hatilah agar tidak membuat URL dengan pola yang mudah ditebak. Contohnya: www.comicsworld.com/c11-htm/c11-01-1.htm. Seorang teman saya ingin mengambil semua buku komik di sana dengan Teleport Pro. Tapi karena link ke daftar isi tiap buku komik ditulis dengan <a onClick…>, maka robot tidak dapat mengambilnya. Terpaksa kita buka satu dua buku komik dengan browser.
Anda sudah dapat melihat polanya? Tiap buku komik mungkin kurang pasti pola direktorinya, karena itu kita ambil secara manual. Tapi untuk mengambil halaman satu hingga terakhir dari sebuah buku komik, kita tinggal memainkan digit terakhirnya. Rata-rata buku komik tebalnya 28-36 halaman—kita ambil saja patokan 36 halaman—dan dengan skrip sederhana ini:
$ perl –le 'for (01..80) { 
    print "http://www.comicsworld.com/Html/c111501-htm/C111501-$_.htm" }' > komik1.txt
$ wget –x –p –i komik1.txt 
kita bisa melewati Javascript-nya sama sekali dan langsung mengambil semua halaman buku komik.
Proteksi yang lebih canggih biasanya menggunakan URL random yang tidak bisa ditebak polanya begitu saja. Tapi dengan sedikit usaha lebih, kita masih bisa mengekstrak URL yang dibutuhkan. Sebagai PR dan tantangan untuk Anda, cobalah ambil “seluruh manual untuk SAP R/3 Release 4.6c bahasa Inggris” menggunakan wget dan skrip/regex (Catatan: ukuran totalnya mencapai puluhan MB). Situs tempat manual ini berada, help.sap.com, dipenuhi kode Javascript. Tree navigasi kiri frame sepenuhnya dibuat dengan Javascript (sampai-sampai lambatnya minta ampun). Hint: pertama browselah dengan browser hingga sampai ke halaman daftar isi manual. Ambil URL frame navigasi kiri. Cobalah intip source codenya. Di sini Anda akan melihat bahwa URL-URL relatif tiap halaman manual diapit dalam fungsi Javascript. Tugas Anda adalah mengekstrak URL tersebut, dengan regex misalnya. Kumpulkan semuanya, suapkan ke wget. Hint tambahan: pakai opsi -p, -I, -r, dan -np. Setelah itu Anda mungkin harus membuat frame navigasi baru yang bebas Javascript.
Jika Anda bisa mengambil semuanya dengan sukses, barangkali Anda boleh mulai menyebut diri dengan gelar “si raja download.”

Penutup

Dengan berbagai opsi wget, dan kadang dengan bantuan skrip, Anda bisa menyaru sebagai browser dan mendownload hampir semua halaman dan situs mana saja yang Anda suka. Biasanya dibutuhkan dulu coba-coba untuk mengetahui pengecekan macam apa yang diberlakukan oleh server (mis: header Referer, User-Agent, cookie, atau kombinasi ketiganya). Situs dengan Javascript pun kadang bisa Anda ambil dengan wget bersama bantuan skrip regex. Jangan cepat menyerah, coba-coba terus. Tapi selalulah hati-hati agar tidak melakukan overgrabbing dan memboroskan bandwidth.
Anda dapat juga memilih menggunakan pavuk ketimbang wget. Keduanya sama-sama masih aktif dikembangkan. Pavuk memiliki beberapa fitur lain yang belum dimiliki wget seperti multithreading dan membaca tag Javascript, tapi jangan berharap banyak yang terakhir ini akan membuat Anda dapat mengambil semua situs yang diproteksi dengan kode Javascript. Fitur pavuk lain yang belum ada di wget adalah request POST (ada patch buat wget untuk hal ini, tapi hingga sekarang belum diintegrasi ke distribusi wget). Selain pavuk, Anda bisa mencoba curl. Curl mendukung protokol-protokol lain seperti telnet, ldap, gopher, mendukung metode PUT HTTP dan upload FTP, serta didukung oleh PHP. (Lihat artikel boks “Download Mutasi Rekening BCA dengan Curl.”) Ada juga fitur yang belum dimiliki baik wget, pavuk, maupun curl, seperti swarming/split download (mendownload bagian-bagian sebuah file besar secara paralel), tapi fitur ini toh hanya bermanfaat menambah sedikit kecepatan download di lingkungan high latency (seperti di koneksi dialup).

Resource

Homepage wget: sunsite.dk/wget/
RPM Database: rpmfind.net
Sintaks file robots.txt: www.robotstxt.org/

Jangan lupa baca yang ini juga



0 comments:

Posting Komentar

PEDOMAN KOMENTAR
Ayo berpartisipasi membangun budaya berkomentar yang baik. Pantang bagi kita memberikan komentar bermuatan menghina atau spam.
Kolom komentar tersedia untuk diskusi, berbagi ide dan pengetahuan. Hargai pembaca lain dengan berbahasa yang baik dalam berekspresi. Setialah pada topik. Jangan menyerang atau menebar kebencian terhadap suku, agama, ras, atau golongan tertentu.

Bangun sharing ilmu dengan berkomentar disini :