Panduan lengkap untuk melakukan web scraping dengan PHP

Penulis :

Bereaksi :

Komentar

PHP tidak hanya berguna untuk membuat situs web dinamis. Dengan pustaka seperti Guzzle dan Goutte, kamu bisa membuat sebuah scraper yang berfungsi dan secara otomatis mengekstrak data dari halaman web mana pun.

Perusahaan-perusahaan menggunakannya untuk memantau harga, menganalisis media sosial, atau mengumpulkan informasi tentang pesaing mereka.

Arsitektur web scraper PHP yang menggunakan Guzzle untuk permintaan dan Goutte untuk ekstraksi data
Ilustrasi arsitektur web scraper PHP dengan Guzzle dan Goutte. ©Christina untuk Alucare.fr

Prasyarat untuk melakukan scraping dengan PHP

itu pengikisan web adalah proses mengekstrak data secara otomatis dari halaman web. Sebuah program menjelajahi HTML dari sebuah situs web, memilih informasi yang berguna, lalu menyimpannya ke dalam berkas atau basis data. Dalam PHP, hanya perlu beberapa pustaka untuk membuat scraper yang berfungsi, tetapi sebelum memulainya, pastikan kamu memenuhi persyaratan berikut:

  • Memiliki dasar-dasar pemrograman PHP, karena kamu akan menulis kode untuk mengendalikan proses ekstraksi.
  • Menguasai beberapa pengetahuan dasar tentang HTML dan CSS, untuk menentukan dengan tepat elemen-elemen yang akan diekstraksi dari halaman tersebut.
  • Mengetahui cara menggunakannya Panggil, alat yang mengelola dependensi PHP dan menginstal pustaka seperti Guzzle, Symfony DomCrawler atau Goutte.
  • Memiliki server web lokal untuk menjalankan programmu: XAMPP, WAMP Di mana MAMP sangat cocok untuk keperluan ini.
  • Menginstal sebuah editor kode untuk menulis dan mengatur skrip PHP-mu.

Setelah semua alat ini terkumpul, kamu siap untuk mengumpulkan dan menganalisis data yang kamu minati. Jika kamu mencari alat gratis Untuk memulai tanpa mengeluarkan uang, ada beberapa pilihan yang cocok untuk pemula.

Alat bantu apa saja yang penting untuk web scraping dengan PHP?

PHP saja tidak cukup untuk melakukan web scraping secara efektif. Yang diperlukan adalah perpustakaan yang dipasang melalui Composer yang membuat proses ekstraksi menjadi cepat dan andal. Berikut ini adalah alat-alat yang perlu Anda ketahui.

1. Guzzle: klien HTTP

Guzzle adalah perpustakaan yang paling sering digunakan untuk mengirim permintaan HTTP. Komponen inilah yang mengambil kode sumber suatu halaman web. Untuk menginstalnya, buka terminalmu, masuk ke folder proyekmu, lalu ketik:

komposer membutuhkan guzzlehttp / guzzle

Composer Unduh pustaka tersebut dan gunakan langsung dalam kode Anda. Anda dapat membaca dokumentasi resmi Guzzle untuk mempelajari lebih lanjut.

Berikut ini adalah contoh sederhana untuk mengambil konten dari sebuah URL :

request('GET', $url);

    // Ambil kode HTTP
    $statusCode = $response->getStatusCode();

    // Mengambil konten halaman
    $content = $response->getBody() -> getContents();

    echo "Kode HTTP : " . $statusCode . PHP_EOL;
    echo "Konten halaman:" . PHP_EOL;
    echo $content;

} catch (\Exception $e) {
    echo "Kesalahan: " . $e-> getMessage();
}

2. Symfony DomCrawler dan Goutte: ekstraksi data

Setelah kode HTML diperoleh, kode tersebut perlu dianalisis untuk mengekstrak data yang berguna. Ada dua pustaka yang sangat berguna untuk tujuan ini:

  • Symfony DomCrawler : fitur ini memungkinkan pengguna menavigasi dalam HTML menggunakan Pemilih CSS dan menargetkan elemen-elemen tertentu (judul, harga, tautan…).
  • Goutte : ini adalah wrapper untuk Guzzle dan DomCrawler yang sangat mempermudah proses scraping.

