Beberapa saat lalu di fanpage facebook kami ada yang meminta tutorial tentang bagaimana cara mengambil data / grabbing dari situs. Bagi beberapa orang belum tahu bagaimana manfaat dari grabbing ini, dengan grabbing ini developer dapat mengambil data dari situs yang diinginkan dengan tujuan ingin mengambil data yang diperlukan untuk keperluan development mereka. Tetapi tidak seperti facebook dan twitter, banyak situs situs populer yang tidak memberikan API untuk mengakses data mereka sehingga tidak mungkin kita bisa mendapatkan data mereka melalui program kita.
Kali ini saya akan memberikan tutorial bagaimana cara mengambil konten / data dari situs sehingga data mereka dapat kita ambil dan kita manfaatkan. Sebagai contoh kali ini saya akan mencoba mengambil konten berita dari situs Kompas.com menggunakan pemrogramman PHP melalui cURL dan HTML DOM, langsung saja kita mulai :
Pertama kita harus mengetahui struktur dari website yang akan kita ambil kontennya, pertama kita lihat dan inspect element bagian yang ingin kita ambil kontennya:
Setelah kita tahu bagian yang mana ingin kita ambil selanjutnya kita lihat inspect element
setelah itu kita bisa langsung membuat syntaxnya.pertama buat dulu syntax curl,sebelumnya karena induk yang akan kita ambil kontennya tidak memiliki ID sebegai penggantinya kita akan mengambil menggunakan class disini saya buat fungsi agar mudah dipakai
1
2
3
4
5
6
7
8
9
10
11
12
13
|
function bacaHTML( $url ){ // inisialisasi CURL $data = curl_init(); // setting CURL curl_setopt( $data , CURLOPT_RETURNTRANSFER, 1); curl_setopt( $data , CURLOPT_URL, $url ); // menjalankan CURL untuk membaca isi file $hasil = curl_exec( $data ); curl_close( $data ); return $hasil ; } |
1
2
3
4
5
6
7
8
| //mengambil data dari kompas //membuat dom dokumen $dom = new DomDocument(); //mengambil html dari kompas untuk di parse @ $dom ->loadHTML( $bacaHTML ); |
Sampai disini kita hanya berhasil memanggil seluruh html dari kompas.com selanjutnya kita akan mengambil kontent tertentu dari html menggunakan DOM HTML.
1
2
3
4
5
6
| //nama class yang akan dicari $classname = "most" ; //mencari class memakai dom query $finder = new DomXPath( $dom ); $spaner = $finder ->query( "//*[contains(@class, '$classname')]" ); |
dengan syntax diatas kita dapat mngambil data dari semua tag yang memiliki class most, saat saya menguji karena menggunakan class, DOM menerima 3 class most , padahal kita hanya membutuhan most yang pertama saja, maka itu juga bisa dilakakukan di DOM. Sekalian kita akan mengambil kontent dari setiap baris li dari induknya ul . Sebelumnya mari kita lihat dulu tag konten yang akan kita ambil.
setelah kita tahu maka kita akan langsung mengambil isi dari tag tersebut. Maka sisipkan syntax berikut dibawah syntax sebelumnya
1
2
3
4
5
6
| //mengambil data dari class yang pertama $span = $spaner ->item(0); //dari class pertama mengambil 2 elemen yaitu a yang menyimpan judul dan link dan span yang menyimpan tanggal $link = $span ->getElementsByTagName( 'a' ); $tanggal = $span ->getElementsByTagName( 'span' ); |
Dengan itu kita akan mengambil seluruh link dan tanggal dari tag masing masing, tetapi pada saat ini kedua variable itu masih berbentuk array dom, maka kita akan merapihkannya menjadi array normal dengan menyisipkan lagi syntax berikut.
1
2
3
4
5
6
7
8
9
10
11
12
| //persiapkan array untuk diambil datanya $data = array (); foreach ( $link as $val ){ $data [] = array ( 'judul' => $link ->item( $no )->nodeValue, 'link' => $link ->item( $no )->getAttribute( 'href' ), 'tanggal' => $tanggal ->item( $no )->nodeValue, ); $no ++; } ?> |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
| < style > table,th,td{ border:1px solid #000; font-size:12px; } </ style > < h2 >Grabbing dari Kompas.com</ h2 > < table > < thead > < th >No</ th > < th >Judul</ th > < th >Link</ th > < th >Tanggal</ th > </ thead > < tbody >
$ no = 1 ; foreach($data as $val) { ?> < tr > < td > < td > < td > < td > </ tr >
$no++; } ?> </ tbody > </ table > |
dengan begitu kita selesai melakukan pengambilan data dan mengeluarkannya dalam bentuk tabel.
Ini keseluruhan sytax nya atau kamu bisa download dibawah nanti.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
|
function bacaHTML($url){ // inisialisasi CURL $ data = curl_init (); // setting CURL curl_setopt($data, CURLOPT_RETURNTRANSFER, 1); curl_setopt($data, CURLOPT_URL, $url); // menjalankan CURL untuk membaca isi file $ hasil = curl_exec ($data); curl_close($data); return $hasil; } //mengambil data dari kompas //membuat dom dokumen $ dom = new DomDocument(); //mengambil html dari kompas untuk di parse @$dom->loadHTML($bacaHTML); //nama class yang akan dicari $classname="most"; //mencari class memakai dom query $finder = new DomXPath($dom); $spaner = $finder->query("//*[contains(@class, '$classname')]"); //mengambil data dari class yang pertama $span = $spaner->item(0); //dari class pertama mengambil 2 elemen yaitu a yang menyimpan judul dan link dan span yang menyimpan tanggal $link = $span->getElementsByTagName('a'); $tanggal = $span->getElementsByTagName('span'); $no = 0; //persiapkan array untuk diambil datanya $data =array(); foreach ($link as $val){ $data[] = array( 'judul' => $link->item($no)->nodeValue, 'link' => $link->item($no)->getAttribute('href'), 'tanggal' => $tanggal->item($no)->nodeValue, ); $no++; } ?> < style > table,th,td{ border:1px solid #000; font-size:12px; } </ style > < h2 >Grabbing dari Kompas.com</ h2 > < table > < thead > < th >No</ th > < th >Judul</ th > < th >Link</ th > < th >Tanggal</ th > </ thead > < tbody >
$ no = 1 ; foreach($data as $val) { ?> < tr > < td > < td > < td > < td > </ tr >
$no++; } ?> </ tbody > </ table > |
Mari kita Uji Coba dan inilah hasilnya
Beri +1,like atau share jika bermanfaat, jangan lupa juga komen jika mengalami masalah.
sumber
keren broo keren..
ReplyDeletesaya mo nanya bisa nga kita data grab situs lazada misalnya ??
jadi yg saya mo grab itu gambar barang , nama barang dan harga barang
kalo abang bisa bantu boleh email saya
pembunuhsetan@gmail.com
Bang .. bisa bantu saya ??
ReplyDeletekenapa? itu sudah jelas menurutku..he
Deletegan, saya mau nanya nih, misalnya kita sudah berhasil grabbing beberapa situs berita, nah untuk buat semuanya jadi timeline terus di sortir berdasarkan waktu gimana ya gan?
ReplyDeletetinggal sort date aja gan,, maaf telat jarang buka blog ini, he
Deletegan, minta kontak yang bisa dihubungi dong, saya newbie dan ingin belajar gan. tolong gan . terimakasih
ReplyDeleteom mau tanya nih, kalo itu berarti beritanya up to date ga? terus kalo semisal diklik berarti masuk ke kompas gitu ya?
ReplyDeleteberita update jg gan,, kalo di klik brti ke web kita oh
DeleteMantafff
ReplyDeletekalo pake regex gmna om ??
ReplyDeletetergantung selera aja sih om mau pake apa, yang penting work,, :)
Deletemaaf masih baru , systax di atas bisa kita save dengan format apa ya ? , apa kah ada yg sengaja di salahkan ?
ReplyDeleteGan teknik grabbing ini kira kira bisa gk dipake buat informasi beasiswa ? Misalnya sy ambil data beasiswa kaya persyaratan, fasilitas dll dari website resmi penyedia beasiswa nya
ReplyDeletetinggan mainkan aja codingnya, :)
DeleteThis comment has been removed by a blog administrator.
ReplyDeletemantap
ReplyDeletegan kalau yang mau kita grab itu table yang server side processing bisa ngga ya? soalnya saya sudah coba tp hanya dapat table header nya saja
ReplyDelete