DEV Community

Eko Priyanto
Eko Priyanto

Posted on

Grab detail JDIHN

Grab detail JDIHN berdasarkan id dan menyimpannya menjadi csv

<?php
// Pastikan file simple_html_dom.php ada di satu folder
require 'simple_html_dom.php';

// --------------------------------------------------------------------------
// INPUT DARI USER
// --------------------------------------------------------------------------
echo "Masukkan ID awal: ";
 $awal = trim(readline());
echo "Masukkan ID akhir: ";
 $akhir = trim(readline());

// Validasi input
if (!is_numeric($awal) || !is_numeric($akhir) || $awal > $akhir) {
    die("Input tidak valid. Pastikan awal dan akhir adalah angka dan awal <= akhir.\n");
}

// --------------------------------------------------------------------------
// SETUP NAMA FILE DINAMIS
// --------------------------------------------------------------------------
 $filename = $awal."_".$akhir."_detail_JDIHN.csv";

echo "--------------------------------------------------\n";
echo "Proses akan dimulai dari ID $awal hingga $akhir.\n";
echo "Hasil akan disimpan dalam file: $filename\n";
echo "--------------------------------------------------\n";


// --------------------------------------------------------------------------
// FUNGSI-FUNGSI HELPER
// --------------------------------------------------------------------------

// FITUR: Mengambil ID dari URL (tetap dipertahankan untuk modularitas)
function getIdFromUrl($url) {
    $path = parse_url($url, PHP_URL_PATH);
    $segments = explode('/', $path);
    $key = array_search('detail', $segments);
    if ($key !== false && isset($segments[$key + 1])) {
        return $segments[$key + 1];
    }
    return 'unknown';
}

// LANGKAH 1: Ambil HTML via cURL
function getHTML($url) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'); 
    curl_setopt($ch, CURLOPT_TIMEOUT, 30); // Timeout 30 detik
    $output = curl_exec($ch);
    $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);

    if ($http_code != 200) {
        return null; // Kembalikan null jika gagal (misal 404)
    }

    return $output;
}

// --------------------------------------------------------------------------
// SETUP CSV
// --------------------------------------------------------------------------
 $file_exists = file_exists($filename);

// Buka file untuk append ('a'). Ini akan menambah data di akhir file.
 $fp = fopen($filename, 'a');

if (!$fp) {
    die("Gagal membuka/membuat file CSV. Cek permission folder.\n");
}

// Jika file belum ada, tulis header dan BOM untuk kompatibilitas Excel
if (!$file_exists) {
    // Tambahkan BOM agar UTF-8 terbaca benar di Excel
    fputs($fp, $bom = (chr(0xEF) . chr(0xBB) . chr(0xBF)));

    // Definisikan header secara manual agar lebih robust
    $headers = [
        'id', 'judul', 'jenis_peraturan', 'nomor_peraturan', 'tahun_peraturan', 
        'tentang', 'tempat_penetapan', 'tanggal_penetapan', 'tanggal_pengundangan', 
        'status', 'bahasa', 'lokasi', 'sumber', 'bidang_hukum', 'sub_bidang_hukum', 'link_download'
    ];
    fputcsv($fp, $headers);
    echo "File $filename dibuat dan header ditulis.\n";
}

// --------------------------------------------------------------------------
// PROSES LOOPING
// ----------
echo "Memulai proses...\n";

