Dengan Laravel, kamu bisa melakukan scraping pada sebuah situs web dalam tiga langkah: menginstal sebuah paket seperti Symfony DomCrawler melalui Composer, membuat pesanan Artisan, lalu pilih elemen-elemen tersebut HTML dengan pemilih CSS.
Panduan web scraping ini menunjukkan kepada Anda cara melakukannya secara praktis, dengan menggunakan kode PHP siap pakai.

Prasyarat untuk melakukan scraping dengan Laravel
Laravel adalah Kerangka kerja PHP dirancang untuk aplikasi web modern. Ekosistemnya yang kaya menjadikannya landasan yang ideal untuk menyusun proyek scraping yang rapi dan mudah dipelihara.
Sebelum memulai, pastikan kamu sudah memiliki lingkungan yang tepat:
- Composer, pengelola dependensi untuk menginstal paket-paket.
- Versi terbaru dari PHP kompatibel dengan versi Laravel yang kamu gunakan.
- Laravel diinstal melalui
ketik create-project laravel/laravel mon-scraper.
Dari segi keterampilan, pengetahuan dasar saja sudah cukup untuk memulai:
- Memahami dasar-dasar PHP dan struktur sebuah aplikasi Laravel (pengawas, jalan raya, arsitektur MVC).
- Memahami HTML dan Pemilih CSS untuk menargetkan elemen-elemen pada suatu halaman secara tepat.
- Mengetahui cara menggunakannya Composer melalui baris perintah untuk menambahkan paket ke proyek.
Untuk proses crawling itu sendiri, berikut ini adalah alat pengikis yang paling berguna:
- Symfony DomCrawler + HttpClient : pasangan andalan saat ini. Ia mengunduh sebuah halaman dan menjelajahi kode HTML menggunakan metode
filter()dari DomCrawler. Untuk menginisialisasi klien, kamu menggunakanHttpClient::create()bersama dengan opsi yang diinginkan. - HTTP Client dari Laravel : berdasarkan Guzzle, ia mengambil konten sederhana dengan
Http::get()dan menangani panggilan ke sebuah API. - Puppeteer / Headless Chrome : sebuah peramban tanpa antarmuka, yang sangat diperlukan untuk melakukan scraping pada halaman-halaman yang memuat kontennya dalam JavaScript atau melalui Ajax.
Tutorial untuk membuat scraper pertama Anda dengan Laravel
Ikuti langkah-langkah berikut untuk membuat sebuah scraper yang berfungsi dengan Laravel. Kamu akan menginstal paket scraping, lalu membuat perintah Artisan, lalu menyaring data menggunakan selektor CSS.
Langkah 1: Instalasi dan konfigurasi
Buat proyek baru Laravel dengan Composer, lalu tambahkan Goutte, integrasi praktis untuk scraping:
# 1) Membuat proyek Laravel baru
compose create-project laravel/laravel scraper-demo
cd scraper-demo
# 2) Menambahkan Goutte (Integrasi Laravel)
composer membutuhkan weidner/goutte
Paket-paket weidner/goutte dan fabpot/goutte kini secara resmi tidak digunakan lagi. Meskipun masih berfungsi, namun untuk proyek baru, disarankan untuk menggantinya di bagian Symfony adalah symfony/browser-kit, ditambah dengan symfony/http-client dan symfony/dom-crawler. Kode di bawah ini tetap berlaku jika kamu menggunakan weidner/goutte, yang secara sederhana merangkum Goutte untuk Laravel.
Langkah 2: Membuat pesanan Artisan
Membuat perintah yang akan berisi logika scraping-mu dengan php artisan :
php artisan make:command ScrapeData
File dibuat di sini : app/Console/Commands/ScrapeData.php. Di sinilah kelas bahwa kamu akan menulis permintaan HTTP dan mengekstrak data. Kelas ScrapeData meluas Perintah, dan metode fungsi publik handle() berisi seluruh logika pengambilan data.
Langkah 3: Tulis kode pengikis
Dalam perintah yang dihasilkan, kamu akan menggabungkan tiga elemen penting:
- A Permintaan HTTP untuk mengambil konten HTML dari halaman tersebut.
- Dari Pemilih CSS yang telah berlalu ke DomCrawler untuk menyaring data melalui
filter(). - A lingkaran untuk menelusuri item dan menampilkan hasilnya.
Berikut ini adalah contoh kode lengkap untuk melakukan scraping pada judul artikel dari sebuah blog:
info('Scraping: {$url}");
// 1) Permintaan HTTP untuk mengambil HTML
$crawler = Goutte::request("GET', $url);
// 2) Penggunaan selektor CSS dengan DomCrawler
$nodes = $crawler->filter('h2 a');
// 3) Mengulangi elemen dan menampilkan hasilnya
$nodes->each(function (Crawler $node, $i) {
$title = $node->text();
$link = $node->attr('href');
$this->line(($i+1) . '. " . $title . " - " . $link);
});
return self::SUCCESS;
}
}
Ini, DomCrawler melakukan seluruh proses analisis HTML. Metode filter('h2 a') mengambil setiap tautan yang terdapat dalam sebuah judul, lalu each() putar bagian atasnya untuk mengeluarkan teks dan atribut href. Selanjutnya, jalankan scraper dari terminalmu dengan perintah php artisan scrape:data dan kamu akan melihat judul-judulnya muncul satu per satu. Kamu juga bisa menjalankan php artisan serve untuk menguji aplikasi Anda secara lokal sebelum melakukan deployment.
Praktik terbaik untuk web scraping dengan Laravel
Untuk melakukan scraping dengan benar menggunakan Laravel, beberapa kebiasaan kecil dapat membuat perbedaan besar. Berikut adalah praktik terbaik yang perlu diterapkan, baik saat kamu mengelola sebuah bot pengikis web atau pesanan satu kali.
1. Pengelolaan tugas dan antrian
Proses scraping dapat memakan waktu beberapa detik per halaman. Bayangkan jika harus melakukan scraping 1.000 halaman dari sebuah situs: aplikasi Anda akan diblokir dan tidak dapat digunakan untuk waktu yang cukup lama. Solusinya dapat diringkas dalam dua kata: pekerjaan dan antrean dari Laravel.
- A pekerjaan, ini adalah tugas yang ingin kamu jalankan di latar belakang.
- A ekor (antrian), yaitu tempat di mana tugas-tugas tersebut disimpan untuk dijalankan satu per satu, tanpa mengganggu proses lainnya.
Berikut ini cara mengintegrasikan logika scraping ke dalam sebuah tugas:
// app/Jobs/ScrapePageJob.php
<?php
namespace App\Jobs;
use Goutte\Client; // Ou Guzzle/Http, selon ta stack
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
class ScrapePageJob implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
protected string $url;
public function __construct(string $url)
{
$this->url = $url;
}
public function handle(): void
{
$client = new Client();
$crawler = $client->request('GET', $this->url);
// Contoh sederhana: ekstrak semua <h1>
$titles = $crawler->filter('h1')->each(function ($node) {
kembalikan $node->text();
});
// Ketekunan / log / peristiwa...
foreach ($titles as $title) {
\Log::info("[Scraping] {$this->url} - H1: {$title}");
}
}
}
// app/Http/Controllers/ScraperController.php
onQueue('scraping'); // jika ingin antrian khusus
}
return response()->json(['status' => 'Proses pengikisan sedang berjalan di latar belakang']);
}
}
Untuk mengaktifkan pengontrol ini, nyatakan sebuah jalan di berkasmu routes/web.php Di mana routes/api.php, misalnya Route::get('/scrape', [ScraperController::class, 'start']). Kamu juga bisa membuat pengontrol khusus dengan php artisan make:controller ScraperController.
Laravel menyediakan beberapa sistem untuk mengelola antrian ini. Dua di antaranya yang paling sering digunakan adalah:
- File dengan basis data : Tugas-tugas tersebut disimpan sebagai baris dalam sebuah tabel SQL, kemudian dijalankan satu per satu oleh seorang pekerja.
- Ikutlah bersama Redis : Tugas-tugas tersebut disimpan dalam memori dalam antrian yang sangat cepat, sehingga sangat cocok untuk volume tugas yang besar.
2. Otomatisasi dengan penjadwal tugas Laravel
Laravel mengintegrasikan sebuah perencana tugas (scheduler) yang memungkinkanmu mengotomatiskan scraper-mu tanpa perlu repot. Dengan demikian, kamu dapat menjadwalkan eksekusi suatu perintah secara berkala, misalnya setiap jam.
Berikut cara mengonfigurasinya di app/Console/Kernel.php :
command('scraper:run')->hourly();
// Contoh yang berguna:
// $schedule->command('scraper:run')->everyFifteenMinutes();
// $schedule->command('scraper:run')->dailyAt('02:30')->timezone('Indian/Antananarivo');
}
/**
* Penyimpanan perintah.
*/
protected function commands(): void
{
$this->load(__DIR__ . '/Commands');
}
}
3. Melewati perlindungan anti-gores
Banyak situs web yang menerapkan langkah-langkah perlindungan terhadap scraper. Untuk menghindari pemblokiran:
- Mengubah User-Agent : mensimulasikan peramban sungguhan, bukan header default dari klien HTTP.
- Mengelola tenggat waktu : menyisipkan jeda (sleep, throttle) di antara permintaan agar tidak membebani server target.
- Menggunakan proxy : sebarkan permintaan ke beberapa alamat IP.
4. Mematuhi robots.txt dan kerangka hukum
Mengelabui sistem perlindungan bukan berarti bisa bertindak seenaknya. Praktik scraping tetap diatur, dan mengabaikannya bisa membuatmu harus membayar mahal.
- Patuhi berkas robots.txt : hal ini menunjukkan halaman-halaman yang diizinkan atau dilarang untuk dijelajahi oleh mesin pencari. Ini adalah aturan sopan santun pertama yang harus dipatuhi.
- Periksa ketentuan penggunaan : Sebuah situs web dapat melarang praktik scraping melalui Ketentuan Penggunaan (KPU) yang dimilikinya.
- Perhatikan GDPR : jika kamu mengumpulkan data pribadi, Anda harus mematuhi peraturan Uni Eropa mengenai pengumpulan dan pemrosesan data tersebut.
Apa saja alternatif lain dari web scraping dengan Laravel?
Laravel tetap praktis untuk mengintegrasikan scraping ke dalam sebuah aplikasi PHP yang sudah ada. Namun, tergantung pada proyekmu, terkadang solusi lain lebih sesuai. Berikut adalah dua alternatif utama, beserta kelebihan dan keterbatasannya.
Web scraping dengan Python
Python adalah bahasa pemrograman yang paling banyak digunakan untuk scraping. Bahasa ini didukung oleh pustaka-pustaka yang sudah matang seperti Scrapy dan BeautifulSoup.
- Manfaat : ekosistem yang sangat kaya, pengelolaan crawling skala besar secara native, komunitas yang sangat besar.
- Kekurangan : kamu harus keluar dari ekosistem Laravel. Hal ini kurang praktis jika situs dan API-mu sudah berjalan di PHP.
Secara praktis, kamu sebaiknya memilih Python jika scraping merupakan inti dari proyek tersebut, bukan sekadar salah satu komponen dari aplikasi kamu.
Alat bantu bebas kode
Semakin banyak alat yang memungkinkan kita melakukan scraping tanpa pengkodean, terkadang dengan bantuan’IA. Yang paling terkenal adalah Data Cerah, Octoparse dan Apify.
- Manfaat : konfigurasi visual, pengelolaan halaman dengan JavaScript dan penanganan kesalahan yang terintegrasi, tanpa perlu menulis satu baris kode pun.
- Kekurangan : langganan berbayar, kontrol yang kurang presisi dibandingkan scraper buatan sendiri menggunakan Laravel.

