Tujuan utama crawler adalah mengumpulkan beberapa data spesifik yang tersedia untuk umum di Internet. Dengan menggunakan data ini, kita dapat menganalisis beberapa tren dan membandingkannya, atau melatih model untuk pembelajaran mendalam, dll. Dalam edisi ini, kami akan memperkenalkan paket node.js
yang khusus digunakan untuk perayapan web - node-crawler
, dan kami akan menggunakannya untuk menyelesaikan kasus perayap sederhana untuk merayapi gambar di laman web dan mengunduhnya secara lokal.
node-crawler
alat perayap node.js
ringan yang mempertimbangkan efisiensi dan kenyamanan. Alat ini mendukung sistem perayap terdistribusi, pengkodean keras, dan agen front-end http. Selain itu, ini seluruhnya ditulis dalam nodejs
dan secara inheren mendukung IO asinkron non-pemblokiran, yang memberikan kemudahan besar bagi mekanisme operasi pipeline crawler. Pada saat yang sama, ini mendukung pemilihan DOM
yang cepat (Anda dapat menggunakan sintaks jQuery
), yang dapat dikatakan sebagai fitur mematikan untuk tugas merayapi bagian tertentu dari halaman web. yang meningkatkan efisiensi pengembangan crawler.
, pertama-tama kita membuat proyek baru dan membuat index.js sebagai file entri.
Kemudian instal perpustakaan perayap node-crawler
.
#PNPM pnpm menambahkan perayap #NPM npm i -S perayap #benang benang tambahkan crawler
dan kemudian gunakan require
untuk memperkenalkannya.
// indeks.js const Crawler = memerlukan("crawler");
// index.js biarkan perayap = Perayap baru({ batas waktu:10000, jQuery: benar, }) fungsi getImages(uri) { crawler.antrian({ kamu, panggilan balik: (err, res, selesai) => { jika (err) membuang err; } }) }
Mulai sekarang kita akan mulai menulis metode untuk mendapatkan gambar halaman html. Setelah crawler
dipakai, crawler ini terutama digunakan untuk menulis link dan metode callback dalam antriannya. Fungsi panggilan balik ini akan dipanggil setelah setiap permintaan diproses.
Perlu juga dicatat di sini bahwa Crawler
menggunakan perpustakaan request
, sehingga daftar parameter yang tersedia untuk konfigurasi Crawler
adalah superset dari parameter perpustakaan request
, yaitu, semua konfigurasi di perpustakaan request
berlaku untuk Crawler
.
Mungkin Anda juga baru saja melihat parameter jQuery
. Anda dapat menebaknya dengan benar, ini dapat menggunakan sintaks jQuery
untuk menangkap elemen DOM
.
// indeks.js biarkan data = [] fungsi getImages(uri) { crawler.antrian({ kamu, panggilan balik: (err, res, selesai) => { jika (err) membuang err; misalkan $ = res.$; mencoba { misalkan $imgs = $("img"); Objek.kunci($imgs).forEach(indeks => { biarkan img = $imgs[indeks]; const { tipe, nama, atribut = {} } = img; biarkan src = attribs.src ||. if (ketik === "tag" && src && !data.includes(src)) { biarkan fileSrc = src.startsWith('http') ? src : `https:${src}` biarkan Namafile = src.split("/")[src.split("/").panjang-1] downloadFile(fileSrc, fileName) // Cara mendownload gambar data.push(src) } }); } tangkapan (e) { konsol.kesalahan(e); Selesai() } Selesai(); } }) }
Anda dapat melihat bahwa Anda baru saja menggunakan $
untuk mengambil tag img
dalam permintaan. Kemudian kita menggunakan logika berikut untuk memproses link ke gambar yang sudah selesai dan menghapus namanya sehingga bisa disimpan dan diberi nama nanti. Array juga ditentukan di sini, tujuannya adalah untuk menyimpan alamat gambar yang diambil. Jika alamat gambar yang sama ditemukan pada pengambilan berikutnya, pengunduhan tidak akan diproses berulang kali.
Berikut ini adalah informasi yang dicetak menggunakan $("img")
untuk menangkap HTML halaman beranda Nuggets:
mendownload gambar,
kita perlu menginstal paket nodejs
- axios
. Ya, Anda membacanya dengan benar. axios
tidak hanya disediakan untuk front end, tetapi juga dapat digunakan oleh back end. Namun karena pengunduhan gambar perlu diproses menjadi aliran data, responseType
disetel ke stream
. Kemudian Anda bisa menggunakan metode pipe
untuk menyimpan file aliran data.
const { default: aksio } = memerlukan("aksios"); const fs = memerlukan('fs'); fungsi async unduhFile(uri, nama) { biarkan dir = "./imgs" jika (!fs.existsSync(dir)) { tunggu fs.mkdirSync(dir) } biarkan filePath = `${dir}/${nama}` biarkan res = menunggu aksio({ url: uri, tipe respons: 'aliran' }) biarkan ws = fs.createWriteStream(filePath) res.data.pipa(ws) res.data.on("tutup",()=>{ ws.close(); }) }
Karena gambarnya mungkin banyak, jadi jika Anda ingin memasukkannya ke dalam satu folder, Anda perlu menentukan apakah folder tersebut ada. Jika tidak, buatlah satu. Kemudian gunakan metode createWriteStream
untuk menyimpan aliran data yang diperoleh ke folder dalam bentuk file.
Kemudian kita bisa mencobanya. Misalnya, kita mengambil gambar di bawah html beranda Nuggets:
// index.jsSetelah menjalankan
getImages("https://juejin.cn/"),
Anda dapat menemukan bahwa semua gambar dalam html statis telah diambil.
simpul indeks.js
Kesimpulan
Pada akhirnya, Anda juga dapat melihat bahwa kode ini mungkin tidak berfungsi untuk SPA (Aplikasi Halaman Tunggal). Karena hanya ada satu file HTML dalam satu halaman aplikasi, dan semua konten di halaman web dirender secara dinamis, apa pun yang terjadi, Anda dapat langsung menangani permintaan datanya untuk mengumpulkan informasi yang Anda inginkan .
Hal lain yang ingin saya sampaikan adalah banyak teman yang menggunakan request.js
untuk memproses permintaan download gambar. Tentu saja hal ini mungkin, dan bahkan jumlah kodenya lebih kecil pada tahun 2020. Sudah tidak digunakan lagi. Lebih baik beralih ke perpustakaan yang terus diperbarui dan dipelihara.