for ($i = $awal; $i <= $akhir; $i++) {
    echo "Memproses ID: $i\r"; // Gunakan \r untuk menimpa baris, agar output lebih rapi

    // 1. Konfigurasi URL (dinamis berdasarkan loop)
    $url = "https://jdihn.go.id/pencarian/detail/" . $i;

    // 2. Ambil HTML
    $html_content = getHTML($url);

    if ($html_content === null) {
        // echo "Halaman tidak ditemukan (HTTP Error) atau timeout. Melewati ID $i.\n";
        continue; // Lanjut ke iterasi berikutnya
    }

    // 3. Parsing HTML
    $html = str_get_html($html_content);
    if (!$html) {
        // echo "Gagal mem-parsing HTML. Melewati ID $i.\n";
        continue;
    }

    // Inisialisasi array data untuk ID saat ini
    $data = [
        'id' => $i // Gunakan $i langsung sebagai ID
    ];

    // A. Ambil Judul
    $title_element = $html->find('h4', 0); 
    $data['judul'] = $title_element ? trim($title_element->plaintext) : '';

    // Jika judul kosong, kemungkinan besar ini adalah halaman 404 atau tidak valid
    if (empty($data['judul'])) {
        // echo "Judul tidak ditemukan, kemungkinan halaman tidak valid. Melewati ID $i.\n";
        $html->clear();
        continue;
    }

    // B. Ambil Metadata Tabel
    foreach($html->find('table tr') as $row) {
        $cols = $row->find('td');
        if (count($cols) >= 2) {
            $label = trim(str_replace(':', '', $cols[0]->plaintext));
            $value = trim(end($cols)->plaintext);

            if (!empty($label)) {
                $key = strtolower(preg_replace('/[^a-zA-Z0-9]/', '_', $label));
                $key = preg_replace('/_+/', '_', $key);
                $data[$key] = $value;
            }
        }
    }

    // C. Ambil Link Download
    $download_link = "";
    foreach($html->find('a') as $element) {
        if (strpos(strtolower($element->plaintext), 'unduh') !== false || strpos(strtolower($element->plaintext), 'download') !== false) {
            $download_link = $element->href;
            break; 
        }
    }
    if ($download_link && strpos($download_link, 'http') === false) {
        $download_link = "https://jdihn.go.id" . $download_link;
    }
    $data['link_download'] = $download_link;

    // Bersihkan memori DOM
    $html->clear();

    // Simpan data ke CSV (hanya baris data, bukan header)
    fputcsv($fp, $data);
}

// --------------------------------------------------------------------------
// SELESAI
// --------------------------------------------------------------------------
// Tutup file setelah loop selesai
fclose($fp);

echo "\n--------------------------------------------------\n";
echo "Proses selesai! Semua data telah disimpan ke file: $filename\n";
echo "--------------------------------------------------\n";
Enter fullscreen mode Exit fullscreen mode

hasil berupa csv:

id,judul,jenis_peraturan,nomor_peraturan,tahun_peraturan,tentang,tempat_penetapan,tanggal_penetapan,tanggal_pengundangan,status,bahasa,lokasi,sumber,bidang_hukum,sub_bidang_hukum,link_download
327,"TIM ASISTENSI E-BUDGETING RENCANA KERJA SATUAN KERJA PERANGKAT DAERAH TINGKAT KOTA BANDUNG TAHUN ANGGARAN 2017","JDIH Pemerintah Kota Bandung","KEPUTUSAN WALIKOTA",050/Kep.697-Bappeda/2016,2016,,KEPWAL,,-,2023-09-04,-,-,-,,,20190806061944531547339.pdf,20190806061944531547339.pdf,,,https://jdih.bandung.go.id/home/produk-hukum/peraturan-perundang-undangan-daerah/3382</button>,https://jdihn.go.id/unduhan
329,"PERUBAHAN ATAS PERATURAN WALIKOTA BANDUNG NOMOR 548 TAHUN 2016 TENTANG TATA CARA PENERAPAN SANKSI ADMINISTRATIF DALAM PENYELENGGARAAN BANGUNAN GEDUNG","JDIH Pemerintah Kota Bandung","PERATURAN WALIKOTA",1032,2016,,PERWAL,,-,2023-09-04,-,-,-,,,"Perwal 1032 Tahun  2016 SANKSI OTENTIFIKASI.pdf","Perwal 1032 Tahun  2016 SANKSI OTENTIFIKASI.pdf",,,https://jdih.bandung.go.id/home/produk-hukum/peraturan-perundang-undangan-daerah/3383</button>,https://jdihn.go.id/unduhan
335,KEPEMUDAAN,"JDIH Pemerintah Kota Bandung","PERATURAN DAERAH KOTA",1,2016,,PERDA,,-,2023-09-04,-,-,-,,,"Perda No. 1 tahun 2016 ttg. Kepemudaan.pdf","Perda No. 1 tahun 2016 ttg. Kepemudaan.pdf",,,https://jdih.bandung.go.id/home/produk-hukum/peraturan-perundang-undangan-daerah/3384</button>,https://jdihn.go.id/unduhan
348,"PERUBAHAN KEDUA ATAS PERATURAN WALIKOTA BANDUNG NOMOR 495 TAHUN 2015 TENTANG STANDAR OPERASIONAL PROSEDUR PELAYANAN PERIZINAN TERPADU","JDIH Pemerintah Kota Bandung","PERATURAN WALIKOTA",265,2016,,PERWAL,,-,2023-09-04,-,-,-,,,20201201003442704186689.pdf,20201201003442704186689.pdf,,,https://jdih.bandung.go.id/home/produk-hukum/peraturan-perundang-undangan-daerah/3260</button>,https://jdihn.go.id/unduhan
363,"Tim Ahli Bangunan Gedung Kota Bandung Masa Bakti 2015-2016","JDIH Pemerintah Kota Bandung","KEPUTUSAN WALIKOTA",640/Kep.977-DisTarCip/2015,2015,,KEPWAL,,-,2023-09-04,-,-,-,,,"SLN SK 640_Kep.977-DisTarCip_2015 perub TABG 2015-2016.pdf","SLN SK 640_Kep.977-DisTarCip_2015 perub TABG 2015-2016.pdf",,,https://jdih.bandung.go.id/home/produk-hukum/peraturan-perundang-undangan-daerah/3248</button>,https://jdihn.go.id/unduhan
364,"PERUBAHAN ATAS PERATURAN DAERAH KOTA BANDUNG NOMOR 24 TAHUN 2012 TENTANG PENYELENGGARAAN DAN PENANGANAN KESEJAHTERAAN SOSIAL","JDIH Pemerintah Kota Bandung","PERATURAN DAERAH KOTA",5,2015,,PERDA,,-,2023-09-04,-,-,-,,,"Perda No. 5 Tahun 2015  kesos.pdf","Perda No. 5 Tahun 2015  kesos.pdf",,,https://jdih.bandung.go.id/home/produk-hukum/peraturan-perundang-undangan-daerah/3270</button>,https://jdihn.go.id/unduhan
368,"Pembentukan Forum Komunikasi Anak Kota Bandung Periode Tahun 2015 2017","JDIH Pemerintah Kota Bandung","KEPUTUSAN WALIKOTA","464/Kep.981 - BPPKB/2015",2015,,KEPWAL,,-,2023-09-04,-,-,-,,,201907220300001983419264.pdf,201907220300001983419264.pdf,,,https://jdih.bandung.go.id/home/produk-hukum/peraturan-perundang-undangan-daerah/3249</button>,https://jdihn.go.id/unduhan
448,"Peraturan Daerah Kotamadya Daerah Tingkat II Salatiga Nomor 18 Tahun 1977 tentang Mengubah untuk Ketiga kalinya Peraturan Daerah tentang Peraturan Daerahgangan dan Penjualan Susu","JDIH Pemerintah Kota Salatiga","PERATURAN DAERAH KOTA",18,1977,-,PERDA,,-,1978-02-27,-,Berlaku,-,"LD Kotamadya Daerah Tingkat II Salatiga  1977 (18)",Indonesia,1977pd3332018.pdf,,,,https://jdih.salatiga.go.id/dokumen/view?id=1363</button>,https://jdihn.go.id/unduhan
463,"Peraturan Daerah Kotamadya Daerah Tingkat II Salatiga Nomor 2 Tahun 1974 tentang Pasar yang Dikuasai oleh Pemerintah Daerah Kotamadya Salatiga","JDIH Pemerintah Kota Salatiga","PERATURAN DAERAH KOTA",2,1974,-,PERDA,,-,1978-11-28,-,Berlaku,-,"LD Kotamadya Daerah Tingkat II Salatiga  1974 (2)",Indonesia,1974pd3332002.pdf,,,,https://jdih.salatiga.go.id/dokumen/view?id=1351</button>,https://jdihn.go.id/unduhan
464,"Peraturan Daerah Kotamadya Daerah Tingkat II Salatiga Nomor 5 Tahun 1980 tentang Penetapan Sisa Perhitungan Anggaran Pendapatan dan Belanja Daerah Kotamadya Daerah Tingkat II Salatiga Tahun Anggaran 1976/1977","JDIH Pemerintah Kota Salatiga","PERATURAN DAERAH KOTA",5,1980,-,PERDA,,-,1980-06-04,-,Berlaku,-,"LD Kotamadya Daerah Tingkat II Salatiga  1980 (5)",Indonesia,1980pd3332005.pdf,,,,https://jdih.salatiga.go.id/dokumen/view?id=1373</button>,https://jdihn.go.id/unduhan
468,"Peraturan Daerah Kotamadya Daerah Tingkat II Salatiga Nomor 1 Tahun 1975 tentang Mengubah Untuk Ketiga Kali Peraturan Daerah tentang Pajak kendaraan","JDIH Pemerintah Kota Salatiga","PERATURAN DAERAH KOTA",1,1975,-,PERDA,,-,1976-11-01,-,Berlaku,-,"LD Kotamadya Daerah Tingkat II Salatiga  1975 (1)",Indonesia,1975pd3332001.pdf,,,,https://jdih.salatiga.go.id/dokumen/view?id=1352</button>,https://jdihn.go.id/unduhan

Enter fullscreen mode Exit fullscreen mode

Top comments (0)