Artikel ini akan berkongsi dengan anda pengalaman praktikal nod untuk melihat cara pengarang menggunakan nodej untuk merangkak lebih daripada 10,000 kertas dinding adik perempuan saya harap ia dapat membantu semua orang.
Helo, semua, saya Xiaoma, kenapa saya perlu memuat turun begitu banyak gambar? Beberapa hari yang lalu, saya menggunakan uni-app uniCloud untuk menggunakan applet kertas dinding secara percuma Kemudian saya memerlukan beberapa sumber untuk mengisi applet dengan kandungan.
Mula-mula mulakan projek dan pasang axios
dan cheerio
npm init -y && npm i axios cheerio
axios
untuk merangkak kandungan web, cheerio
Ia adalah jquery api di bahagian pelayan, kami menggunakannya untuk mendapatkan alamat imej dalam dom
const axios = require('axios') const cheerio = require('cheerio') function getImageUrl(target_url, containerEelment) { let result_list = [] const res = await axios.get(target_url) const html = res.data const $ = cheerio.load(html) const result_list = [] $(containerEelment).each((element) => { result_list.push($(element).find('img').attr('src')) }) return result_list }
Dengan cara ini, kami boleh mendapatkan url imej dalam halaman. Seterusnya, anda perlu memuat turun imej mengikut url.
Kaedah 1: Gunakan modul terbina dalam 'https' dan 'fs'
Gunakan nodejs Memuat turun fail boleh dilakukan menggunakan pakej terbina dalam atau perpustakaan pihak ketiga.
Kaedah GET digunakan dengan HTTPS untuk mendapatkan fail untuk dimuat turun. createWriteStream()
ialah kaedah yang digunakan untuk mencipta strim boleh tulis Ia hanya menerima satu parameter, iaitu lokasi di mana fail disimpan. Pipe()
ialah kaedah yang membaca data daripada strim boleh dibaca dan menulisnya ke strim boleh ditulis.
const fs = require('fs') const https = require('https') // URL of the image const url = 'GFG.jpeg' https.get(url, (res) => { // Image will be stored at this path const path = `${__dirname}/files/img.jpeg` const filePath = fs.createWriteStream(path) res.pipe(filePath) filePath.on('finish', () => { filePath.close() console.log('Download Completed') }) })
Kaedah 2: DownloadHelper
npm install node-downloader-helper
Berikut ialah kod untuk memuat turun imej daripada tapak web. Objek dl dicipta oleh kelas DownloadHelper, yang menerima dua parameter:
Pembolehubah Fail mengandungi URL imej yang akan dimuat turun dan pembolehubah filePath mengandungi laluan ke fail yang akan disimpan.
const { DownloaderHelper } = require('node-downloader-helper') // URL of the image const file = 'GFG.jpeg' // Path at which image will be downloaded const filePath = `${__dirname}/files` const dl = new DownloaderHelper(file, filePath) dl.on('end', () => console.log('Download Completed')) dl.start()
Kaedah 3: Gunakan muat turun
ditulis oleh npm master sindresorhus, ia sangat mudah digunakan
npm install download
Berikut ialah kod untuk memuat turun imej daripada tapak web. Fungsi muat turun menerima laluan fail dan fail.
const download = require('download') // Url of the image const file = 'GFG.jpeg' // Path at which image will get downloaded const filePath = `${__dirname}/files` download(file, filePath).then(() => { console.log('Download Completed') })
Saya pada asalnya ingin merangkak kertas dinding Baidu, tetapi peleraian tidak mencukupi, dan terdapat tera air, dsb. Kemudian, seorang rakan dalam kumpulan menemui API. Ia mungkin kertas dinding definisi tinggi pada APP mudah alih tertentu Anda boleh mendapatkan URL muat turun terus, jadi saya menggunakannya secara terus.
Berikut ialah kod lengkap
const download = require('download') const axios = require('axios') let headers = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 11_1_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36', } function sleep(time) { return new Promise((reslove) => setTimeout(reslove, time)) } async function load(skip = 0) { const data = await axios .get( 'http://service.picasso.adesk.com/v1/vertical/category/4e4d610cdf714d2966000000/vertical', { headers, params: { limit: 30, // 每页固定返回30条 skip: skip, first: 0, order: 'hot', }, } ) .then((res) => { return res.data.res.vertical }) .catch((err) => { console.log(err) }) await downloadFile(data) await sleep(3000) if (skip < 1000) { load(skip + 30) } else { console.log('下载完成') } } async function downloadFile(data) { for (let index = 0; index < data.length; index++) { const item = data[index] // Path at which image will get downloaded const filePath = `${__dirname}/美女` await download(item.wp, filePath, { filename: item.id + '.jpeg', headers, }).then(() => { console.log(`Download ${item.id} Completed`) return }) } } load()
Dalam kod di atas, anda mesti terlebih dahulu menetapkan User-Agent
dan menetapkan kelewatan 3s Ini boleh menghalang pelayan daripada menyekat perangkak dan secara langsung kembali 403.
Terus node index.js
dan gambar akan dimuat turun secara automatik.
,
!Pengalaman carian applet WeChat "Galeri Tembikai".
https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/c5301b8b97094e92bfae240d7eb1ec5e~tplv-k3u1fbpfcp-zoom-1.a>tutorial nodejs
Atas ialah kandungan terperinci Perkongsian praktikal: Gunakan nodej untuk merangkak dan memuat turun lebih daripada 10,000 imej. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!