andriajah Tue Jun 2023 10 months ago

Scraper Situs Web menggunakan Laravel dan Goutte

Jadi, Anda ingin mempelajari cara memuaskan hasrat data tersebut, dan ingin melakukan semuanya dalam satu perintah? Maka Anda telah datang ke tempat yang tepat!

Pengikisan situs web (dalam istilah umum) adalah ekstraksi data dari situs web mana pun. Untuk contoh ini, kami akan menggunakan Funko POP! situs web Vinyl (termasuk semua koleksi seperti Animasi, Disney, dan Game) dan mengorek informasi produk, tetapi membuat skrip untuk mengorek bagian mana pun dari situs web Funko untuk data produk akan menjadi tugas yang mudah.

Menyiapkan

Untuk memulai, saya akan menganggap Anda memiliki proyek 5.4 yang berguna dan sudah disiapkan, tetapi jika tidak, Anda dapat mengikuti prosedur penginstalan .

Langkah selanjutnya adalah menginstal paket Goutte dengan menjalankan composer require weidner/goutte. Kemudian kita perlu menambahkan penyedia dan alias ke file config/app.php.

// Penyedia
Weidner\Goutte\GoutteServiceProvider::kelas,

// Alias
'Goutte' => Weidner\Goutte\GoutteFacade::class,

Pertama jalankan perintah php artisan make:command ScrapeFunko, lalu buka file ScrapeFunko di dalam direktori App/Commands . Kami sekarang akan menulis kode untuk mulai menggores POP! Koleksi vinil untuk data produk.

Selanjutnya kita akan memperbarui nilai variabel signature, ini akan menjadi perintah yang kita jalankan di terminal melalui perintah php artisan scrape:funko

protected $signature = 'scrape:funko';
protected $description = 'Funko POP! Pengikis Vinil';

Kemudian kita perlu membuat variabel yang berisi larik slug koleksi yang dikumpulkan dari URL setiap halaman koleksi (https://funko.com/collections/pop-vinyl) melalui variabel berikut:

protected $collections = [
    'animasi',
    'disney',
    'permainan',
    'pahlawan',
    'keajaiban',
    'monster-tinggi',
    'film',
    'hewan peliharaan',
    'batu',
    'olahraga',
    'perang bintang',
    'televisi',
    'lemari besi',
    'suara',
    'ufc',
];

Kami juga akan memperbarui fungsi pegangan menjadi berikut:

pegangan fungsi publik()
{
    foreach ($koleksi sebagai $koleksi) {
        $this->scrape($koleksi);
    }
}

 

Membangun Fungsi Scrape

Sebelum kita mulai dengan fungsi scrape kita perlu membuat variabel lingkungan baru dengan membuka file .env kita dan menambahkan baris berikut:

FUNKO_POP_URL=https://funko.com/collections/pop-vinyl

Berikutnya kita akan menulis fungsi scrape. Di bawah ini adalah kode yang akan kita akhiri dengan diikuti oleh deskripsi tentang fungsi kode tersebut.

/**
 * Untuk mengorek data untuk koleksi yang ditentukan.
 *
 * @param string $koleksi
 * @kembalikan boolean
 */
scrape fungsi statis publik($collection)
{
    $crawler = Goutte::request('GET', env('FUNKO_POP_URL').'/'.$collection);

    $halaman = ($crawler->filter('footer .pagination li')->count() > 0)
        ? $crawler->filter('footer .pagination li:nth-last-child(2)')->text()
        : 0
    ;

    untuk ($i = 0; $i < $halaman + 1; $i++) {
        jika ($i != 0) {
            $crawler = Goutte::request('GET', env('FUNKO_POP_URL').'/'.$collection.'?page='.$i);
        }

        $crawler->filter('.product-item')->each(function ($node) {
            $sku = meledak('#', $simpul->filter('.produk-sku')->teks())[1];
            $title = trim($node->filter('.title a')->text());

            print_r($sku.', '.$judul);
        });
    }

    kembali benar;
}

Untuk memulai, kami mengirimkan permintaan GET ke Funko POP! URL vinil diikuti oleh slug koleksi saat ini sedang dikikis. Ini pada dasarnya akan mengembalikan data situs web seolah-olah Anda mengunjungi URL di browser Anda. Langkah selanjutnya adalah menghitung halaman (karena koleksi dapat memiliki banyak halaman) dan kemudian mulai mengulanginya. Kami kemudian melanjutkan untuk memeriksa apakah halaman saat ini diperiksa adalah yang pertama atau tidak (jika tidak, kami akan mendapatkan data halaman untuk halaman yang diberi nomor halaman). Langkah selanjutnya adalah mengulang semua wadah .product-item pada halaman, kemudian kita akan dapat mengakses data dalam setiap node ini dengan memfilter .product-sku< /code> untuk mendapatkan SKU produk dan mendapatkan teks tautan sebagai nama produk.

Dan selesai! Anda sekarang memiliki pengikis situs web dasar. Selain itu, Anda dapat mengintegrasikan Amazon Web Services (AWS) S3 serta menghubungkan database untuk menyimpan koleksi dan data produk. Lihat layanan spesialis kami untuk detail lebih lanjut.

Anda bisa mendapatkan kode sumber lengkap untuk perintah tersebut , dan memeriksa repositori dengan S3 dan integrasi basis data .