DEV Community

Eko Priyanto
Eko Priyanto

Posted on

scrape JDIHN menggunakan PHP DiDOM dan supabase

Image description

Script PHP untuk scrape JDIHN menggunakan counting mundur.

Yup funny...

Kode lengkap

<?php

require 'vendor/autoload.php';

use DiDom\Document;

function safe_url($text) {
    return trim(preg_replace('/[^a-z0-9]+/i', '_', strtolower($text)), '_');
}

function insertToSupabase($data) {

    // Supabase API Config
    $supabaseUrl = 'https://ndahe.supabase.co';
    $supabaseKey = 'ndi45m03';


    $tableName = 'peraturan'; // Nama tabel di Supabase

    // Mengonversi array ke format asosiatif
    $formattedData = [];
    foreach ($data as $item) {
        if (!empty($item[1])) { // Abaikan field kosong
            $formattedData[$item[0]] = $item[1];
        }
    }

    $jsonData = json_encode([$formattedData]);

    $ch = curl_init("$supabaseUrl/rest/v1/$tableName");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, [
        "Content-Type: application/json",
        "apikey: $supabaseKey",
        "Authorization: Bearer $supabaseKey",
        "Prefer: return=representation" // Mengembalikan data yang telah di-insert
    ]);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonData);

    $response = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);

    return [
        'status' => $httpCode,
        'response' => json_decode($response, true)
    ];
}

//1987000
//1986526  working
for ($i = 1986526; $i >= 0; $i--) {

    echo "[$i]  ";

    $uri = "https://jdihn.go.id/pencarian/detail/$i";
    $html = @file_get_contents($uri); // Tambahkan @ untuk menghindari warning

    // Jika gagal mengambil halaman, lanjutkan ke iterasi berikutnya
    if ($html === false) {
        echo " \e[31m page not found  \e[0m \n";
        continue;
    }

    $document = new Document($html);

    // Cari elemen tabel pertama dalam halaman
    $table = $document->first('table');

    // Jika tabel tidak ditemukan, lanjutkan ke iterasi berikutnya
    if (!$table) {
        echo " \e[31m table not found  \e[0m \n";
        continue;
    }

    // Ambil semua baris dari tabel
    $rows = $table->find('tr');

    $data = [];
    foreach ($rows as $row) {
        // Ambil semua sel dari baris
        $cells = $row->find('td'); // Gunakan 'th' jika ingin mengambil header

        $rowData = [];

        if (isset($cells[0])) {
            $rowData[0] = safe_url($cells[0]->text());
        }

        if (isset($cells[2])) {
            $links = $cells[2]->find('a');
            foreach ($links as $link) {
                $rowData[1] = $link->getAttribute('href');
            }
            if (!isset($rowData[1])) {
                $rowData[1] = $cells[2]->text();
            }
        }

        // Tambahkan data jika tidak kosong
        if (!empty($rowData)) {
            $data[] = $rowData;
        }
    }


    $data[] = ["url_id", $i];

    $pesan = insertToSupabase($data);

    echo "\e[34m maybe \e[0m  [OK] \n";

    usleep(rand(100000, 500000));
}


Enter fullscreen mode Exit fullscreen mode

Ini untuk bikin tabel di supabase, jangan lupa tambahkan id yang autoincreement (lupa namanya kalau di supabase)

CREATE TABLE peraturan (
    asal_dokumen TEXT,
    jenis_dokumen TEXT,
    nomor TEXT,
    tahun TEXT,
    judul TEXT,
    t_e_u TEXT,
    singkatan_jenis TEXT,
    tempat_terbit TEXT,
    tanggal_penetapan TEXT,
    tanggal_pengundangan TEXT,
    subyek TEXT,
    status TEXT,
    penandatangan TEXT,
    sumber TEXT,
    bahasa TEXT,
    unduhan TEXT,
    unduhan_alternatif TEXT,
    abstrak TEXT,
    unduhan_abstrak_alternatif TEXT,
    detil_dokumen TEXT,
    url_id TEXT,
);

Enter fullscreen mode Exit fullscreen mode

Jangan lupa jalankan di Terminal Cpanel

nohup php script.php
Enter fullscreen mode Exit fullscreen mode

Image description

Top comments (0)