Harap dicatat: paket tersebut Goutte sekarang ini tidak lagi digunakan dan disimpan sejak tahun 2022. Untuk proyek baru, lebih baik Symfony BrowserKit dengan DomCrawler, Di mana Symfony Panther jika kamu harus mengelola konten yang dimuat melalui JavaScript. Kamu juga bisa melihat pendekatan dengan Laravel, yang menyediakan kerangka kerja terstruktur untuk jenis proyek ini.

Contoh dengan Symfony DomCrawler :

request('GET', 'https://exemple.com');

$html = $response->getBody() -> getContents();
$crawler = new Crawler($html);

// Seleksi berdasarkan kelas
$crawler->filter('.my-class')->each(function ($node) {
    echo $node->text() . PHP_EOL;
});

// Seleksi berdasarkan ID
$crawler->filter('#mon-id')->each(function ($node) {
    echo $node->text() . PHP_EOL;
});

// Seleksi berdasarkan tag
$crawler->filter('h1')->each(function ($node) {
    echo $node->text() . PHP_EOL;
});

Contoh dengan Goutte:

request('GET', 'https://exemple.com');

// Pemilihan berdasarkan kelas
$crawler->filter('.ma-class')->each(function ($node) {
    echo $node->text() . PHP_EOL;
});

// Seleksi berdasarkan ID
$crawler->filter('#mon-id')->each(function ($node) {
    echo $node->text() . PHP_EOL;
});

// Seleksi berdasarkan tag
$crawler->filter('p')->each(function ($node) {
    echo $node->text() . PHP_EOL;
});

3. Perpustakaan dan alat bantu lainnya

Untuk melangkah lebih jauh, ada berbagai alat lain yang dapat disesuaikan dengan kebutuhanmu, tergantung pada volume data yang akan dikumpulkan.

  • PHP-Scraper : sebuah pustaka yang memudahkan pengambilan informasi dengan menangani kerumitan HTML dan selektor. Paket aslinya bukanlah Goutte.
# Instalasi dengan Composer
composer require spekulatius/phpscraper
go('https://example.com');

echo "Judul halaman: " . $web->title;
  • Data Cerah : sebuah platform profesional untuk pengumpulan data berskala besar, dengan proxy terintegrasi untuk menghindari pemblokiran alamat IP.

Antarmuka platform Bright Data untuk web scraping dengan proxy terintegrasi
Bright Data: alat pengikis web terlengkap. Cristina untuk Alucare.fr
  • ScraperAPI : layanan pengambilan data web berbasis cloud, yang dapat diakses melalui sebuah API. Kamu cukup mengirimkan permintaan sederhana dengan mencantumkan URL yang akan di-scrape, dan layanan tersebut akan mengelola proxy-nya sendiri.

Bagaimana cara membuat scraper web sederhana di PHP?

Berikut ini cara membuat sebuah scraper fungsional dalam PHP dengan Goutte, langkah demi langkah: menginstal perpustakaan, mengambil kode HTML, mengekstrak data, lalu mengekspor.

Langkah 1: Menginstal dependensi

Gunakan Panggil untuk menginstal Goutte dengan perintah ini:

menulis membutuhkan fabpot/goutte

Langkah 2: Mengambil konten halaman

Lakukan sebuah Permintaan HTTP GET untuk mengambil konten HTML dari halaman tersebut. Berikut ini adalah kode dasarnya:

request('GET', $url);

// Mengambil HTML mentah jika diperlukan
$html = $crawler->html();
echo substr($html, 0, 500) . '...'; // pratinjau

Langkah 3: Ekstrak data

Setelah kode HTML diperoleh, kamu dapat menargetkan elemen-elemen tertentu dengan menggunakan sebuah Pemilih CSS (Di mana XPath). Berikut ini contohnya untuk mengumpulkan judul-judul dari sebuah halaman blog. Selektor item h2 menargetkan tag <h2> di dalam suar <article> :

<?php
require 'vendor/autoload.php';

use Goutte\Client;

$client = new Client();
$url = 'https://exemple.com/blog'; // Remplace par l'URL de ta page cible

// Faire une requête GET pour récupérer la page
$crawler = $client->request('GET', $url);

// Sélectionner les éléments <h2> dans <article> avec le sélecteur CSS
$titres = [];

$crawler->filter('article h2')->each(function ($node) use (&$titres) {
    // Récupérer le texte du titre
    $titres[] = trim($node->text());
});

// Afficher les titres extraits
print_r($titres);
?>

