PHP adalah bahasa backend yang banyak digunakan. Dibenci oleh banyak orang dan digunakan untuk banyak aplikasi seperti WordPress. Jika kamu selesai Pengikisan web Namun, jika dipikir-pikir, PHP bukanlah hal pertama yang terlintas dalam pikiran.
Dengan alat seperti Scrapy untuk Python atau Cheerio untuk Node.js yang memudahkan pengikisan web, sulit membayangkan mengapa Anda menggunakan PHP untuk mengikis data. Sampai Anda mempelajari semua opsi berbeda yang Anda miliki dengannya.
Karena memiliki komunitas yang aktif dan sudah ada sejak lama, PHP memiliki banyak alat yang membuat web scraping tidak hanya lebih mudah tetapi juga lebih bertenaga.
Jika Anda sudah mengetahui PHP atau tertarik mempelajari bahasa backend dengan kemampuan mengekstrak data web dengan cepat dan efisien, maka tutorial ini cocok untuk Anda.
Hari ini kita akan menjelajahi beberapa alat yang tersedia untuk Anda dan membuat contoh kode dunia nyata untuk membuat web scraper pertama Anda dengan PHP.
Daftar Isi
Memilih perpustakaan scraping web PHP
Ada banyak cara untuk melakukan web scraping di PHP. Namun, cara paling efisien adalah dengan menggunakan perpustakaan yang memiliki semua alat bawaan yang Anda perlukan untuk mengunduh dan mengurai URL.
Jika tidak, kita harus menghabiskan lebih banyak waktu dan menulis kode yang lebih kompleks untuk melakukan tugas sederhana seperti mengirim permintaan HTTP.
Jika kita membagi web scraping menjadi tugas-tugas intinya, tampilannya akan seperti ini:
- Pertama, kami akan mengirimkan permintaan HTTP ke server untuk mendapatkan kode sumber halaman.
- Kemudian kita perlu mengurai DOM untuk mengidentifikasi dan memfilter informasi serta mengekstrak data yang kita perlukan.
- Terakhir, kami ingin memformat data agar lebih mudah dipahami - misalnya menjadi file CSV atau JSON.
Hanya untuk permintaan HTTP, kami dapat menggunakan metode berbeda seperti:
- fsockopen() – meskipun tidak digunakan untuk permintaan HTTP, hal ini tentu saja memungkinkan. Tentu saja, hal ini memerlukan banyak kode yang tidak diperlukan dan sebenarnya tidak ingin kita tulis.
- cURL – klien untuk URL yang memungkinkan Anda menjalankan permintaan HTTP dengan mudah, tetapi tidak terlalu berguna untuk menavigasi file HTML dan mengekstrak data yang Anda cari.
- Menggunakan klien HTTP seperti Guzzle atau Goutte – yang juga akan membuat penguraian pohon HTML DOM lebih mudah daripada opsi sebelumnya.
Seperti yang Anda lihat, dua yang terakhir adalah alat siap pakai untuk web scraping dengan PHP.
Mengapa menggunakan Goutte untuk web scraping PHP?
Anda sudah tahu kami akan menggunakan Goutte untuk contoh ini - spoiler untuk judulnya - tapi tahukah Anda alasannya?
Guzzle jelas merupakan pilihan bagus untuk web scraping. Ini menyederhanakan pembuatan permintaan HTTP dan menyediakan kemampuan untuk mengurai file yang diunduh untuk mengekstrak data.
Masalahnya adalah untuk melakukan ini kita harus mengonversi file HTML yang diunduh menjadi dokumen DOM dan kemudian menggunakan ekspresi XPath untuk menavigasi dokumen dan memilih node yang ingin kita dapatkan.
Ini menambahkan langkah-langkah tambahan yang dapat kita tangani dengan mudah menggunakan Goutte.
Goutte adalah klien HTTP yang dirancang untuk web scraping dari Potensi FabianPencipta kerangka Symfony.
Pustaka ini menggabungkan empat komponen Symfony yang membuat web scraping menjadi sangat mudah dan elegan:
- BrowserKit – yang mensimulasikan perilaku browser.
- DomCrawler – komponen ini memungkinkan kita bernavigasi menggunakan ekspresi seperti di dokumen DOM
$crawler = $crawler->filter('body > h2');
dan masih banyak metode lainnya. - CssSelector – komponen ini membuat pemilihan elemen menjadi sangat mudah dengan memungkinkan kita memilih elemen menggunakan pemilih CSS dan kemudian mengubahnya menjadi ekspresi XPath yang sesuai untuk kita. Misalnya kutipan ini
$crawler->filter('.fire');
menemukan semua elemenclass="fire"
. - Symfony HTTP Client – ini merupakan komponen terbaru dan sangat populer sejak diluncurkan pada tahun 2019.
Untuk alasan ini, kami akan menggunakan Goutte untuk sisa tutorial ini.
Catatan: Kami akan merilis tutorial Guzzle di masa mendatang, jadi pantau terus blog kami dan media sosial.
Membuat web scraper dengan PHP dan Goutte
Sebelum kita benar-benar mulai menulis kode, penting untuk memahami struktur situs yang ingin kita jelajahi.
Untuk tutorial ini, kita akan mencari halaman kaos wanita NewChic untuk mengekstrak yang berikut ini:
- Nama kaosnya
- Tautan ke karya tersebut
- Harga
Scraper semacam itu dapat digunakan bagi perusahaan e-commerce yang ingin melakukan analisis persaingan.
Mari kita mulai dengan memeriksa situsnya.
1. Periksa halaman alat pengembangan browser
Di situs web target kami, klik kanan halaman dan klik Periksa. Alternatifnya, Anda juga dapat menekan Ctrl + Shift + C.
Alat inspektur terbuka di browser Anda.
Apa yang kita lihat dalam kode HTML yang digunakan browser kita untuk menampilkan halaman. Setiap baris berisi informasi tentang elemen pada halaman.
Yang benar-benar kami pedulikan adalah tag, kelas, dan ID untuk setiap elemen, karena ini adalah detail yang kami gunakan untuk membantu scraper kami menemukan informasi yang dibutuhkan.
Jadi mari kita mulai dengan judul selendangnya. Untuk melakukan ini, klik kanan pada elemen dan periksa.
Terlihat nama kaos tersebut dibalut ditengahnya Tag di dalam
tag.
Namun, ini tentu bukan satu-satunya link di halaman tersebut. Jika kita hanya menggunakan tag elemen, kita akan mendapatkan semua link dari halaman tersebut, termasuk link navigasi, link footer, dan lainnya.
Di sinilah kelas berperan.
Hal berikut ini berlaku untuk nama kaos tersebut: Hari memiliki kelas “
lg text-ellipsis d-block text-hover-underline text-secondary-hover font-small-12 text-grey product-item-name-js
“. Oleh karena itu, kami ingin memastikan bahwa semua elemen lainnya menggunakan kelas yang sama.
Setelah beberapa pemeriksaan lagi, semuanya menggunakan kelas yang sama, yang sempurna bagi kami karena kami kemudian dapat menggunakannya untuk memilih judul dan tautan.
Catatan: Kita akan mempelajari cara mengekstrak atribut href dari a tandai nanti.
Selanjutnya kita melakukan hal yang sama untuk setiap elemen:
- Untuk harga:
span class="product-item-final-price-js price product-price-js font-middle font-bold text-black-light-1
“ - Untuk tautan: Kami menggunakan hal yang sama seperti untuk judul, tetapi alih-alih mendapatkan teks, kami menarik nilai href.
2. Instal PHP dan semua dependensi yang diperlukan
Sebelum kita mendownload file, kita cek dulu apakah versi PHP sudah terinstall. Ketik terminal Anda php -v
.
Ini adalah notifikasi yang kami terima karena kami menggunakan Macbook M1. Penting bagi kita untuk memiliki PHP versi 7.3.24.
Jika Anda belum menginstalnya, ikuti langkah-langkah berikut untuk menginstal PHP di Mac Anda:
- Buka https://brew.sh/ dan instal Homebrew. Ini adalah manajer paket yang hilang untuk macOS
- Setelah Homebrew terinstal, Anda dapat menginstal PHP dengan perintah berikut: brew install php - Sebelum memulai pengunduhan, Anda akan dimintai kata sandi komputer Anda.
Anda juga dapat mengikuti video sederhana ini tentang cara menginstal PHP 8 di macOS Big Sur.
Catatan: Berikut adalah sumber yang menjelaskan cara menginstal PHP di Windows.
Instal Komposer secara global
Sekarang PHP ada di mesin kami, kami akan mengunduh komposer (manajer paket PHP yang akan kita gunakan untuk mengunduh Goutte) dengan mengikuti dokumentasinya.
- Buka terminal Anda di desktop Anda (CD desktop) dan tulis
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
. File bernama “composer-setup.php” sekarang akan ada di desktop Anda. - Selanjutnya, salin dan tempel perintah berikut:
php -r "if (hash_file('sha384', 'composer-setup.php') === '756890a4488ce9024fc62c56153228907f1545c228516cbf63f885e036d37e9a59d27d63f46af1d4d07ee0f76181c7d3') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
Ini akan memverifikasi bahwa file setup telah diunduh dengan benar.
- Setelah file dicek, kita jalankan scriptnya menggunakan php Composer-Setup.php. Perintah ini mengunduh dan menginstal komposer sebenarnya.
- Jika kita berhenti pada titik ini, kita hanya dapat mengakses Composer dari desktop, dan hal ini tidak kita inginkan. Untuk memindahkannya ke jalur kami, kami menggunakan perintah
mv composer.phar /usr/local/bin/composer
.
Ups! Kami punya sedikit masalah dengan perintah kami. Tapi jangan khawatir, kita hanya perlu menggunakan sudo pada perintah kita, maka tampilannya akan seperti ini:
sudo mv composer.phar /usr/local/bin/composer
Ia meminta kata sandi kami dan kemudian memindahkan file ke direktori yang ditentukan.
- Untuk menyelesaikan prosesnya, kami memanggil Composer untuk memeriksa apakah ia berfungsi dengan baik dengan mengetikkan “composer” di terminal. Ini harus meluncurkan file yang dapat dieksekusi dan menampilkan pesan berikut.
Jika tidak berhasil, buka Finder Anda dan klik shift+command+G
dan memasukkannya usr/local/bin/ path
ke dalam pop-up.
Saya perhatikan bahwa file kita "composer.phar" sekarang disebut "composer" dan merupakan file yang dapat dieksekusi. Jika ternyata masih berupa file .phar, ganti saja namanya dan Anda bisa menggunakan perintah composer.
Catatan: Setelah ini selesai, Anda dapat menghapus penginstal menggunakan perintah berikut php -r "unlink('composer-setup.php');"
.
Pemasangan Guzzle dan Goutte
Alasan kami menginstal Guzzle adalah karena Goutte memerlukannya agar berfungsi dengan baik.
Berlari composer require guzzlehttp/guzzle
di terminal Anda untuk menginstal Guzzle dan composer require fabpot/goutte
Instal atau instal Goutte.
Ini akan memakan waktu beberapa detik dan kemudian kita dapat mulai menulis scraper kita.
3. Hapus semua judul dari halaman
Kami akan menggunakan Visual Studio Code, namun Anda dapat melanjutkan dengan editor teks favorit Anda.
Mari buat folder bernama "php_scraper_tutorial" dan buka di Visual Studio. Kemudian buka terminal baru dan instal Goutte di dalamnya composer require fabpot/goutte
.
Folder baru bernama “vendor” dan dua file (“composer.json” dan “composer.lock”) ditambahkan. Jika sudah siap, buat file baru bernama “php_scraper.php”. Folder Anda akan terlihat seperti ini:
require 'vendor/autoload.php';
use Goutte\Client;
$client = new Client();
Pemuatan otomatis PHP secara otomatis memuat setiap perpustakaan yang kita perlukan, menghemat banyak waktu dan sakit kepala. Kemudian kami membuka klien Goutte baru yang digunakan untuk mengirimkan permintaan.
Untuk melakukan ini, kami membuat instance baru yang disebut "$crawler" dan menentukan bahwa ia mengirimkan permintaan ke situs Newchic, menentukan metodenya - dalam kasus kami GET
– sebelum URL.
$crawler = $client->request('GET', 'https://www.newchic.com/women-t-shirts-c-3666/?mg_id=1&from=nav&country=223&NA=1')
Tapi kita tidak hanya menginginkan kode HTML saja bukan?
Setelah kita mendapatkan jawabannya, kita ingin menggunakan kelas CSS yang kita identifikasi sebelumnya untuk mengekstrak nama masing-masing kaos saja. Inilah saatnya filter()
datang untuk menyelamatkan hari itu.
$crawler->filter('.lg text-ellipsis d-block text-hover-underline text-s;econdary-hover font-small-12 text-grey product-item-name-js')->each(function($node){
var_dump($node->text());
});
Skrip kami akan memfilter semuanya Elemen yang sesuai dengan kelas yang kami tentukan dan melewati setiap node (karena kami memiliki lebih dari satu saat mengekstraksi semua elemen).
Namun, setelah menjalankan skrip, kami justru mendapatkan kesalahan fatal dan tidak ada yang dikembalikan.
Hal ini sangat umum terjadi pada web scraping (dan dalam lingkungan pengembangan apa pun) dan yang paling penting adalah jangan berkecil hati.
Setelah berkali-kali mencoba, kami menggunakan ekstensi Chrome SelectorGadget untuk mendapatkan pemilih CSS yang benar.
Rupanya masalahnya adalah skrip kami tidak dapat menemukan kelas yang seharusnya dicari. Jadi crash di tengah operasi.
Setelah memperbarui kode:
$crawler->filter('.product-item-name-js')->each(function($node){
var_dump($node->text());
});
Kami dapat menjalankan kode dan mendapatkan 60 nama produk di halaman:
Tunggu…Spanyol? Apa yang baru saja terjadi?
Situs web Newchic menampilkan konten yang berbeda tergantung pada lokasi Anda (seperti Amazon). Karena alamat IP yang kami kirimi permintaan berasal dari negara Amerika Latin, situs web merespons dengan halaman versi Spanyol.
Untuk menyiasatinya kita perlu mengubah alamat IP kita.
4. Integrasikan Scraper API dengan PHP untuk penargetan geografis
Scraper API adalah solusi yang menggabungkan proxy pihak ketiga, AI, dan data statistik bertahun-tahun untuk mencegah scraper kami diblokir oleh CAPTCHA, pelarangan, dan teknik anti-scraping lainnya.
Selain itu, API memungkinkan kita menjalankan JavaScript (untuk itu kita perlu menggunakan browser tanpa kepala) dan mengakses data spesifik geografis.
Pertama, mari buat akun Scraper API gratis untuk mendapatkan akses ke 5000 kredit API gratis (per bulan) dan kunci API kami.
Setelah kita berada di dashboard, kita akan menggunakan contoh cURL untuk membuat URL yang akan kita gunakan untuk skrip kita.
$crawler = $client->request('GET', 'http://api.scraperapi.com?api_key=51e43be283e4db2a5afb6266xxxxxxxx&url=https://www.newchic.com/women-t-shirts-c-3666/?mg_id=1&from=nav&country=223&NA=1&country_code=us');
Itu country_code
Parameter ini menginstruksikan API scraper untuk mengirim permintaan dari proksi AS.
Sekarang ketika kami menjalankan skrip kami, kami melihat bahwa konten yang dikembalikan sekarang dalam bahasa Inggris dan akan ditampilkan kepada pengguna AS di browser mereka.
Untuk daftar lengkap kode negara yang tersedia dan lainnya, lihat dokumentasi terperinci kami.
Catatan: Jika Anda ingin menerima data akses dari situs web yang memerlukan JavaScript untuk dijalankan, cukup atur saja render=true
dan ingat bahwa setiap parameter dipisahkan oleh &.
5. Hapus beberapa elemen dari halaman web
Di bagian ini kami mencampuradukkan sedikit hal. Kami ingin membuat variabel berbeda untuk setiap item yang ingin kami tangkap.
Pertama, mari kita ubah filter pertama sehingga scraper PHP kita mencari elemen yang membungkus nama, harga, dan tautan.
Kami membuat variabel baru untuk setiap elemen dan menggunakan fungsi filter() untuk menemukan elemen dalam $node.
crawler->filter('.product-item__bottom')->each(function($node){
$name = $node->filter('.product-item-name-js')->text();
$price = $node->filter('.product-price-js')->text();
Kami ingin menggunakan teks untuk harga dan nama, tetapi tidak demikian halnya dengan tautannya. Untuk mendapatkan nilai di dalam atribut href, kita menggunakan metode attr('href'). Untuk memastikan bahwa baris yang benar ditemukan, kami menambahkan tag a di pemilih CSS.
$link = $node->filter('a.product-item-name-js')->attr('href');
Setelah memperbarui file kami, akan terlihat seperti ini:
include 'vendor/autoload.php';
use Goutte\Client;
$client = new Client();
$crawler = $client->request('GET', 'http://api.scraperapi.com?api_key=51e43be283e4db2a5afb62660fc6ee44&url=https://www.newchic.com/women-t-shirts-c-3666/?mg_id=1&from=nav&country=223&NA=1&country_code=us');
$crawler->filter('.product-item__bottom')->each(function($node){
$name = $node->filter('.product-item-name-js')->text();
$price = $node->filter('.product-price-js')->text();
$link = $node->filter('a.product-item-name-js')->attr('href');
});
Ringkasan
Selamat! Anda baru saja membuat web scraper PHP pertama Anda dengan Goutte. Tentu masih banyak yang harus dipelajari.
Kami akan mengakhiri tutorial ini di sini untuk saat ini karena ini adalah pengenalan web scraping dengan PHP.
Dalam tutorial mendatang, kami akan memperluas kemampuan pengikis kami sehingga dapat mengikuti tautan untuk mengikis beberapa halaman dari sebuah skrip dan mengonversi data tergores menjadi file CSV yang dapat kami gunakan untuk analisis lebih lanjut.
Jika Anda ingin mempelajari lebih lanjut tentang web scraping, lihat tips kami untuk proyek scraping besar.
Untuk informasi selengkapnya tentang penggunaan Scraper API, lihat lembar contekan Scraper API dan halaman praktik terbaik scraping. Anda akan memahami tantangan terbesar yang dihadapi setiap web scraper dan cara mengatasinya dengan panggilan API sederhana.
Selamat bersenang-senang!