이 기사의 내용은 Node가 헤드라인 동영상의 일괄 크롤링 및 저장(코드 구현)을 구현하는 방법에 대한 것입니다. 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.
동영상이나 사진을 일괄 크롤링하는 일반적인 방법은 크롤러를 사용하여 파일 링크 모음을 얻은 다음 writeFile과 같은 방법을 통해 파일을 하나씩 저장하는 것입니다. 그러나 크롤링해야 하는 html 파일(서버 측 렌더링 출력)에는 Toutiao의 비디오 링크를 캡처할 수 없습니다. 비디오 링크는 페이지가 클라이언트 측에서 렌더링될 때 특정 js 파일의 알고리즘이나 암호 해독 방법을 통해 비디오의 알려진 키 또는 해시 값을 기반으로 동적으로 계산되어 비디오 태그에 추가됩니다. 이는 웹사이트에 대한 크롤링 방지 조치이기도 합니다.
이 페이지를 탐색하면 감사 요소를 통해 계산된 파일 주소를 볼 수 있습니다. 그러나 일괄적으로 다운로드할 때 비디오 링크를 하나씩 수동으로 얻는 것은 분명히 바람직하지 않습니다. 다행스럽게도 puppeteer는 Chrome에 대한 액세스를 시뮬레이션하는 기능을 제공하여 브라우저에서 렌더링된 최종 페이지를 크롤링할 수 있습니다.
npm i npm start
주의사항: Puppeteer 설치 과정이 조금 느리니 인내심을 가지고 기다려주세요.
구성 파일// 配置相关 module.exports = { originPath: 'https://www.ixigua.com', // 页面请求地址 savePath: 'D:/videoZZ' // 存放路径 }
공식 API
puppeteer는 Chrome 또는 Chromium을 제어할 수 있는 고급 API를 제공합니다.
puppeteer 주요 기능:
웹 페이지를 사용하여 PDF 및 그림 생성
SPA 애플리케이션을 크롤링하고 사전 렌더링된 콘텐츠(예: "SSR" 서버측 렌더링) 생성
웹사이트에서 콘텐츠를 가져올 수 있습니다.
자동 양식 제출, UI 테스트, 키보드 입력 등
사용된 API:
puppeteer.launch() 브라우저 인스턴스 시작
browser.newPage() 새 페이지 만들기
page.goto() 지정된 웹페이지 입력
page.screenshot() 스크린샷
page.waitFor() 시간, 요소 또는 함수일 수 있는 페이지를 기다립니다.
page.$ eval() document.querySelector
page.$$eval() document.querySelectorAll
page.$('#에 해당하는 특정 유형의 요소를 가져옵니다. id .className') 문서의 요소 가져오기, 작업은 jQuery
코드 샘플
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(); })();
비디오 기본 방법 다운로드
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}`) } }
비디오 데이터 가져오기
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() }) }
will video 데이터는 로컬
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('已下载') }) }) }
위 내용은 노드가 헤드라인 동영상을 일괄 크롤링하고 저장하는 방법(코드 구현)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!