Fungsi kode ini:

  • Pemilih item h2 menargetkan teks dalam tag <h2>.
  • Metode text() mengambil teks dari setiap judul.
  • Setiap judul ditambahkan ke tabel 1TP65Judul, kemudian ditampilkan dengan print_r().

Selektor CSS juga berfungsi untuk mengekstrak atribut elemen HTML. Jika setiap judul merupakan tautan dalam tag <a>, kamu mengambil atribut href untuk mendapatkan URL artikel:

<?php
require 'vendor/autoload.php';

use Goutte\Client;

$client = new Client();
$url = 'https://exemple.com/blog'; // Remplace par l'URL de ta page cible

// Faire une requête GET pour récupérer la page
$crawler = $client->request('GET', $url);

// Sélectionner les liens dans les titres
$titres = [];

$crawler->filter('article h2 a')->each(function ($node) use (&$titres) {
    $titre = trim($node->text());
    $lien = $node->attr('href'); // Extraire l'attribut href

    // Ajouter le titre et l'URL au tableau
    $titres[] = [
        'title' => $titre,
        'url'   => $lien,
    ];
});

// Afficher les résultats
print_r($titres);
?>

Tabel 1TP65Judul maka, untuk setiap artikel, berisi baik judul dan tautan :

Array
(
    [0] => Array
        (
            [title] => Judul artikel 1
            [url] => /artikel1
        )

    [1] => Array
        (
            [title] => Judul Artikel 2
            [url] => /artikel2
        )
)

Setiap entri adalah array asosiatif dengan dua kunci: judul untuk judul dan url untuk alamat halaman. Kamu akan mendapatkan struktur yang rapi, siap untuk dianalisis atau disimpan.

Tahap 4: Menata dan menyimpan data

Setelah data diekstraksi ke dalam tabel $data, kamu bisa mengekspor dalam format yang terstruktur. Dua format yang paling berguna adalah JSON dan CSV.

itu JSON berguna untuk memberikan data ke API atau aplikasi web:

<?php
// Exporter les données en JSON
file_put_contents('export.json', json_encode($data, JSON_PRETTY_PRINT|JSON_UNESCAPED_UNICODE));

echo "Les données ont été exportées en JSON dans 'export.json'.";
?>

File export.json akan terlihat seperti ini:

[
    {
        "title": "Judul Pasal 1",
        "url": "/artikel1"
    },
    {
        "title": "Judul Pasal 2",
        "url": "/artikel2"
    }
]

Jika kamu lebih suka menggunakan tabel CSV, gunakan fputcsv untuk menulis setiap baris ke dalam sebuah berkas:

<?php
// Exporter les données en CSV
$fp = fopen('export.csv', 'w');

// Ajouter l'en-tête (titres des colonnes)
fputcsv($fp, ['title', 'url']);

// Ajouter chaque ligne de données
foreach ($data as $row) {
    fputcsv($fp, [$row['title'], $row['url']]);
}

// Fermer le fichier
fclose($fp);

echo "Les données ont été exportées en CSV dans 'export.csv'.";
?>

File export.csv akan terlihat seperti ini:

judul, url
Judul artikel 1, /artikel1
Judul artikel 2, /artikel2

Untuk volume data yang besar, ingatlah untuk menulis ke dalam berkas secara progresif daripada memuat semuanya ke dalam memori. Kamu juga bisa menyimpan hasilnya langsung ke dalam sebuah basis data, sehingga memudahkan analisis dan pembaruan informasi yang telah dikumpulkan.

Bagaimana cara mengatasi masalah web scraping yang umum terjadi pada PHP?

Web scraping dengan PHP tidak selalu berjalan sesuai rencana. Server yang tidak merespons, halaman yang tidak terstruktur dengan benar, pemblokiran berdasarkan alamat IP: masalah-masalah ini bisa muncul dengan cepat. Berikut ini cara mengatasi masalah yang paling umum agar program ekstraksi kamu lebih andal.

1. Mengelola kesalahan

  • Kesalahan koneksi

Terkadang, permintaan tersebut bahkan tidak sampai ke server. Kamu mungkin akan menemui "Tidak ada jaringan, "URL tidak valid Di mana "Server tidak dapat diakses. Dalam hal ini, siapkan sebuah blok try/catch agar skripmu tidak berhenti secara tiba-tiba.

Berikut ini adalah contoh konkret dengan Guzzle :

<?php
require 'vendor/autoload.php';

use GuzzleHttp\Client;
use GuzzleHttp\Exception\RequestException;

function make_request_with_guzzle() {
    $client = new Client();
    
    try {
        $response = $client->request('GET', 'https://example.com/api/data');
        
        if ($response->getStatusCode() === 200) {
            $body = $response->getBody();
            echo "Données reçues : " . $body;
        }
        
    } catch (RequestException $e) {
        if ($e->hasResponse()) {
            echo "Erreur de la requête : " . $e->getResponse()->getStatusCode();
        } else {
            echo "Erreur de connexion : " . $e->getMessage();
        }
    }
}

make_request_with_guzzle();
?>
  • Kode status HTTP

Bahkan ketika koneksi berfungsi, server mungkin merespons dengan pesan kesalahan: 404 = halaman tidak ditemukan, 500 = kesalahan internal server. Kamu bisa menguji kode yang dikirimkan dengan getStatusCode() :

<?php
require 'vendor/autoload.php';

use GuzzleHttp\Client;
use GuzzleHttp\Exception\RequestException;

function make_request_with_guzzle() {
    $client = new Client();
    
    try {
        $response = $client->request('GET', 'https://example.com/api/data');
        $status_code = $response->getStatusCode();
        
        if ($status_code === 200) {
            $body = $response->getBody();
            echo "Réponse réussie avec le code : " . $status_code . "
";
            echo "Données reçues : " . $body;
        } elseif ($status_code === 404) {
            echo "Erreur 404 : Page non trouvée
";
        } elseif ($status_code === 500) {
            echo "Erreur 500 : Erreur interne du serveur
";
        } else {
            echo "Code de statut : " . $status_code . "
";
        }
        
    } catch (RequestException $e) {
        if ($e->hasResponse()) {
            echo "Erreur HTTP : " . $e->getResponse()->getStatusCode() . "
";
        } else {
            echo "Erreur de connexion : " . $e->getMessage();
        }
    }
}

make_request_with_guzzle();
?>
  • Kesalahan penguraian

Parsing adalah’analisis HTML oleh scraper-mu. Jika halaman tersebut tidak terstruktur dengan baik, DomCrawler Di mana Goutte dapat mengalami kegagalan atau tidak mengembalikan apa pun. Selalu pastikan bahwa konten tersebut ada sebelum mencoba mengekstraknya, dengan kondisi seperti count() Di mana filter(), lalu kelilingi proses parsing dengan sebuah try/catch :

<?php
require 'vendor/autoload.php';

use Goutte\Client;
use Symfony\Component\DomCrawler\Crawler;

function scrape_website() {
    $client = new Client();
    
    try {
        $crawler = $client->request('GET', 'https://example.com');
        $elements = $crawler->filter('div.target-element');
        
        if ($elements->count() > 0) {
            $content = $elements->first()->text();
            echo "Contenu extrait : " . $content;
        } else {
            echo "L'élément cible n'a pas été trouvé sur la page.";
        }
        
    } catch (Exception $e) {
        echo "Erreur lors du parsing de la page : " . $e->getMessage();
    }
}

scrape_website();
?>

2. Mengatasi batasan dan perlindungan anti-scraping

Banyak situs web menerapkan langkah-langkah pengamanan untuk mempersulit web scraping. Berikut adalah hambatan-hambatan utama dan cara mengatasinya dengan benar:

  • Pemblokiran berdasarkan IP : jika kamu mengirim terlalu banyak permintaan, situs tersebut bisa memblokir alamat IP-mu. Solusinya adalah dengan menggunakan proksi bergilir, seperti yang ada di Bright Data, untuk mendistribusikan permintaanmu ke beberapa alamat.
  • Jarak antar permintaan : atur jadwal panggilanmu agar tidak terdeteksi dan tidak membebani server tujuan.
  • Konten dalam JavaScript secara default, PHP tidak dapat menjalankan JavaScript. Untuk melakukan scraping pada halaman yang isinya dimuat secara dinamis, kamu memerlukan sebuah browser tanpa antarmuka pengguna (browser tanpa antarmuka). Alat-alat seperti Puppeteer Di mana Selenium menampilkan halaman seperti browser sungguhan sebelum proses ekstraksi.
  • Berkas robots.txt : sebelum menjalankan scraper-mu, periksa berkas ini yang ada di direktori akar situs. Berkas ini menjelaskan apa saja yang diizinkan dan tidak diizinkan oleh situs tersebut bagi robot, sebuah langkah penting untuk bertindak secara bertanggung jawab.

FAQ

Apakah web scraping legal?

Itu legalitas web scraping tergantung pada data yang dikumpulkan dan cara kamu memanfaatkannya. Di Prancis, melakukan scraping terhadap data publik dan non-pribadi umumnya ditoleransi, tetapi hal itu bukan berarti otomatis mendapat lampu hijau.

Tiga batasan hukum dapat membuat pengambilan data menjadi ilegal, bahkan pada halaman publik:

  • itu RGPD : begitu menyangkut data pribadi, istilah «publik» tidak berarti bebas digunakan.
  • Itu Ketentuan Penggunaan Situs : jika kamu menggunakan akun untuk mengakses konten, berarti kamu telah menyetujui ketentuan yang sering kali melarang praktik scraping.
  • itu hak sui generis mengenai basis data: di Eropa, sebuah basis data mendapat perlindungan khusus.

Secara praktis, setiap kasus dievaluasi secara individual. Selalu periksa berkas tersebut robots.txt dan ketentuan penggunaan situs ini sebelum memulai programmu.

Apa perbedaan antara web scraping dan web crawling?

  • itu pengikisan web adalah untuk mengambil data yang akurat di sebuah situs web.
  • itu perayapan web adalah untuk menelusuri halaman-halaman untuk mengindeksnya, seperti yang dilakukan oleh robot mesin pencari.

Perbandingan antara web crawling yang menjelajahi beberapa situs web dan web scraping yang mengekstrak data tertentu dari suatu target
Web crawling secara otomatis menjelajahi dan menemukan berbagai situs web, sedangkan web scraping berfokus pada pengambilan data tertentu dari target spesifik. ©Christina untuk Alucare.fr

Bagaimana cara mengikis situs yang memerlukan autentikasi (login)?

Untuk melakukan scraping pada situs yang memerlukan login, Anda perlu mensimulasikan otentikasi. Dengan PHP, solusi yang paling umum tetaplah Guzzle. Kamu mengirimkan detail loginmu melalui sebuah permintaan POST, lalu biarkan sesi tetap terbuka untuk mengakses halaman-halaman yang dilindungi.

Bagaimana Anda mengelola scraping situs dengan halaman dinamis yang dimuat dalam AJAX?

PHP tidak dapat menjalankan kode JavaScript di sisi klien. Konten yang dimuat di AJAX sehingga tidak dapat dideteksi oleh scraper konvensional.

Salah satu solusi yang bisa dicoba adalah dengan menggunakan BrowserShot, sebuah pustaka yang didukung oleh browser sungguhan di latar belakang (Headless Chrome) untuk memuat halaman dan menjalankan JavaScript.

Kamu juga bisa mengintegrasikan PHP dengan alat-alat berbasis Node.jssebagai Puppeteer Di mana Selenium, untuk menghasilkan kode HTML yang ditampilkan dan kemudian mengambil data dari skripmu.

Apakah ada alternatif lain selain PHP untuk web scraping?

Ya, ada beberapa bahasa pemrograman yang sangat populer untuk scraping:

  • Python, dengan pustaka-pustaka yang mumpuni seperti BeautifulSoup dan Scrapy.
  • Node.js, sangat efektif untuk situs dinamis, melalui pustaka seperti Puppeteer Di mana Cheerio.

Web scraping dengan Python menggunakan pustaka seperti BeautifulSoup atau Scrapy untuk mengekstrak data dari halaman web secara otomatis
Web scraping dengan Python menjelajahi halaman web dan secara otomatis mengekstrak data yang diinginkan berkat pustaka khusus. ©Christina untuk Alucare.fr

Bagaimana cara membuat program scraper secara etis dan bertanggung jawab?

Untuk melakukan scraping secara bertanggung jawab, ada beberapa aturan sederhana yang harus dipatuhi:

  1. Periksa berkas robots.txt di situs ini untuk mengetahui aturan aksesnya.
  2. Batasi frekuensi permintaanmu agar server tidak kelebihan beban.
  3. Patuhi ketentuan penggunaan dari situs tersebut.
  4. Tidak mengumpulkan data pribadi tanpa izin.

Web scraping adalah praktik yang sangat efektif, asalkan digunakan dengan sistematis dan penuh pertimbangan. Bagaimana denganmu, apakah kamu sudah pernah membuat sebuah pengikis dalam PHP atau dengan bahasa pemrograman lain? Bagikan pengalamanmu 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