Paket ini menyediakan kelas untuk meng-crawl link pada sebuah website. Di balik terpal, janji Guzzle digunakan untuk merayapi beberapa url secara bersamaan.
Karena perayap dapat menjalankan JavaScript, perayap dapat merayapi situs yang dirender JavaScript. Di bawah tenda Chrome dan Puppeteer digunakan untuk mendukung fitur ini.
Kami menginvestasikan banyak sumber daya untuk menciptakan paket sumber terbuka terbaik di kelasnya. Anda dapat mendukung kami dengan membeli salah satu produk berbayar kami.
Kami sangat menghargai Anda mengirimi kami kartu pos dari kota asal Anda, yang menyebutkan paket kami mana yang Anda gunakan. Anda akan menemukan alamat kami di halaman kontak kami. Kami mempublikasikan semua kartu pos yang diterima di dinding kartu pos virtual kami.
Paket ini dapat diinstal melalui Komposer:
komposer memerlukan spatie/crawler
Crawler dapat dipakai seperti ini
gunakan SpatieCrawlerCrawler; Perayap::buat() ->setCrawlObserver(<kelas yang memperluas SpatieCrawlerCrawlObserversCrawlObserver>) ->mulaiPerayapan($url);
Argumen yang diteruskan ke setCrawlObserver
harus berupa objek yang memperluas kelas abstrak SpatieCrawlerCrawlObserversCrawlObserver
:
namespace SpatieCrawlerCrawlObservers; gunakan GuzzleHttpExceptionRequestException; gunakan PsrHttpMessageResponseInterface; gunakan PsrHttpMessageUriInterface; kelas abstrak CrawlObserver {/* * Dipanggil ketika crawler akan meng-crawl url. */fungsi publik willCrawl(UriInterface $url, ?string $linkText): void{ }/* * Dipanggil ketika crawler berhasil meng-crawl url yang diberikan. */fungsi publik abstrak dirayapi(UriInterface $url,ResponseInterface $response, ?UriInterface $foundOnUrl = nol, ?string $linkTeks, ): void;/* * Dipanggil ketika crawler mengalami masalah saat merayapi url yang diberikan. */abstrak fungsi publik crawlFailed(UriInterface $url,RequestException $requestException, ?UriInterface $foundOnUrl = nol, ?string $linkText = nol, ): void;/** * Dipanggil ketika perayapan telah berakhir. */fungsi publik selesaiPerayapan(): void{ } }
Anda dapat mengatur banyak pengamat dengan setCrawlObservers
:
Perayap::buat() ->setCrawlObserver([ <kelas yang memperluas SpatieCrawlerCrawlObserversCrawlObserver>, <kelas yang memperluas SpatieCrawlerCrawlObserversCrawlObserver>, ... ]) ->mulaiPerayapan($url);
Alternatifnya, Anda dapat mengatur beberapa pengamat satu per satu dengan addCrawlObserver
:
Perayap::buat() ->addCrawlObserver(<kelas yang memperluas SpatieCrawlerCrawlObserversCrawlObserver>) ->addCrawlObserver(<kelas yang memperluas SpatieCrawlerCrawlObserversCrawlObserver>) ->addCrawlObserver(<kelas yang memperluas SpatieCrawlerCrawlObserversCrawlObserver>) ->mulaiPerayapan($url);
Secara default, crawler tidak akan menjalankan JavaScript. Inilah cara Anda mengaktifkan eksekusi JavaScript:
Perayap::buat() ->jalankanJavaScript() ...
Untuk memungkinkan mendapatkan body html setelah javascript dijalankan, paket ini bergantung pada paket Browsershot kami. Paket ini menggunakan Dalang di bawah tenda. Berikut beberapa petunjuk tentang cara menginstalnya di sistem Anda.
Browsershot akan menebak di mana dependensinya diinstal pada sistem Anda. Secara default, Crawler akan membuat instance Browsershot baru. Anda mungkin perlu menyetel instance yang dibuat khusus menggunakan metode setBrowsershot(Browsershot $browsershot)
.
Perayap::buat() ->setBrowsershot($browsershot) ->jalankanJavaScript() ...
Perhatikan bahwa perayap akan tetap berfungsi meskipun Anda tidak memiliki ketergantungan sistem yang diperlukan oleh Browsershot. Ketergantungan sistem ini hanya diperlukan jika Anda memanggil executeJavaScript()
.
Anda dapat memberitahu crawler untuk tidak mengunjungi url tertentu dengan menggunakan fungsi setCrawlProfile
. Fungsi tersebut mengharapkan objek yang memperluas SpatieCrawlerCrawlProfilesCrawlProfile
:
/* * Tentukan apakah url tertentu harus dirayapi. */fungsi publik mustCrawl(UriInterface $url): bool;
Paket ini dilengkapi dengan tiga CrawlProfiles
di luar kotak:
CrawlAllUrls
: profil ini akan merayapi semua url di semua halaman termasuk url ke situs eksternal.
CrawlInternalUrls
: profil ini hanya akan merayapi url internal di halaman host.
CrawlSubdomains
: profil ini hanya akan merayapi url internal dan subdomainnya di halaman host.
Anda dapat menyesuaikan cara tautan diekstraksi dari laman dengan meneruskan UrlParser
khusus ke perayap.
Perayap::buat() ->setUrlParserClass(<kelas yang mengimplementasikan SpatieCrawlerUrlParsersUrlParser>::class) ...
Secara default, LinkUrlParser
digunakan. Parser ini akan mengekstrak semua tautan dari atribut href
dari tag a
.
Ada juga SitemapUrlParser
bawaan yang akan mengekstrak & merayapi semua tautan dari peta situs. Itu mendukung file indeks peta situs.
Perayap::buat() ->setUrlParserClass(Peta SitusUrlParser::kelas) ...
Secara default, crawler akan mengikuti data robot. Dimungkinkan untuk menonaktifkan pemeriksaan ini seperti:
Perayap::buat() ->abaikanRobot() ...
Data robot dapat berasal dari file robots.txt
, tag meta, atau header respons. Informasi lebih lanjut tentang spesifikasi dapat ditemukan di sini: http://www.robotstxt.org/.
Parsing data robot dilakukan oleh paket spatie/robots-txt kami.
Secara default, crawler akan menolak semua link yang mengandung atribut rel = "nofollow". Dimungkinkan untuk menonaktifkan pemeriksaan ini seperti:
Perayap::buat() -> terimaNofollowLinks() ...
Untuk mematuhi aturan robots.txt untuk Agen Pengguna khusus, Anda dapat menentukan Agen Pengguna khusus Anda sendiri.
Perayap::buat() ->setUserAgent('agen-saya')
Anda dapat menambahkan grup aturan perayapan khusus untuk 'agen-saya' di robots.txt. Contoh ini melarang perayapan seluruh situs untuk perayap yang diidentifikasi oleh 'agen-saya'.
// Larang perayapan untuk agen-saya Agen pengguna: agen saya Larang: /
Untuk meningkatkan kecepatan perayapan, paket secara bersamaan merayapi 10 url secara default. Jika Anda ingin mengubah nomor tersebut Anda dapat menggunakan metode setConcurrency
.
Perayap::buat() ->setConcurrency(1) // sekarang semua url akan dirayapi satu per satu
Secara default, perayap terus melanjutkan hingga merayapi setiap laman yang dapat ditemukan. Perilaku ini mungkin menimbulkan masalah jika Anda bekerja di lingkungan dengan keterbatasan seperti lingkungan tanpa server.
Perilaku perayapan dapat dikontrol dengan dua opsi berikut:
Batas Perayapan Total ( setTotalCrawlLimit
): Batas ini menentukan jumlah maksimal URL yang akan dirayapi.
Batas Perayapan Saat Ini ( setCurrentCrawlLimit
): Ini menentukan berapa banyak URL yang diproses selama perayapan saat ini.
Mari kita lihat beberapa contoh untuk memperjelas perbedaan antara kedua metode ini.
Metode setTotalCrawlLimit
memungkinkan Anda membatasi jumlah total URL yang akan dirayapi, tidak peduli seberapa sering Anda memanggil crawler.
$queue = <pilihan/implementasi antrian Anda>;// Merangkak 5 URL dan berakhir.Crawler::create() ->setCrawlQueue($antrian) ->setTotalCrawlLimit(5) ->startCrawling($url);// Tidak merayapi lebih jauh setelah batas total tercapai.Crawler::create() ->setCrawlQueue($antrian) ->setTotalCrawlLimit(5) ->mulaiPerayapan($url);
setCurrentCrawlLimit
akan menetapkan batas berapa banyak URL yang akan dirayapi per eksekusi. Potongan kode ini akan memproses 5 halaman dengan setiap eksekusi, tanpa batasan total halaman yang akan dirayapi.
$queue = <pilihan/implementasi antrian Anda>;// Merangkak 5 URL dan berakhir.Crawler::create() ->setCrawlQueue($antrian) -> setel Batas Perayapan Saat Ini (5) ->startCrawling($url);// Merayapi 5 URL berikutnya dan berakhir.Crawler::create() ->setCrawlQueue($antrian) -> setel Batas Perayapan Saat Ini (5) ->mulaiPerayapan($url);
Kedua batasan tersebut dapat digabungkan untuk mengontrol crawler:
$queue = <pilihan/implementasi antrian Anda>;// Merangkak 5 URL dan berakhir.Crawler::create() ->setCrawlQueue($antrian) ->setTotalCrawlLimit(10) -> setel Batas Perayapan Saat Ini (5) ->startCrawling($url);// Merayapi 5 URL berikutnya dan berakhir.Crawler::create() ->setCrawlQueue($antrian) ->setTotalCrawlLimit(10) -> setel Batas Perayapan Saat Ini (5) ->startCrawling($url);// Tidak merayapi lebih jauh setelah batas total tercapai.Crawler::create() ->setCrawlQueue($antrian) ->setTotalCrawlLimit(10) -> setel Batas Perayapan Saat Ini (5) ->mulaiPerayapan($url);
Anda dapat menggunakan setCurrentCrawlLimit
untuk menghentikan perayapan yang berjalan lama. Contoh berikut menunjukkan pendekatan (yang disederhanakan). Ini terdiri dari permintaan awal dan sejumlah permintaan tindak lanjut yang melanjutkan perayapan.
Untuk mulai merayapi berbagai permintaan, Anda perlu membuat antrean baru dari driver antrean yang Anda pilih. Mulailah dengan meneruskan contoh antrian ke crawler. Perayap akan mulai mengisi antrean saat halaman diproses dan URL baru ditemukan. Buat serial dan simpan referensi antrian setelah crawler selesai (menggunakan batas crawl saat ini).
// Buat antrian menggunakan driver antrian Anda.$queue = <pilihan/implementasi antrian Anda>;// Merayapi set pertama URLsCrawler::create() ->setCrawlQueue($antrian) -> setel Batas Perayapan Saat Ini (10) ->startCrawling($url);// Buat serial dan simpan antrian Anda$serializedQueue = serialize($queue);
Untuk setiap permintaan berikut, Anda perlu membatalkan serialisasi antrean asli Anda dan meneruskannya ke crawler:
// Unserialize queue$queue = unserialize($serializedQueue);// Merayapi kumpulan URLsCrawler::create() berikutnya ->setCrawlQueue($antrian) -> setel Batas Perayapan Saat Ini (10) ->startCrawling($url);// Buat serial dan simpan antrian Anda$serialized_queue = serialize($queue);
Perilaku ini didasarkan pada informasi dalam antrian. Hanya jika contoh antrian yang sama diteruskan dalam perilaku berfungsi seperti yang dijelaskan. Ketika antrean yang benar-benar baru diteruskan, batas perayapan sebelumnya -bahkan untuk situs web yang sama- tidak akan berlaku.
Contoh dengan rincian lebih lanjut dapat ditemukan di sini.
Secara default, perayap terus melanjutkan hingga merayapi setiap laman URL yang disediakan. Jika Anda ingin membatasi kedalaman crawler Anda dapat menggunakan metode setMaximumDepth
.
Perayap::buat() -> setel Kedalaman Maksimum (2)
Kebanyakan halaman html berukuran cukup kecil. Namun crawler dapat secara tidak sengaja mengambil file besar seperti PDF dan MP3. Untuk menjaga penggunaan memori tetap rendah dalam kasus seperti itu, crawler hanya akan menggunakan respons yang lebih kecil dari 2 MB. Jika, saat melakukan streaming respons, ukurannya menjadi lebih besar dari 2 MB, crawler akan menghentikan streaming respons. Badan respons kosong akan diasumsikan.
Anda dapat mengubah ukuran respons maksimum.
// mari kita gunakan maksimal 3 MB. Crawler::create() ->setUkuranRespon Maksimum(1024 * 1024 * 3)
Dalam beberapa kasus, Anda mungkin mendapatkan batasan kecepatan saat melakukan crawling terlalu agresif. Untuk menghindari hal ini, Anda dapat menggunakan metode setDelayBetweenRequests()
untuk menambahkan jeda di antara setiap permintaan. Nilai ini dinyatakan dalam milidetik.
Perayap::buat() ->setDelayBetweenRequests(150) // Setelah setiap halaman dirayapi, crawler akan menunggu selama 150 md
Secara default, setiap halaman yang ditemukan akan diunduh (hingga ukuran setMaximumResponseSize()
) dan diurai untuk tautan tambahan. Anda dapat membatasi tipe konten mana yang harus diunduh dan diurai dengan mengatur setParseableMimeTypes()
dengan array tipe yang diizinkan.
Perayap::buat() ->setParseableMimeTypes(['teks/html', 'teks/polos'])
Hal ini akan mencegah pengunduhan isi halaman yang memiliki tipe mime berbeda, seperti file biner, audio/video, ... yang kemungkinan tidak memiliki tautan yang tertanam di dalamnya. Fitur ini sebagian besar menghemat bandwidth.
Saat merayapi sebuah situs, crawler akan memasukkan url yang akan dirayapi ke dalam antrian. Secara default, antrian ini disimpan dalam memori menggunakan ArrayCrawlQueue
bawaan.
Ketika sebuah situs sangat besar Anda mungkin ingin menyimpan antrian itu di tempat lain, mungkin di database. Dalam kasus seperti itu, Anda dapat menulis antrian perayapan Anda sendiri.
Antrian perayapan yang valid adalah kelas mana pun yang mengimplementasikan antarmuka SpatieCrawlerCrawlQueuesCrawlQueue
. Anda dapat meneruskan antrean perayapan khusus melalui metode setCrawlQueue
di perayap.
Perayap::buat() ->setCrawlQueue(<implementasi SpatieCrawlerCrawlQueuesCrawlQueue>)
Di Sini
ArrayCrawlQueue
RedisCrawlQueue (paket pihak ketiga)
CacheCrawlQueue untuk Laravel (paket pihak ketiga)
Model Laravel sebagai Antrian (aplikasi contoh pihak ketiga)
Secara default, crawler akan menyetel skema url dasar ke http
jika tidak ada. Anda memiliki kemampuan untuk mengubahnya dengan setDefaultScheme
.
Perayap::buat() ->setDefaultScheme('https')
Silakan lihat CHANGELOG untuk informasi lebih lanjut tentang apa yang berubah baru-baru ini.
Silakan lihat KONTRIBUSI untuk rinciannya.
Pertama, instal ketergantungan Puppeteer, atau pengujian Anda akan gagal.
npm install puppeteer
Untuk menjalankan pengujian, Anda harus memulai server berbasis node yang disertakan terlebih dahulu di jendela terminal terpisah.
tes cd/server instalasi npm simpul server.js
Dengan server berjalan, Anda dapat memulai pengujian.
tes komposer
Jika Anda menemukan bug terkait keamanan, silakan kirim email ke [email protected] alih-alih menggunakan pelacak masalah.
Anda bebas menggunakan paket ini, namun jika paket ini masuk ke lingkungan produksi Anda, kami sangat menghargai Anda mengirimi kami kartu pos dari kota asal Anda, yang menyebutkan paket kami mana yang Anda gunakan.
Alamat kami adalah: Spatie, Kruikstraat 22, 2018 Antwerp, Belgia.
Kami mempublikasikan semua kartu pos yang diterima di situs web perusahaan kami.
Freek Van der Herten
Semua Kontributor
Lisensi MIT (MIT). Silakan lihat File Lisensi untuk informasi lebih lanjut.