Programming, tutorials, mechatronics, operating systems, and other tech stuff

Membaca schema.org microdata pada html terstruktur dengan PHP

5 comments
Microdata, microformat dan RDFs adalah sebuah kamus / vocabulary untuk menentukan struktur konten HTML yang didukung oleh Google dan hampir semua search engine besar. Microdata digunakan sebagai skema untuk menentukan konten dari sebuah website yang dapat dipahami oleh crawler atau robot penelusuran search engine. Sedangkan schema.org adalah penyedia dari skema struktur vocabulary tersebut. Sudah banyak website-website yang menggunakan microdata, terutama toko-toko online atau marketplace dengan tujuan  konten dari websitenya mudah dipahami oleh mesin pencari. Sebagai contoh website marketplace tokopedia.com.

Pada postingan kali ini saya akan fokus membahas tentang bagaimana cara membaca atau mengekstrak data microdata menggunakan PHP. Dimana nantinya akan banyak kegunaan dan penerapannya. Contoh penerapannya bisa anda coba di website hargapedia.info. (ini promosi) dimana pada website tersebut kita dapat melakukan pencarian barang, yang kemudian berdasarkan pencarian tersebut akan dicarikan katalog harga langsung dari tokopedia dengan menggunakan microdata.

Untuk lebih jelasnya mengenai microdata bisa anda baca di wikipedia.

Untuk bagaimana cara menggunakan microdata dan dokumentasinya, bisa anda lihat di situs schema.org.Sekilas tentang library microdataPHP

microdataPHP adalah salah satu library PHP yang digunakan untuk mengekstrak microdata dari file HTML. Dibuat oleh linclark dan bisa anda unduh di github linclark/MicrodataPHP.

Atau anda bisa menggunakan versi fork yang sudah saya minimalkan dan yang saya gunakan dalam tutorial ini. Bisa anda unduh di cybermujahidz/MicrodataPHP

Microdata PHP menggunakan library native PHP DOMDocument untuk mengambil dan membaca data dari HTML, kemudian mengolahnya berdasarkan aturan-aturan dari schema.org sehingga didapatkan sebuah struktur microdata. Dimana hasilnya bisa kita jadikan sebuah php object atau juga JSON.

Cara membaca struktur mikrodata menggunakan microdataPHP


Pertama-tama, download library microdata php dari repo saya di cybermujahidz/MicrodataPHP.

Kemudian buat sebuah file php dengan nama bacaMicrodata.php atau terserah anda di doc root webserver anda, misalnya htdocs.

copy folder "src" dari library microdataPHP tadi kedalam doc root sehingga dapat di include oleh file bacaMicrodata.php yang kita buat tadi.

lalu edit file bacaMicrodata.php menggunakan text editor kesayangan anda dan ketikkan script berikut (misalnya kita hendak mengekstrak data dari website tokopedia.com):

[code lang="php"]

<?php
//memanggil library microdataPhp
include('src/MicrodataPhp.php');
//url dari html yang akan di extract
//disini saya mengambil hasil pencarian produk dengan kata kunci "motherboard" dari tokopedia
$url='https://www.tokopedia.com/search?st=product&q=motherboard&sc=0';

//membuat object MicrodataPhp dari url kedalam variabel $md
$md=new MicrodataPhp($url);

//mengambil hasil olahan microdata berupa php object kedalam variabel $data
$data=$md->obj();

//print rekursif hasilnya
echo "<pre>";
print_r($data);
echo "</pre>";
?>

[/code]

Pastikan anda terhubung ke internet, karena script tersebut akan mengunduh data langsung dari tokopedia. kemudian panggil file bacaMicrodata.php melalui browser.

Jika tidak ada problem, maka kurang lebih hasilnya akan seperti ini:

microdata1

Jika diakses langsung ke tokopedia, maka sebenarnya bentuknya seperti ini:

microdata3

Dengan memanfaatkan hasil tersebut kita dapat membuat list daftar barang hasil pencarian dengan loop dari itemscope itemListElement.

Script berikut untuk menampilkan data kedalam tabel berdasarkan struktur pada website tokopedia, jadi skrip berikut hanya berlaku untuk data dari tokopedia.

[code lang="php"]

