Bagaimana cara menggunakan Laravel untuk web scraping?

Penulis :

Bereaksi :

Komentar

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.

Antarmuka kode Laravel dengan PHP untuk proyek web scraping
Laravel memanfaatkan PHP untuk menyediakan struktur yang jelas dan alat-alat yang memudahkan proses web scraping. ©Christina untuk Alucare.fr

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 menggunakan HttpClient::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-&gt;request('GET', $this-&gt;url);

        // Contoh sederhana: ekstrak semua <h1>
        $titles = $crawler-&gt;filter('h1')-&gt;each(function ($node) {
            kembalikan $node-&gt;text();
        });

        // Ketekunan / log / peristiwa...
        foreach ($titles as $title) {
            \Log::info("[Scraping] {$this-&gt;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.

Antarmuka Bright Data yang menampilkan proses pengumpulan data web tanpa perlu menulis kode.
Bright Data tetap menjadi alternatif yang andal jika kamu ingin melakukan scraping tanpa perlu mengelola kode. ©Christina untuk Alucare.fr

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:

  1. Mensimulasikan koneksi dengan permintaan POST yang mengirimkan alamat email dan kata sandi ke formulir.
  2. 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:

  1. Mengikis halaman pertama dan mengekstrak data yang berguna.
  2. Mendeteksi tautan “berikutnya” melalui selektor CSS.
  3. 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\Excel untuk 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:

  1. Mengemas setiap permintaan dalam try/catch.
  2. 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.

👍Pendapat Anda
Artikel ini informatif
Artikel ini objektif
Artikel ini menjawab pertanyaan saya
Kontennya selalu diperbarui
🔍 Menemukan kesalahan? Beritahu kami di mana!

Suka? Bagikan!

Konten ini aslinya adalah di Perancis (Lihat editor tepat di bawah). Buku ini telah diterjemahkan dan dikoreksi dalam berbagai bahasa menggunakan Deepl dan/atau Google Translate API untuk menawarkan bantuan di sebanyak mungkin negara. Penerjemahan ini menghabiskan biaya beberapa ribu euro per bulan. Jika terjemahan ini tidak 100 % sempurna, tinggalkan komentar agar kami dapat memperbaikinya. Jika Anda tertarik untuk mengoreksi dan meningkatkan kualitas artikel yang diterjemahkan, silakan kirim email kepada kami menggunakan formulir kontak!
Kami menghargai umpan balik Anda untuk meningkatkan konten kami. Jika Anda ingin memberikan saran perbaikan, silakan gunakan formulir kontak kami atau tinggalkan komentar di bawah ini. Komentar Anda selalu membantu kami meningkatkan kualitas situs web kami Alucare.fr


Alucare adalah media independen. Dukung kami dengan menambahkan kami ke favorit Google News Anda:

Kirimkan komentar di forum diskusi