Maison >interface Web >js tutoriel >Comment Node peut-il explorer les vidéos de titres par lots et les enregistrer (implémentation du code)
Le contenu de cet article explique comment Node implémente l'exploration par lots et l'enregistrement des titres vidéo (implémentation du code). Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.
La méthode générale d'exploration de vidéos ou d'images par lots consiste à utiliser un robot d'exploration pour obtenir une collection de liens de fichiers, puis à enregistrer les fichiers un par un via des méthodes telles que writeFile. Cependant, le lien vidéo de Toutiao ne peut pas être capturé dans le fichier HTML (sortie de rendu côté serveur) qui doit être exploré. Le lien vidéo est calculé dynamiquement et ajouté à la balise vidéo en fonction de la clé connue ou de la valeur de hachage de la vidéo via l'algorithme ou la méthode de décryptage dans certains fichiers js lorsque la page est rendue côté client. Il s’agit également d’une mesure anti-exploration du site Web.
Lorsque nous parcourons ces pages, nous pouvons voir l'adresse du fichier calculée grâce à l'élément d'audit. Toutefois, lors de téléchargements par lots, il est évidemment déconseillé d’obtenir manuellement les liens vidéo un par un. Heureusement, Puppeteer offre la fonction de simulation d'accès à Chrome, nous permettant d'explorer la page finale rendue par le navigateur.
npm i npm start
Remarque : Le processus d'installation de Puppeteer est un peu lent, veuillez être patient.
Fichier de configuration// 配置相关 module.exports = { originPath: 'https://www.ixigua.com', // 页面请求地址 savePath: 'D:/videoZZ' // 存放路径 }
API officielle
puppeteer fournit une API de haut niveau pour contrôler Chrome ou Chromium.
Fonction principale du marionnettiste :
Utiliser des pages Web pour générer des PDF et des images
Explorer les applications SPA et générer des pré-rendus contenu (c'est-à-dire le rendu côté serveur "SSR")
Peut récupérer le contenu du site Web
Soumission automatisée de formulaires, tests d'interface utilisateur, saisie au clavier , etc.
API utilisée :
puppeteer.launch() lance l'instance du navigateur
browser .newPage() Créer une nouvelle page
page.goto() Entrez la page Web spécifiée
page.screenshot() Prenez une capture d'écran
page.waitFor() Page d'attente, qui peut être du temps, un certain élément, une certaine fonction
page.$eval( ) Récupère un élément spécifié, équivalent à document.querySelector
page.$$eval() pour obtenir certains types d'éléments, équivalent à document.querySelectorAll
page.$( '#id .className') Récupère un élément dans le document, l'opération est similaire à jQuery
Exemple de code
const puppeteer = require('puppeteer'); (async () => { const browser = await puppeteer.launch(); const page = await browser.newPage(); await page.goto('https://example.com'); await page.screenshot({path: 'example.png'}); await browser.close(); })();
Méthode principale de téléchargement de la vidéo
const downloadVideo = async video => { // 判断视频文件是否已经下载 if (!fs.existsSync(`${config.savePath}/${video.title}.mp4`)) { await getVideoData(video.src, 'binary').then(fileData => { console.log('下载视频中:', video.title) savefileToPath(video.title, fileData).then(res => console.log(`${res}: ${video.title}`) ) }) } else { console.log(`视频文件已存在:${video.title}`) } }
Obtenir des données vidéo
getVideoData (url, encoding) { return new Promise((resolve, reject) => { let req = http.get(url, function (res) { let result = '' encoding && res.setEncoding(encoding) res.on('data', function (d) { result += d }) res.on('end', function () { resolve(result) }) res.on('error', function (e) { reject(e) }) }) req.end() }) }
Enregistrer les données vidéo localement
savefileToPath (fileName, fileData) { let fileFullName = `${config.savePath}/${fileName}.mp4` return new Promise((resolve, reject) => { fs.writeFile(fileFullName, fileData, 'binary', function (err) { if (err) { console.log('savefileToPath error:', err) } resolve('已下载') }) }) }Site Web cible : Xigua Video
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!