<table>
<?php
//memanggil library microdataPhp
include('src/MicrodataPhp.php');
//url dari html yang akan di extract
//disini saya mengambil hasil pencarian produk dengan kata kunci "motherboard" dari tokopedia
$url='https://www.tokopedia.com/search?st=product&q=motherboard&sc=0';

//membuat object MicrodataPhp dari url kedalam variabel $md
$md=new MicrodataPhp($url);

//mengambil hasil olahan microdata berupa php object kedalam variabel $data
$data=$md->obj();

//berdasarkan struktur yang didapat(lihat hasil script pertama), array yang memuat list hasil pencarian terdapat pada index 1 atau 2
//cek apakah index 1 dan 2 kosong. bila kosong, artinya hasil pencarian kosong.
if(empty($data->items[1]) && empty($data->items[2])){
    echo "tidak ditemukan";
exit;
}

//jika ada promosi, maka hasil pencarian berada pada index 2, karena index 1 akan berisi barang-barang promosi
$listing=(!empty($data->items[2]))?2:1;

//loop hasil sebagai variabel $anu
foreach($data->items[$listing]->properties['itemListElement'] as $anu){
//$anu->properties['name'] adalah array yg berisi itemprop nama, biasanya hanya ada satu elemen didalamnya
//$anu->properties['offers'] adalah array yg berisi penawaran harga. biasanya dalam hasil pencarian tokopedia hanya ada 1 harga untuk 1 item. Sehingga dapat langsung diambil menggunakan properties['price'] yg berisi array untuk nominal harga
    echo "
    <tr>
        <td>".$anu->properties['name'][0]."</td>
        <td>".$anu->properties['offers'][0]->properties['price'][0]."</td>
    </tr>
    ";
}
?>
</table>

[/code]

Dan hasilnya :

microdata2

sekian salah satu contoh cara mengekstrak microdata dari html menggunakan PHP. Selebihnya bisa anda eksperimen dan kembangkan sendiri sesuai kebutuhan anda.

Troubleshooting


Berikut adalah beberapa contoh masalah yang mungkin ditemui ketika mencoba tutorial diatas.

Pesan Fatal Error max nesting level


Fatal error: Maximum function nesting level of '100' reached, aborting!

Umumnya terjadi jika anda menggunakan mod php xdebug. Terjadi karena microdataPHP melakukan nesting loop rekursif yang melebihi nilai maksimum yang ditetapkan oleh xdebug.

Solusinya:

tambahkan

[code lang="php"]ini_set('xdebug.max_nesting_level', 400);[/code]

pada awal baris script php.

Tidak muncul hasil


Kemungkinan php.ini anda men-disable error reporting, atau memang tidak ada hasil apa-apa yang didapat oleh microdataPHP.

Solusinya:

Untuk memunculkan error reporting, tambahkan baris

[code lang="php"]error_reporting('E_ALL');[/code]

atau jika tidak ada hasil apa-apa, pastikan anda bisa mengakses tokopedia.com melalui browser.

Pesan error (!) scream error suppression ignored


( ! ) SCREAM: Error suppression ignored for ( ! )...

Terjadi bila anda menggunakan xdebug dan fitur scream aktif. Karena microdataPHP menggunakan error suppression"@" untuk mengatasi struktur html yang tidak valid.

Solusinya:

tambahkan

[code lang="php"]ini_set('xdebug.scream' 0);[/code]

pada awal baris php.

5 comments :

  1. muantap sekali gan

    ReplyDelete
  2. samean terimah kasih atas infonya

    ReplyDelete
  3. kl hasilnya diubah array gimana? gk biasa pakai objek.

    ReplyDelete
  4. Sebenarnya hasilnya sudah berbentuk array. Cuma didalamnya ada yg berupa object. Misalnya seperti contoh diatas, $data itu object, didalamnya ada 1 elemen "items" yg berupa array yg isinya 2 elemen (0 dan 1). Jadi untuk manggilnya:
    $data->items[0]
    -> untuk object, [ ] untuk array.
    misal untuk mengambil breadcrumb:
    $data->items[0]->properties['breadcrumb'][0]

    Atau bisa dicoba buat struktur array sendiri dari json. Contoh diatas, hasilnya berupa object karena
    $data=$md->obj();
    untuk menjadikan ke json, gunakan
    $data=$md->json();
    terus tinggal di json_decode($data)

    ReplyDelete