FAQ
Bagaimana cara mengikis situs web yang diproteksi login dengan Laravel?
Prinsipnya sederhana: kamu mensimulasikan koneksi, lalu menggunakan kembali sesi tersebut untuk mengakses halaman-halaman yang dilindungi. Secara praktis, kamu harus:
- Mensimulasikan koneksi dengan permintaan POST yang mengirimkan alamat email dan kata sandi ke formulir.
- Menyimpan cookie sesi agar permintaan berikutnya tetap terotentikasi.
Dengan HttpBrowser dari Symfony, kamu bisa menjalankan kedua langkah tersebut secara berurutan dengan sangat rapi. Ia membuat instance klien melalui HttpClient::create(), lalu mengelola cookie secara otomatis di antara setiap permintaan:
use Symfony\Component\BrowserKit\HttpBrowser;
use Symfony\Component\HttpClient\HttpClient;
$browser = new HttpBrowser(HttpClient::create());
$crawler = $browser->request('GET', 'https://exemple.com/login');
$form = $crawler->selectButton('Se connecter')->form();
$browser->submit($form, [
'email' => 'ton@email.com',
'password' => 'ton_mot_de_passe',
]);
// Les cookies de session sont gardés automatiquement
$page = $browser->request('GET', 'https://exemple.com/compte');
echo $page->filter('h1')->text();
Harap diperhatikan: bagian HttpBrowser mengelola cookie secara otomatis di antara dua permintaan. Jadi, kamu tidak perlu menyimpannya secara manual.
Bagaimana cara mengelola pagination ketika melakukan web scraping dengan Laravel?
Untuk menelusuri beberapa halaman sekaligus, caranya adalah dengan mencari tautan “halaman berikutnya” yang ditandai dengan sebuah Pemilih CSS, lalu mengulanginya selama hal itu masih ada. Inilah logikanya:
- Mengikis halaman pertama dan mengekstrak data yang berguna.
- Mendeteksi tautan “berikutnya” melalui selektor CSS.
- Menutup sampai tidak ada lagi halaman berikutnya.
$url = 'https://exemple.com/blog?page=1';
while ($url) {
$crawler = $browser->request('GET', $url);
$crawler->filter('.article-title')->each(function ($node) {
echo $node->text() . PHP_EOL;
});
// Récupère le lien "page suivante" s'il existe
$next = $crawler->filter('a.next');
$url = $next->count() ? $next->attr('href') : null;
}
Perulangan ini akan berhenti dengan sendirinya begitu pemilih a.next tidak menampilkan apa pun lagi.
Bagaimana cara mengekspor data yang telah dikumpulkan (ke CSV, Excel, atau JSON)?
Setelah data kamu berhasil diambil, kamu dapat mengekspornya dalam berbagai format menggunakan Laravel:
fputcsv()untuk membuat sebuah berkas CSV asli.- Toko Buku
Maatwebsite\Exceluntuk membuat sebuah berkas Excel. - Fungsi asli
json_encode()untuk ekspor JSON, berguna jika kamu kemudian mempublikasikan datamu melalui API.
Bagaimana Anda menangani kesalahan dan pengecualian selama pengikisan?
Sebuah situs web dapat menampilkan pesan kesalahan, mengubah struktur HTML-nya, atau memutuskan koneksi. Untuk membuat scraper yang andal, kamu harus mengantisipasi situasi-situasi tersebut:
- Mengemas setiap permintaan dalam
try/catch. - Periksa kode HTTP (404, 429, 500…) dan mencatat kesalahan tersebut atau mencoba kembali setelah jeda tertentu.
try {
$crawler = $browser->request('GET', $url);
$status = $browser->getResponse()->getStatusCode();
if ($status !== 200) {
\Log::warning("Réponse inattendue: $status sur $url");
}
} catch (\Exception $e) {
\Log::error('Scraping échoué: ' . $e->getMessage());
}
Apakah web scraping legal atau ilegal?
Itu legalitas web scraping Tergantung pada situs yang menjadi sasaran dan cara kamu menggunakan data tersebut. Berikut tiga hal yang perlu diingat:
- Hak sui generis atas basis data yang Direktif Uni Eropa 96/9/EC melindungi isi basis data. Mengunduh sebagian besar konten dari sebuah situs web mungkin dilarang.
- Syarat dan ketentuan penggunaan : putusan Ryanair melawan PR Aviation (Mahkamah Kehakiman Uni Eropa, 2015) menegaskan bahwa sebuah situs web dapat melarang praktik scraping dalam Ketentuan Penggunaan (KPU)-nya, meskipun tidak dilindungi oleh hak cipta.
- RGPD : begitu kamu mengumpulkan data pribadi (email, nama, profil), kamu tunduk pada peraturan Uni Eropa. Harap berhati-hati sepenuhnya.
Dalam praktiknya, selalu patuhi berkas tersebut robots.txt, batasi frekuensi permintaanmu dan hindari pengumpulan data pribadi tanpa dasar hukum. Ada pertanyaan atau kasus khusus? Sampaikan di kolom komentar.





