Heim  >  Artikel  >  Web-Frontend  >  Wie kann Node Schlagzeilenvideos stapelweise crawlen und speichern (Code-Implementierung)?

Wie kann Node Schlagzeilenvideos stapelweise crawlen und speichern (Code-Implementierung)?

不言
不言Original
2018-09-19 17:02:252683Durchsuche

Der Inhalt dieses Artikels befasst sich mit der Implementierung des Batch-Crawlings und der Speicherung von Schlagzeilenvideos (Code-Implementierung). Ich hoffe, dass er für Sie hilfreich ist.

Einführung

Die allgemeine Methode zum stapelweisen Crawlen von Videos oder Bildern besteht darin, mit einem Crawler eine Sammlung von Dateilinks abzurufen und die Dateien dann einzeln mit Methoden wie writeFile zu speichern. Das Video von Toutiao kann jedoch den Videolink in der zu crawlenden HTML-Datei nicht erfassen (serverseitige Rendering-Ausgabe). Der Videolink wird dynamisch berechnet und dem Video-Tag hinzugefügt, basierend auf dem bekannten Schlüssel oder Hash-Wert des Videos durch den Algorithmus oder die Entschlüsselungsmethode in bestimmten js-Dateien, wenn die Seite auf der Clientseite gerendert wird. Dies ist auch eine Anti-Crawling-Maßnahme für die Website.

Wenn wir diese Seiten durchsuchen, können wir die berechnete Dateiadresse über das Audit-Element sehen. Bei stapelweisen Downloads ist es jedoch natürlich nicht ratsam, die Videolinks einzeln manuell abzurufen. Glücklicherweise bietet Puppeteer die Funktion, den Zugriff auf Chrome zu simulieren, sodass wir die endgültige vom Browser gerenderte Seite crawlen können.

Projektstart

Befehl
npm i
npm start

Hinweis: Die Installation von Puppeteer ist etwas langsam, bitte warten Sie geduldig.

Konfigurationsdatei
// 配置相关
module.exports =  {
  originPath: 'https://www.ixigua.com', // 页面请求地址
  savePath: 'D:/videoZZ' // 存放路径
}

Technische Punkte

puppeteer

Offizielle API

puppeteer bietet eine High-Level-API zur Steuerung von Chrome oder Chromium.

Puppenspieler-Hauptfunktion:

  • Webseiten verwenden, um PDFs und Bilder zu generieren

  • SPA-Anwendungen crawlen und vorgerenderte Dateien generieren Inhalt (d. h. serverseitiges „SSR“-Rendering)

  • Kann Inhalte von der Website abrufen

  • Automatisierte Formularübermittlung, UI-Tests, Tastatureingabe usw.

Verwendete API:

  • puppeteer.launch() startet die Browserinstanz

  • browser .newPage() Eine neue Seite erstellen

  • page.goto() Geben Sie die angegebene Webseite ein

  • page.screenshot() Machen Sie einen Screenshot

  • page.waitFor() Seitenwartezeit, das kann Zeit, ein bestimmtes Element, eine bestimmte Funktion sein

  • page.$eval( ) Rufen Sie ein angegebenes Element ab, äquivalent zu document.querySelector

  • page.$$eval(), um bestimmte Arten von Elementen abzurufen, äquivalent zu document.querySelectorAll

  • page.$( '#id .className') Um ein Element im Dokument abzurufen, ähnelt der Vorgang jQuery

Codebeispiel

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();
})();

Methode zum Herunterladen von Videodateien

  • Hauptmethode für das Herunterladen von Videos

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}`)
  }
}
  • Videodaten abrufen

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()
  })
}
  • Videodaten lokal speichern

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('已下载')
    })
  })
}
Zielwebsite: Xigua Video
Projektfunktion: Laden Sie die neuesten 20 Videos unter der Überschrift herunter Nummer [Weichen Finance]
Projektadresse: Github-Adresse

Das obige ist der detaillierte Inhalt vonWie kann Node Schlagzeilenvideos stapelweise crawlen und speichern (Code-Implementierung)?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn