Maison >interface Web >js tutoriel >Comment Node peut-il explorer les vidéos de titres par lots et les enregistrer (implémentation du code)

Comment Node peut-il explorer les vidéos de titres par lots et les enregistrer (implémentation du code)

不言
不言original
2018-09-19 17:02:252767parcourir

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.

Introduction

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.

Démarrage du projet

Commande
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' // 存放路径
}

Points techniques

puppeteer

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 de téléchargement de fichiers vidéo

  • 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
Fonction de projet : Télécharger le numéro du titre [Weichen Finance] Les 20 dernières vidéos
Adresse du projet : Adresse Github

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn