Heim >Web-Frontend >js-Tutorial >Wie kann Node Schlagzeilenvideos stapelweise crawlen und speichern (Code-Implementierung)?
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.
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.
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' // 存放路径 }
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(); })();
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
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!