Mempelajari web scraping PHP sangat bermanfaat dalam berbagai bidang. Apakah Anda seorang pemasar atau peneliti SEO, mengakses data terbaru selalu penting, dan pengumpulan data secara manual dapat memakan waktu. Di situlah web scraping berperan. Web scraping dapat membantu di banyak bidang, mulai dari pengoptimalan mesin pencari dan pemasaran SEO hingga analisis data besar.
Daftar Isi
Mengapa Mengikis dengan PHP
PHP adalah bahasa pemrograman berorientasi objek yang kuat yang dirancang khusus untuk pengembangan web. Berkat sintaksisnya yang ramah pengguna, bahasa ini mudah dipelajari dan dipahami, bahkan oleh para pemula sekalipun. PHP tidak hanya ramah pengguna, tetapi juga memiliki kinerja yang luar biasa, memungkinkan skrip PHP untuk dieksekusi dengan cepat dan efisien.
Dukungan yang kuat dari komunitas PHP memastikan Anda memiliki akses ke banyak sumber daya, tutorial, dan forum di mana Anda bisa mendapatkan panduan dan berbagi pengetahuan. Secara keseluruhan, PHP menawarkan kombinasi sempurna antara kesederhanaan, kecepatan, dan keserbagunaan, menjadikannya bahasa pemrograman yang sangat baik untuk web scraping.
Menyiapkan Lingkungan untuk Scraping Web dengan PHP
Untuk membuat scraper PHP, kita perlu menyiapkan PHP dan mengunduh pustaka yang akan kita sertakan nanti dalam proyek kita. Namun, ada dua pilihan bagaimana kita dapat melakukan ini. Anda dapat mengunduh semua pustaka secara manual dan mengonfigurasi file inisialisasi atau mengotomatiskannya menggunakan Composer.
Karena kami bertujuan untuk menyederhanakan pembuatan skrip sebanyak mungkin dan menunjukkan kepada Anda cara melakukannya, kami akan menginstal Composer dan menjelaskan cara menggunakannya.
Memasang komponen
Untuk memulai, unduh PHP dari situs web resminya. Jika Anda menggunakan Windows, unduh versi stabil terbaru sebagai arsip zip. Kemudian buka zip-nya di tempat yang mudah diingat, seperti folder "PHP" pada drive C Anda.
Jika Anda menggunakan Windows, Anda perlu mengatur jalur ke file PHP dalam sistem Anda. Untuk melakukan ini, buka folder apa pun di komputer Anda dan buka pengaturan sistem (klik kanan pada PC ini dan buka properti).
Temukan opsi "Pengaturan sistem lanjutan" pada halaman dan klik opsi tersebut.
Pada tab "Advanced", cari tombol "Environment Variables" dan klik tombol tersebut.
Pada bagian "Variabel pengguna untuk pengguna", cari variabel "Path" dan klik tombol "Edit".
Sebuah jendela baru akan terbuka di mana Anda dapat mengedit nilai variabel "Path". Tambahkan jalur ke file PHP di akhir nilai yang ada. Klik tombol "OK" untuk menyimpan perubahan. Jika Anda masih memiliki pertanyaan, Anda dapat membaca dokumentasinya.
Sekarang mari kita instal Composer, sebuah pengelola ketergantungan untuk PHP yang menyederhanakan pengelolaan dan pemasangan pustaka pihak ketiga dalam proyek Anda. Anda bisa mengunduh semua paket dari github.com, tetapi berdasarkan pengalaman kami, Composer lebih nyaman.
Untuk memulai, buka situs web resmi dan unduh Composer. Kemudian, ikuti petunjuk dalam file instalasi. Anda juga perlu menentukan jalur di mana PHP berada, jadi pastikan jalur tersebut diatur dengan benar.
Pada direktori root proyek Anda, buat sebuah file baru bernama composer.json. File ini akan berisi informasi tentang dependensi proyek Anda. Kami telah menyiapkan satu berkas yang mencakup semua pustaka yang digunakan dalam tutorial hari ini sehingga Anda dapat menyalin pengaturan kami.
{
"require": {
"fabpot/goutte": "^4.0",
"facebook/webdriver": "^1.1",
"guzzlehttp/guzzle": "^7.7",
"imangazaliev/didom": "^2.0",
"j4mie/idiorm": "^1.5",
"jaeger/querylist": "^4.2",
"kriswallsmith/buzz": "^0.15.0",
"nategood/httpful": "^0.3.2",
"php-webdriver/webdriver": "^1.1",
"querypath/querypath": "^3.0",
"sunra/php-simple-html-dom-parser": "^1.5",
"symfony/browser-kit": "^6.3",
"symfony/dom-crawler": "^6.3"
},
"config": {
"platform": {
"php": "8.2.7"
},
"preferred-install": {
"*": "dist"
},
"minimum-stability": "stable",
"prefer-stable": true,
"sort-packages": true
}
}
Untuk memulai, buka direktori yang berisi file composer.json di baris perintah, dan jalankan perintah:
composer install
Kompiler akan mengunduh dependensi yang ditentukan dan menginstalnya di direktori vendor proyek Anda.
Sekarang Anda dapat mengimpor library ini ke dalam proyek Anda dengan menggunakan satu perintah di dalam file yang berisi kode Anda.
require 'vendor/autoload.php';
Sekarang Anda dapat menggunakan kelas dari pustaka yang terinstal hanya dengan memanggilnya dalam kode Anda.
Analisis Halaman
Sekarang setelah kita menyiapkan lingkungan dan menyiapkan semua komponen, mari kita menganalisis halaman web yang akan kita scrape. Sebagai contoh, kita akan menggunakan situs web demo ini. Buka situs web dan buka konsol pengembang (F12 atau klik kanan dan buka Inspect).
Di sini, kita dapat melihat bahwa semua data yang diperlukan disimpan dalam tag induk "div" dengan nama kelas "col", yang berisi semua produk pada halaman. Tag ini mencakup informasi berikut ini:
- Tag "img" menyimpan tautan ke gambar produk dalam atribut "src".
- Tag "a" berisi tautan produk dalam atribut "href".
- Tag "h4" berisi judul produk.
- Tag "p" berisi deskripsi produk.
- Harga disimpan dalam tag "rentang" dengan berbagai kelas:
5.1. "Harga lama" untuk harga asli.
5.2. "Harga-baru" untuk harga diskon.
5.3. "Pajak harga" untuk pajak.
Setelah mengetahui di mana informasi yang kita butuhkan disimpan, kita bisa mulai mengulik.
10 Perpustakaan Scraping Web PHP Terbaik
Ada begitu banyak pustaka dalam PHP sehingga sulit untuk membahas semuanya secara komprehensif. Namun, kami telah memilih yang paling populer dan umum digunakan dan sekarang kita akan membahasnya satu per satu.
Guzzle
Kami memulai koleksi kami dengan Perpustakaan Guzzle. Satu-satunya hal yang dapat dilakukan perpustakaan ini adalah menangani permintaan, tetapi perpustakaan ini melakukannya dengan sangat baik.
Pro dan Kontra Perpustakaan
Seperti yang telah disebutkan sebelumnya, Guzzle adalah sebuah pustaka untuk membuat permintaan. Meskipun dapat mengambil seluruh kode halaman, namun tidak dapat memproses dan mengekstrak data yang diperlukan. Namun, daftar kami juga memiliki pustaka yang sangat baik untuk penguraian tetapi tidak dapat membuat kueri. Oleh karena itu, untuk melakukan scraping, Guzzle sangat penting.
Contoh Penggunaan
Mari kita buat berkas baru dengan ekstensi *.php dan mengimpor pustaka-pustaka kita. Kita telah menggunakan perintah ini sebelumnya ketika kita menginstal pustaka penggalian web PHP.
<?php
require 'vendor/autoload.php';
// Here will be code
?>
Sekarang kita dapat membuat klien Guzzle.
use GuzzleHttp\Client;
$client = new Client();
Namun, banyak orang yang mengalami masalah sertifikat SSL. Jika Anda bekerja di lingkungan pengembangan lokal, Anda bisa menonaktifkan sementara verifikasi sertifikat SSL untuk melanjutkan pekerjaan Anda. Hal ini tidak disarankan dalam lingkungan produksi, tetapi bisa menjadi solusi sementara untuk tujuan pengembangan dan pengujian.
$client = new Client(['verify' => false]);
Sekarang tentukan URL halaman yang akan kita scrape.
$url="https://demo.opencart.com/";
Sekarang, yang tersisa hanyalah mengirimkan permintaan ke situs web target dan menampilkan hasilnya di layar. Namun, kesalahan sering terjadi pada tahap ini, jadi kita akan menyertakan blok kode ini dalam pernyataan try...catch() untuk menangani masalah potensial tanpa menghentikan skrip.
try {
$response = $client->request('GET', $url);
$body = $response->getBody()->getContents();
echo $body;
} catch (Exception $e) {
echo 'Error: ' . $e->getMessage();
Kita dapat mengambil data dari halaman ini menggunakan ekspresi reguler, tetapi metode ini tidak akan mudah karena kita membutuhkan sejumlah besar data. Kode lengkap:
<?php
require 'vendor/autoload.php';
use GuzzleHttp\Client;
$client = new Client(['verify' => false]);
$url="https://demo.opencart.com/";
try {
$response = $client->request('GET', $url);
$body = $response->getBody()->getContents();
echo $body;
} catch (Exception $e) {
echo 'Error: ' . $e->getMessage();
}
?>
Sekarang mari kita beralih ke perpustakaan berikutnya.
HTTPful
HTTPful adalah pustaka kueri lain yang fungsional dan berguna. Ini mendukung semua permintaan, termasuk POST, GET, DELETE, dan PUT.
Pro dan Kontra Perpustakaan
Pustaka ini sederhana dan mudah digunakan tetapi memiliki komunitas yang lebih kecil daripada Guzzle. Sayangnya, library ini memiliki fungsionalitas yang lebih sedikit, dan meskipun sederhana, library ini kurang populer. Selain itu, sudah cukup lama tidak diperbarui, jadi mungkin ada masalah saat menggunakannya.
Contoh Penggunaan
Mengingat bahwa ini adalah pustaka query, kami akan memberikan contoh kecil tambahan tentang bagaimana melakukan query karena kita harus menggunakan pustaka lain untuk melakukan parsing:
<?php
require 'vendor/autoload.php';
use Httpful\Request;
$response = Request::get('https://demo.opencart.com/')->send();
$html = $response->body;
?>
Jadi, Anda dapat menggunakannya dalam proyek penggosokan Anda, tetapi kami sarankan Anda menggunakan sesuatu yang lain.
Symfony
Symfony adalah sebuah kerangka kerja yang mencakup banyak komponen untuk melakukan scraping. Framework ini mendukung berbagai cara untuk memproses dokumen HTML dan menjalankan kueri.
Pro dan Kontra Perpustakaan
Symfony memungkinkan Anda mengekstrak data apa pun dari struktur HTML dan menggunakan pemilih CSS dan XPath. Terlepas dari ukuran halaman, aplikasi ini melakukan pemrosesan dengan cepat.
Namun, meskipun dapat digunakan sebagai alat pengikis mandiri, Symfony adalah kerangka kerja yang sangat besar dan berat. Karena alasan ini, tidak biasa menggunakan seluruh kerangka kerja tetapi hanya komponen tertentu saja.
Contoh Penggunaan
Jadi, mari kita gunakan Crawler-nya untuk memproses halaman dan pustaka Guzzle yang telah kita bahas untuk membuat permintaan. Kita tidak akan mengulasnya lagi dan melihat cara membuat klien dan menjalankan kueri.
Tambahkan penggunaan, yang menyatakan bahwa kita akan menggunakan perayap perpustakaan Symfony.
use Symfony\Component\DomCrawler\Crawler;
Selanjutnya, sempurnakan kode yang telah kita tulis di blok try{...}. Kita akan memproses permintaan dan mengambil semua elemen dengan kelas ".col".
$body = $response->getBody()->getContents();
$crawler->addHtmlContent($body);
$elements = $crawler->filter('.col');
Sekarang yang harus kita lakukan adalah menelusuri setiap item yang dikumpulkan dan memilih informasi yang kita inginkan. Untuk melakukan hal ini, kita menggunakan XPath dari elemen-elemen yang telah kita pertimbangkan saat menganalisis halaman.
Namun, Anda mungkin telah memperhatikan bahwa tidak semua item memiliki harga lama. Oleh karena itu, karena item dengan kelas ".price-old" mungkin tidak ada, mari kita tunjukkan ini dalam skrip dan gunakan "-" sebagai pengganti harga.
foreach ($elements as $element) {
$image = $crawler->filterXPath('.//img', $element)->attr('src');
$title = $crawler->filterXPath('.//h4', $element)->text();
$link = $crawler->filterXPath('.//h4/a', $element)->attr('href');
$desc = $crawler->filterXPath('.//p', $element)->text();
$old_p_element = $crawler->filterXPath('.//span.price-old', $element);
$old_p = $old_p_element->count() ? $old_p_element->text() : '-';
$new_p = $crawler->filterXPath('.//span.price-new', $element)->text();
$tax = $crawler->filterXPath('.//span.price-tax', $element)->text();
// Here will be code
}
Dan terakhir, yang harus kita lakukan adalah menampilkan semua data yang terkumpul pada layar:
echo 'Image: ' . $image . "\n";
echo 'Title: ' . $title . "\n";
echo 'Link: ' . $link . "\n";
echo 'Description: ' . $desc . "\n";
echo 'Old Price: ' . $old_p . "\n";
echo 'New Price: ' . $new_p . "\n";
echo 'Tax: ' . $tax . "\n";
echo "\n";
Dengan demikian, kami mendapatkan semua data ke dalam konsol:
Jika Anda tertarik dengan kode akhir atau jika Anda kehilangan kami selama tutorial, berikut ini adalah skrip lengkapnya:
<?php
require 'vendor/autoload.php';
use GuzzleHttp\Client;
use Symfony\Component\DomCrawler\Crawler;
$client = new Client([
'verify' => false
]);
$crawler = new Crawler();
$url="https://demo.opencart.com/";
try {
$response = $client->request('GET', $url);
$body = $response->getBody()->getContents();
$crawler->addHtmlContent($body);
$elements = $crawler->filter('.col');
foreach ($elements as $element) {
$image = $crawler->filterXPath('.//img', $element)->attr('src');
$title = $crawler->filterXPath('.//h4', $element)->text();
$link = $crawler->filterXPath('.//h4/a', $element)->attr('href');
$desc = $crawler->filterXPath('.//p', $element)->text();
$old_p_element = $crawler->filterXPath('.//span.price-old', $element);
$old_p = $old_p_element->count() ? $old_p_element->text() : '-';
$new_p = $crawler->filterXPath('.//span.price-new', $element)->text();
$tax = $crawler->filterXPath('.//span.price-tax', $element)->text();
echo 'Image: ' . $image . "\n";
echo 'Title: ' . $title . "\n";
echo 'Link: ' . $link . "\n";
echo 'Description: ' . $desc . "\n";
echo 'Old Price: ' . $old_p . "\n";
echo 'New Price: ' . $new_p . "\n";
echo 'Tax: ' . $tax . "\n";
echo "\n";
}
} catch (Exception $e) {
echo 'Error: ' . $e->getMessage();
}
?>
Jika Anda hanya ingin menggunakan framework Symfony, Anda bisa menggunakan komponen Panther. Kami tidak akan membahas penggunaan Panther langkah demi langkah, tetapi kami akan memberi Anda sebuah contoh, yang mendapatkan data yang sama:
<?php
require 'vendor/autoload.php';
use Symfony\Component\Panther\Panther;
$client = Panther::createChromeClient();
$crawler = $client->request('GET', 'https://demo.opencart.com/');
$elements = $crawler->filter('.col');
$elements->each(function ($element) {
$image = $element->filter('img')->attr('src');
$title = $element->filter('h4')->text();
$link = $element->filter('h4 > a')->attr('href');
$desc = $element->filter('p')->text();
$old_p_element = $element->filter('span.price-old');
$old_p = $old_p_element->count() > 0 ? $old_p_element->text() : '-';
$new_p = $element->filter('span.price-new')->text();
$tax = $element->filter('span.price-tax')->text();
echo 'Image: ' . $image . "\n";
echo 'Title: ' . $title . "\n";
echo 'Link: ' . $link . "\n";
echo 'Description: ' . $desc . "\n";
echo 'Old Price: ' . $old_p . "\n";
echo 'New Price: ' . $new_p . "\n";
echo 'Tax: ' . $tax . "\n";
echo "\n";
});
$client->quit();
?>
Mari kita beralih ke perpustakaan yang dapat menggantikan dua perpustakaan yang telah dibahas sebelumnya.
Goutte
Goutte adalah pustaka PHP yang menyediakan cara yang nyaman untuk mengikis halaman web. Goutte didasarkan pada komponen Symfony seperti DomCrawler dan BrowserKit dan menggunakan Guzzle sebagai klien HTTP. Oleh karena itu, ini menggabungkan keuntungan dari kedua pustaka ini.
Pro dan Kontra Perpustakaan
Goutte memiliki fungsionalitas yang sederhana, membuat pengikisan halaman web menjadi mudah bagi pemula. Goutte juga mendukung pemilih CSS dan XPath.
Meskipun Goutte adalah perpustakaan yang kuat dan nyaman untuk scraping web di PHP, ia memiliki beberapa keterbatasan dan kekurangan. Goutte tidak memiliki dukungan bawaan untuk mengeksekusi JavaScript pada halaman. Jika halaman target sangat bergantung pada JavaScript untuk tampilan atau pemuatan data, Goutte mungkin bukan pilihan terbaik.
Contoh Penggunaan
Mengingat pustaka Guotte didasarkan pada Guzzle dan Symfony, penggunaannya sama seperti yang telah kita lihat. Di sini kita juga menggunakan metode seperti filter() dan attr() atau text() untuk mengekstrak data yang dibutuhkan, seperti gambar, judul, atau tautan:
<?php
require 'vendor/autoload.php';
$guzzleClient = new \GuzzleHttp\Client([
'verify' => false
]);
$client = new \Goutte\Client();
$client->setClient($guzzleClient);
try {
$crawler = $client->request('GET', 'https://demo.opencart.com/');
$elements = $crawler->filter('.col');
$elements->each(function ($element) {
$image = $element->filter('img')->attr('src');
$title = $element->filter('h4')->text();
$link = $element->filter('h4 > a')->attr('href');
$desc = $element->filter('p')->text();
$old_p_element = $element->filter('span.price-old');
$old_p = $old_p_element->count() ? $old_p_element->text() : '-';
$new_p = $element->filter('span.price-new')->text();
$tax = $element->filter('span.price-tax')->text();
echo 'Image: ' . $image . "\n";
echo 'Title: ' . $title . "\n";
echo 'Link: ' . $link . "\n";
echo 'Description: ' . $desc . "\n";
echo 'Old Price: ' . $old_p . "\n";
echo 'New Price: ' . $new_p . "\n";
echo 'Tax: ' . $tax . "\n";
echo "\n";
});
} catch (Exception $e) {
echo 'Error: ' . $e->getMessage();
}
?>
Jadi, kami mendapatkan data yang sama tetapi dengan perpustakaan yang berbeda:
Seperti yang Anda lihat, Goutte adalah perpustakaan scraping web PHP yang cukup nyaman.
API Scrape-It.Cloud
Scrape-It.Cloud API adalah antarmuka khusus yang kami kembangkan untuk menyederhanakan proses scraping. Saat mengikis data, pengembang sering menghadapi beberapa tantangan, seperti rendering JavaScript, captcha, blok, dll. Namun, dengan menggunakan API kami, Anda dapat mengatasi masalah ini dan fokus pada pemrosesan data yang telah Anda terima.
Pro dan Kontra Perpustakaan
Seperti yang telah disebutkan, API web scraping kami akan membantu Anda menghindari banyak tantangan saat mengembangkan scraper Anda. Selain itu, ini akan menghemat uang Anda. Kami telah membahas 10 penyedia proxy teratas dan membandingkan biaya pembelian proksi berputar dan langganan kami.
Selain itu, jika Anda perlu mendapatkan beberapa data dan tidak ingin mengembangkan scraper, Anda bisa menggunakan scraper tanpa kode kami untuk situs-situs yang paling populer. Jika Anda ragu dan ingin mencoba, daftar di situs kami dan dapatkan kredit gratis sebagai bagian dari versi uji coba.
Contoh Penggunaan
Untuk menggunakan API, kita perlu membuat permintaan. Kita akan menggunakan pustaka Guzzle, yang telah kita bahas sebelumnya. Mari hubungkan dan atur tautan API.
require 'vendor/autoload.php';
use GuzzleHttp\Client;
$apiUrl="https://api.scrape-it.cloud/scrape";
Sekarang, kita perlu membuat permintaan dengan dua bagian - tajuk permintaan dan badan permintaan. Pertama, siapkan header:
$headers = [
'x-api-key' => 'YOUR-API-KEY',
'Content-Type' => 'application/json',
];
Anda harus mengganti "KUNCI-API ANDA" dengan kunci unik Anda, yang dapat Anda temukan setelah mendaftar di situs kami di akun Anda.
Kemudian, kita perlu mengatur badan permintaan untuk memberi tahu API data apa yang kita inginkan. Di sini Anda dapat menentukan aturan ekstraksi data, proksi dan jenis proksi yang ingin Anda gunakan, skrip yang akan diekstraksi, tautan ke sumber daya, dan banyak lagi. Anda dapat menemukan daftar lengkap parameter di dokumentasi kami.
$data = [
'extract_rules' => [
'Image' => 'img @src',
'Title' => 'h4',
'Link' => 'h4 > a @href',
'Description' => 'p',
'Old Price' => 'span.price-old',
'New Price' => 'span.price-new',
'Tax' => 'span.price-tax',
],
'wait' => 0,
'screenshot' => true,
'block_resources' => false,
'url' => 'https://demo.opencart.com/',
];
Kami menggunakan aturan ekstraksi untuk mendapatkan data yang diinginkan saja. API mengembalikan respons dalam format JSON, yang dapat kita gunakan untuk mengekstrak aturan ekstraksi dari respons.
$data = json_decode($response->getBody(), true);
if ($data['status'] === 'ok') {
$extractionData = $data['scrapingResult']['extractedData'];
foreach ($extractionData as $key => $value) {
echo $key . ": " . json_encode($value) . "\n\n";
}
} else {
echo "An error occurred: " . $data['message'];
}
Kita akan mendapatkan informasi yang diinginkan dengan menjalankan skrip yang telah kita buat. Bagian terbaiknya adalah skrip ini akan bekerja terlepas dari situs web yang ingin Anda scrape. Yang perlu Anda lakukan hanyalah mengubah aturan ekstraksi dan memberikan tautan ke sumber daya target.
Kode lengkap:
<?php
require 'vendor/autoload.php';
use GuzzleHttp\Client;
$apiUrl="https://api.scrape-it.cloud/scrape";
$headers = [
'x-api-key' => 'YOUR-API-KEY',
'Content-Type' => 'application/json',
];
$data = [
'extract_rules' => [
'Image' => 'img @src',
'Title' => 'h4',
'Link' => 'h4 > a @href',
'Description' => 'p',
'Old Price' => 'span.price-old',
'New Price' => 'span.price-new',
'Tax' => 'span.price-tax',
],
'wait' => 0,
'screenshot' => true,
'block_resources' => false,
'url' => 'https://demo.opencart.com/',
];
$client = new Client(['verify' => false]);
$response = $client->post($apiUrl, [
'headers' => $headers,
'json' => $data,
]);
$data = json_decode($response->getBody(), true);
if ($data['status'] === 'ok') {
$extractionData = $data['scrapingResult']['extractedData'];
foreach ($extractionData as $key => $value) {
echo $key . ": " . json_encode($value) . "\n\n";
}
} else {
echo "An error occurred: " . $data['message'];
}
?>
Hasilnya adalah:
Dengan menggunakan API web scraping kami, Anda bisa mendapatkan hasil dari situs apa pun, terlepas dari apakah situs tersebut dapat diakses di negara Anda atau kontennya dibuat secara dinamis.
DOM HTML sederhana
Perpustakaan DOM HTML Sederhana adalah salah satu perpustakaan DOM PHP yang paling mudah. Sangat bagus untuk pemula, memiliki pustaka scraping yang lengkap, dan sangat mudah digunakan.
Pro dan Kontra Perpustakaan
Pustaka ini sangat mudah digunakan dan sempurna untuk menggores halaman sederhana. Namun, Anda tidak dapat mengumpulkan data dari halaman yang dibuat secara dinamis. Selain itu, library ini hanya memungkinkan Anda untuk menggunakan pemilih CSS dan tidak mendukung XPath.
Contoh Penggunaan
Mari kita lihat melalui contoh bahwa ini sangat mudah digunakan. Pertama, hubungkan dependensi dan tentukan situs tempat kita akan mengikis data.
require 'vendor/autoload.php';
use Sunra\PhpSimple\HtmlDomParser;
$html = HtmlDomParser::file_get_html('https://demo.opencart.com/');
Sekarang temukan semua produk menggunakan fungsi find() dan pemilih CSS.
$elements = $html->find('.col');
Sekarang mari kita telusuri semua elemen yang terkumpul dan pilih data yang kita butuhkan. Dalam melakukannya, kita perlu menentukan apa yang ingin kita ekstrak. Kita harus menentukan nama atribut jika itu adalah nilai atribut. Jika kita ingin mengekstrak konten teks dari sebuah tag, kita akan menggunakan "plaintext". Seperti sebelumnya, mari kita tampilkan teks di layar sekaligus.
foreach ($elements as $element) {
$image = $element->find('img', 0)->src;
$title = $element->find('h4', 0)->plaintext;
$link = $element->find('h4 > a', 0)->href;
$desc = $element->find('p', 0)->plaintext;
$old_p_element = $element->find('span.price-old', 0);
$old_p = $old_p_element ? $old_p_element->plaintext : '-';
$new_p = $element->find('span.price-new', 0)->plaintext;
$tax = $element->find('span.price-tax', 0)->plaintext;
echo 'Image: ' . $image . "\n";
echo 'Title: ' . $title . "\n";
echo 'Link: ' . $link . "\n";
echo 'Description: ' . $desc . "\n";
echo 'Old Price: ' . $old_p . "\n";
echo 'New Price: ' . $new_p . "\n";
echo 'Tax: ' . $tax . "\n";
echo "\n";
}
Setelah itu, yang harus kita lakukan adalah mengosongkan sumber daya dan mengakhiri skrip.
$html->clear();
Kode lengkap:
<?php
require 'vendor/autoload.php';
use Sunra\PhpSimple\HtmlDomParser;
$html = HtmlDomParser::file_get_html('https://demo.opencart.com/');
$elements = $html->find('.col');
foreach ($elements as $element) {
$image = $element->find('img', 0)->src;
$title = $element->find('h4', 0)->plaintext;
$link = $element->find('h4 > a', 0)->href;
$desc = $element->find('p', 0)->plaintext;
$old_p_element = $element->find('span.price-old', 0);
$old_p = $old_p_element ? $old_p_element->plaintext : '-';
$new_p = $element->find('span.price-new', 0)->plaintext;
$tax = $element->find('span.price-tax', 0)->plaintext;
echo 'Image: ' . $image . "\n";
echo 'Title: ' . $title . "\n";
echo 'Link: ' . $link . "\n";
echo 'Description: ' . $desc . "\n";
echo 'Old Price: ' . $old_p . "\n";
echo 'New Price: ' . $new_p . "\n";
echo 'Tax: ' . $tax . "\n";
echo "\n";
}
$html->clear();
?>
Hasilnya adalah data yang sama dengan contoh sebelumnya tetapi hanya dalam beberapa baris kode.
Selenium
Kami sudah sering menulis tentang Selenium dalam koleksi untuk bahasa pemrograman lain seperti Python, R, Ruby, dan C#. Kami ingin membahas library ini lagi karena library ini sangat mudah digunakan. Selenium memiliki dokumentasi yang ditulis dengan baik dan komunitas yang aktif mendukungnya.
Pro dan Kontra Perpustakaan
Pustaka ini memiliki banyak kelebihan dan hanya sedikit kekurangan. Perpustakaan ini memiliki dukungan komunitas yang sangat baik, dokumentasi yang ekstensif, serta penyempurnaan dan peningkatan yang konstan.
Selenium memungkinkan Anda untuk menggunakan peramban tanpa kepala untuk mensimulasikan perilaku pengguna yang sebenarnya. Ini berarti Anda dapat mengurangi risiko deteksi saat melakukan scraping. Selain itu, Anda bisa berinteraksi dengan elemen-elemen di halaman web, seperti mengisi formulir atau mengklik tombol.
Adapun kekurangannya, ini tidak sepopuler PHP seperti NodeJS atau Python, dan mungkin menantang bagi pemula.
Contoh Penggunaan
Sekarang mari kita lihat contoh penggunaan Selenium. Untuk membuatnya bekerja, kita membutuhkan driver web. Kita akan menggunakan driver web Chrome. Pastikan versi ini sesuai dengan versi peramban Chrome yang terinstal di komputer Anda. Buka zip driver web ke drive C Anda.
Anda dapat menggunakan driver web apa pun yang Anda sukai. Sebagai contoh, Anda dapat memilih Mozilla Firefox atau yang lainnya yang didukung oleh Selenium.
Untuk memulai, tambahkan dependensi yang diperlukan ke proyek kita.
require 'vendor/autoload.php';
use Facebook\WebDriver\Remote\DesiredCapabilities;
use Facebook\WebDriver\Remote\RemoteWebDriver;
use Facebook\WebDriver\WebDriverBy;
Sekarang mari kita tentukan parameter host tempat driver web kita berjalan. Untuk melakukannya, jalankan berkas driver web dan lihat di port mana ia dimulai.
Tentukan parameter-parameter ini dalam skrip:
$host="http://localhost:9515";
Selanjutnya, kita perlu meluncurkan peramban dan membuka sumber daya target.
$capabilities = DesiredCapabilities::chrome();
$driver = RemoteWebDriver::create($host, $capabilities);
$driver->get('https://demo.opencart.com/');
Sekarang, kita perlu menemukan produk di halaman web, menelusuri setiap produk, dan mendapatkan data yang diinginkan. Setelah itu, kita harus menampilkan data di layar. Kita telah melakukan ini di contoh sebelumnya, jadi kita tidak akan membahas secara rinci tentang langkah ini.
$elements = $driver->findElements(WebDriverBy::cssSelector('.col'));
foreach ($elements as $element) {
$image = $element->findElement(WebDriverBy::tagName('img'))->getAttribute('src');
$title = $element->findElement(WebDriverBy::tagName('h4'))->getText();
$link = $element->findElement(WebDriverBy::cssSelector('h4 > a'))->getAttribute('href');
$desc = $element->findElement(WebDriverBy::tagName('p'))->getText();
$old_p_element = $element->findElement(WebDriverBy::cssSelector('span.price-old'));
$old_p = $old_p_element ? $old_p_element->getText() : '-';
$new_p = $element->findElement(WebDriverBy::cssSelector('span.price-new'))->getText();
$tax = $element->findElement(WebDriverBy::cssSelector('span.price-tax'))->getText();
echo 'Image: ' . $image . "\n";
echo 'Title: ' . $title . "\n";
echo 'Link: ' . $link . "\n";
echo 'Description: ' . $desc . "\n";
echo 'Old Price: ' . $old_p . "\n";
echo 'New Price: ' . $new_p . "\n";
echo 'Tax: ' . $tax . "\n";
echo "\n";
}
Selenium menyediakan banyak opsi untuk menemukan berbagai elemen pada halaman. Dalam tutorial ini, kami menggunakan pencarian pemilih CSS dan pencarian tag.
Pada akhirnya, Anda harus menutup browser.
$driver->quit();
Jika kita menjalankan skrip, skrip tersebut akan meluncurkan peramban, menavigasi ke halaman, dan menutupnya setelah mengumpulkan data.
Jika Anda bingung dan melewatkan sesuatu, berikut ini adalah kode skrip lengkapnya:
<?php
require 'vendor/autoload.php';
use Facebook\WebDriver\Remote\DesiredCapabilities;
use Facebook\WebDriver\Remote\RemoteWebDriver;
use Facebook\WebDriver\WebDriverBy;
$host="http://localhost:9515";
$capabilities = DesiredCapabilities::chrome();
$driver = RemoteWebDriver::create($host, $capabilities);
$driver->get('https://demo.opencart.com/');
$elements = $driver->findElements(WebDriverBy::cssSelector('.col'));
foreach ($elements as $element) {
$image = $element->findElement(WebDriverBy::tagName('img'))->getAttribute('src');
$title = $element->findElement(WebDriverBy::tagName('h4'))->getText();
$link = $element->findElement(WebDriverBy::cssSelector('h4 > a'))->getAttribute('href');
$desc = $element->findElement(WebDriverBy::tagName('p'))->getText();
$old_p_element = $element->findElement(WebDriverBy::cssSelector('span.price-old'));
$old_p = $old_p_element ? $old_p_element->getText() : '-';
$new_p = $element->findElement(WebDriverBy::cssSelector('span.price-new'))->getText();
$tax = $element->findElement(WebDriverBy::cssSelector('span.price-tax'))->getText();
echo 'Image: ' . $image . "\n";
echo 'Title: ' . $title . "\n";
echo 'Link: ' . $link . "\n";
echo 'Description: ' . $desc . "\n";
echo 'Old Price: ' . $old_p . "\n";
echo 'New Price: ' . $new_p . "\n";
echo 'Tax: ' . $tax . "\n";
echo "\n";
}
$driver->quit();
?>
Seperti yang Anda lihat, Selenium cukup berguna dalam PHP tetapi sedikit lebih rumit daripada library lainnya.
QueryPath
QueryPath adalah pustaka untuk mengekstraksi data dari halaman HTML, memfilter, dan memproses item.
Pro dan Kontra Perpustakaan
Pustaka QueryPath sangat mudah digunakan, jadi ini akan menjadi pilihan yang bagus untuk pemula. Library ini juga mendukung sintaksis seperti jQuery untuk penguraian dan pemrosesan HTML/XML. Namun, ia memiliki fungsionalitas yang terbatas dibandingkan dengan beberapa pustaka lainnya.
Contoh Penggunaan
Ini memiliki perintah yang sama untuk mencari seperti perpustakaan yang telah dibahas sebelumnya. Berkat kesederhanaannya, kita hanya perlu membuat permintaan ke situs web dan memproses data yang diterima. Oleh karena itu, kita tidak akan mengulangi langkah-langkah yang telah kita bahas dan akan memberikan contoh lengkap untuk menggunakan library ini:
<?php
require 'vendor/autoload.php';
use QueryPath\Query;
$html = file_get_contents('https://demo.opencart.com/');
$qp = Query::withHTML($html);
$elements = $qp->find('.col');
foreach ($elements as $element) {
$image = $element->find('img')->attr('src');
$title = $element->find('h4')->text();
$link = $element->find('h4 > a')->attr('href');
$desc = $element->find('p')->text();
$old_p_element = $element->find('span.price-old')->get(0);
$old_p = $old_p_element ? $old_p_element->text() : '-';
$new_p = $element->find('span.price-new')->text();
$tax = $element->find('span.price-tax')->text();
echo 'Image: ' . $image . "\n";
echo 'Title: ' . $title . "\n";
echo 'Link: ' . $link . "\n";
echo 'Description: ' . $desc . "\n";
echo 'Old Price: ' . $old_p . "\n";
echo 'New Price: ' . $new_p . "\n";
echo 'Tax: ' . $tax . "\n";
echo "\n";
}
$qp->unload();
?>
Jadi, seperti yang Anda lihat, ini hanya memiliki sedikit perbedaan dari pustaka yang telah dibahas.
QueryList
Berikutnya dalam daftar kami adalah pustaka QueryList. Library ini memiliki lebih banyak fungsi daripada library sebelumnya. Kami juga dapat mengatakan bahwa prinsip penggunaannya sedikit berbeda dari library yang telah dibahas sebelumnya.
Pro dan Kontra Perpustakaan
QueryList adalah alat yang kuat dan fleksibel untuk mengekstrak dan memproses data dari HTML/XML. Namun, ini bisa menjadi rumit bagi pemula karena banyaknya fungsi dan fitur.
Contoh Penggunaan
Pertama, hubungkan dependensi dan lakukan kueri ke situs target.
require 'vendor/autoload.php';
use QL\QueryList;
$html = QueryList::get('https://demo.opencart.com/')->getHtml();
Kemudian menguraikan kode HTML halaman tersebut.
$ql = QueryList::html($html);
Mari kita proses semua data yang kita miliki untuk mengekstrak informasi yang diinginkan. Setelah itu, kita akan membuat bingkai data dan menyimpan data di dalamnya.
$elements = $ql->find('.col')->map(function ($item) {
$image = $item->find('img')->attr('src');
$title = $item->find('h4')->text();
$link = $item->find('h4 > a')->attr('href');
$desc = $item->find('p')->text();
$old_p = $item->find('span.price-old')->text() ?: '-';
$new_p = $item->find('span.price-new')->text();
$tax = $item->find('span.price-tax')->text();
return [
'Image' => $image,
'Title' => $title,
'Link' => $link,
'Description' => $desc,
'Old Price' => $old_p,
'New Price' => $new_p,
'Tax' => $tax
];
});
Sekarang, mari kita telusuri tiap elemen dan mencetaknya pada layar:
foreach ($elements as $element) {
foreach ($element as $key => $value) {
echo $key . ': ' . $value . "\n";
}
echo "\n";
}
Itu saja, kami memiliki data yang kami butuhkan, dan jika Anda melewatkan sesuatu, kami akan memberikan kode lengkapnya:
<?php
require 'vendor/autoload.php';
use QL\QueryList;
$html = QueryList::get('https://demo.opencart.com/')->getHtml();
$ql = QueryList::html($html);
$elements = $ql->find('.col')->map(function ($item) {
$image = $item->find('img')->attr('src');
$title = $item->find('h4')->text();
$link = $item->find('h4 > a')->attr('href');
$desc = $item->find('p')->text();
$old_p = $item->find('span.price-old')->text() ?: '-';
$new_p = $item->find('span.price-new')->text();
$tax = $item->find('span.price-tax')->text();
return [
'Image' => $image,
'Title' => $title,
'Link' => $link,
'Description' => $desc,
'Old Price' => $old_p,
'New Price' => $new_p,
'Tax' => $tax
];
});
foreach ($elements as $element) {
foreach ($element as $key => $value) {
echo $key . ': ' . $value . "\n";
}
echo "\n";
}
?>
Perpustakaan ini memiliki banyak fitur dan serangkaian fungsi yang kaya. Namun, bagi pemula, mungkin cukup menantang untuk menavigasinya.
DiDOM
Pustaka terakhir dalam artikel kami adalah DiDom. Ini sangat bagus untuk mengekstrak data dari HTML dan mengubahnya menjadi tampilan yang dapat digunakan.
Pro dan Kontra Perpustakaan
DiDom adalah pustaka ringan dengan fungsi yang sederhana dan jelas. DiDom juga memiliki kinerja yang baik. Sayangnya, ini kurang populer dan memiliki komunitas pendukung yang lebih kecil daripada pustaka lainnya.
Contoh Penggunaan
Hubungkan dependensi dan buat permintaan ke situs target:
require 'vendor/autoload.php';
use DiDom\Document;
$document = new Document('https://demo.opencart.com/', true);
Temukan semua produk yang memiliki kelas ".col":
$elements = $document->find('.col');
Mari kita telusuri masing-masing, kumpulkan data dan tampilkan di layar:
foreach ($elements as $element) {
$image = $element->find('img', 0)->getAttribute('src');
$title = $element->find('h4', 0)->text();
$link = $element->find('h4 > a', 0)->getAttribute('href');
$desc = $element->find('p', 0)->text();
$old_p_element = $element->find('span.price-old', 0);
$old_p = $old_p_element ? $old_p_element->text() : '-';
$new_p = $element->find('span.price-new', 0)->text();
$tax = $element->find('span.price-tax', 0)->text();
echo 'Image: ' . $image . "\n";
echo 'Title: ' . $title . "\n";
echo 'Link: ' . $link . "\n";
echo 'Description: ' . $desc . "\n";
echo 'Old Price: ' . $old_p . "\n";
echo 'New Price: ' . $new_p . "\n";
echo 'Tax: ' . $tax . "\n";
echo "\n";
}
Pada titik ini, skrip sudah siap, dan Anda dapat memproses data dengan cara apa pun yang Anda inginkan. Kami juga melampirkan contoh kode lengkapnya:
<?php
require 'vendor/autoload.php';
use DiDom\Document;
$document = new Document('https://demo.opencart.com/', true);
$elements = $document->find('.col');
foreach ($elements as $element) {
$image = $element->find('img', 0)->getAttribute('src');
$title = $element->find('h4', 0)->text();
$link = $element->find('h4 > a', 0)->getAttribute('href');
$desc = $element->find('p', 0)->text();
$old_p_element = $element->find('span.price-old', 0);
$old_p = $old_p_element ? $old_p_element->text() : '-';
$new_p = $element->find('span.price-new', 0)->text();
$tax = $element->find('span.price-tax', 0)->text();
echo 'Image: ' . $image . "\n";
echo 'Title: ' . $title . "\n";
echo 'Link: ' . $link . "\n";
echo 'Description: ' . $desc . "\n";
echo 'Old Price: ' . $old_p . "\n";
echo 'New Price: ' . $new_p . "\n";
echo 'Tax: ' . $tax . "\n";
echo "\n";
}
?>
Ini adalah kesimpulan dari koleksi library scraping PHP terbaik. Saatnya untuk memilih library terbaik dari semua yang telah diulas.
Perpustakaan PHP Terbaik untuk Scraping
Memilih library PHP web scraping terbaik tergantung pada beberapa faktor: tujuan proyek, persyaratan, dan keterampilan pemrograman Anda. Untuk membantu Anda memutuskan, kami telah mengumpulkan informasi penting yang dibahas dalam artikel dan membuat tabel perbandingan dari 10 library scraping teratas.
Perpustakaan | Kelebihan | Kekurangan | Mengikis Data Dinamis | Kemudahan Penggunaan |
---|---|---|---|---|
Guzzle |
|
|
Tidak. | Menengah |
HTTPful |
|
|
Tidak. | Pemula |
Symfony |
|
|
Ya. | Lanjutan |
Goutte |
|
|
Tidak. | Pemula |
Mengikis-It.Cloud |
|
Ya. | Pemula | |
DOM HTML sederhana |
|
|
Tidak. | Pemula |
Selenium |
|
|
Ya. | Menengah |
QueryPath |
|
|
Tidak. | Menengah |
QueryList |
|
|
Ya. | Menengah |
DiDom |
|
|
Tidak. | Pemula |
Ini akan membantu Anda menemukan library scraping PHP terbaik yang akan sangat cocok bagi Anda untuk mencapai tujuan Anda.
Kesimpulan dan Pelajaran Berharga
Pada artikel ini, kita telah mempelajari pengaturan lingkungan pemrograman PHP dan mengeksplorasi kemungkinan mengotomatiskan integrasi dan pembaruan library. Kami juga telah memperkenalkan 10 library web scraping teratas untuk membantu Anda dengan berbagai pilihan untuk proyek scraping Anda.
Namun, jika Anda mengalami kesulitan dalam memilih library terbaik, kami telah membandingkan semua library yang telah kami pertimbangkan. Tetapi jika Anda masih tidak tahu apa yang harus dipilih, Anda dapat mencoba API web scraping kami. API ini tidak hanya menyederhanakan proses pengumpulan data tetapi juga membantu menavigasi tantangan potensial. Dengan kemampuannya, Anda dapat mengotomatiskan tugas pengumpulan data dan mengatasi semua kesulitan.