Web Scraping adalah proses pengekstrakan data dari web menggunakan teknik tertentu. Proses ini bisa dilakukan melalui protocol http(s) atau melalui browser. Web Scraping terkadang dibutuhkan untuk mengambil data dari sebuah website yang tidak menyediakan Application Programming Interface (API). Namun, terkadang hal ini disalah gunakan untuk membuat blog AGC dengan bervareasi bentuk dan cara.
Catatan ini akan membahas secara singkat mengenai cara pembuatan web scraper menggunakan fungsi CURL PHP yang dipadukan dengan librari PHP Simple HTML DOM Parser yang bisa didapat melalui Sourceforge.net. Berdasarkan dokumentasi yang tersedia, librari PHP Simple HTML DOM Parser memiliki fitur-fitur sebagai berikut:
- Dibuat menggunakan PHP 5+ dan dapat digunakan untuk memanipulasi HTML dengan mudah
- Mendukung HTML yang tidak valid (invalid HTML)
- Mencari dan menemukan tag di dalam HTML menggunakan selector seperti jQuery
- Extract konten dari HTML hanya menggunakan satu baris kode (single line).
Dokumentasi selengkapnya bisa dilihat di sini.
Membuat Web Scraping
Pada dasarnya, librari PHP Simple HTML DOM Parser bisa digunakan secara langsung untuk mengambil data dari suatu website (scraping) tanpa menggunakan CURL. Namun, pada kesempatan kali ini, catatan ini akan menggunakan CURL Karena pada beberapa kasus, librari ini tidak bisa mengambil data karena konfigurasi server yang kurang tepat atau hal lainnya. Intinya, kita butuh data berbentuk plain HTML untuk diparse menggunakan librari ini.
Membuat Request Data Menggunakan CURL
Kita perlu membuat request data menggunakan CURL. Pada request ini, aku menggunakan contoh user agen Mozilla dan referer kuatur dari Google.
$ch1 = curl_init();
Kode di atas digunakan untuk menginisiasi CURL. Setelah CURL berhasil diinisiasi, selanjutnya kita setting URL web yang mau discrap dengan kode di bawah ini:
curl_setopt($ch1, CURLOPT_URL, "https://stackoverflow.com/questions/1053424/how-do-i-get-php-errors-to-display");
Kode di atas diatur untuk mengambil data dari sebuah pertanyaan dari Stackoverflow. Selanjutnya kita set user agen dan referer menggunakan kode di bawah ini:
curl_setopt($ch1, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.0.3705; .NET CLR 1.1.4322; Media Center PC 4.0)'); //user agen curl_setopt($ch1, CURLOPT_REFERER, 'http://www.google.com'); //referer
Selanjutnya kita tambahkan kode di bawah ini:
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch1, CURLOPT_FOLLOWLOCATION, 20);
Kode di atas digunakan untuk opsi penampilan data dan boleh atau tidaknya CURL tersebut mengikuti URL jika URL yang diatas melakukan pengalihan (redirect). Selanjutnya kita masukkan data html yang didapat ke dalam sebuah variabel.
$htmlContent = curl_exec($ch1);
Variabel
$htmlContent
berisi data berupa plain HTML. Jika variabel tersebut ditampilkan menggunakan
echo
maka akan tampil seperti sumber asal atau dalam hal ini sama seperti yang tampil di Stackoverflow.
Extract HTML Menggunakan PHP Simple HTML DOM Parser
Setelah HTML bisa didapatkan menggunakan CURL, selanjutnya kita parse HTML tersebut menggunakan PHP Simple HTML DOM Parser dengan cara berikut:
- Buat variabel baru untuk mewadahi HTML yang diambil dari CURLmenggunakan fungsi yang telah disediakan librari
$html = str_get_html($htmlContent);
- Agar tidak terjadi error manakala data HTML tidak ditemukan maka kita perlu membuat statemen berikut:
if (!empty($html)) { .... }
Jika data HTML tidak kosong maka kita bisa mencari kontent tertentu di dalamnya.
- Pada kesempatan ini, aku mau mengambil teks pertanyaan dari web Stackoverflow. Setelah melihatstruktur HTMLnya, teks tersebut diletakkan di dalam sebuah div dengan nama class post-text maka kode untuk mengambil data tersebut bisa dilakukan dengan cara berikut ini:
$question_text = $html->find('div[class=post-text]', 0);
Fungsi find ini memiliki dua argumen. Argumen pertama adalah selector dan argumen ke dua adalah index. Jika misalnya di dalam data HTML tersebut ada banyak class dengan nama post-text maka argumen kedua bisa diisi menggunakan looping. Pada contoh di atas, teks yang akan diambil adalah teks yang terletak di class
- Selanjutnya, aku mau mengambil jawaban yang diterima saja. Jawaban itu diletakkan di dalam sebuah div dengan class-name accepted-answer maka kode yang bisa digunakan adalah sebagai berikut:
$accepted_answer = $html->find('div[class=accepted-answer]', 0);
Kode di atas akan mengambil tag HTML beserta isinya yang terletak di dalam class accepted answer.
- Aku hanya ingin mengambil teks jawaban yang diterima saja (jumlah vote dan favorite) tidak kuambil maka kode yang digunakan seperti di bawah ini:
$answer_text = $accepted_answer->find('div[class=post-text]', 0);
- Langkah terakhir adalah menampilkan hasil scraping ke browser menggunakan
echo
.
echo "<h1>Pertanyaan: </h1><p>$question_text</p><h2>Jawaban: </h2> <p>$answer_text</p>";
Hasil dari semua kode di atas adalah seperti Screenshoot di bawah ini:
Scrapping data from stackoverflowKode lengkap bisa didownload melalui link berikut ini.