>  기사  >  웹 프론트엔드  >  노드가 헤드라인 동영상을 일괄 크롤링하고 저장하는 방법(코드 구현)

노드가 헤드라인 동영상을 일괄 크롤링하고 저장하는 방법(코드 구현)

不言
不言원래의
2018-09-19 17:02:252722검색

이 기사의 내용은 Node가 헤드라인 동영상의 일괄 크롤링 및 저장(코드 구현)을 구현하는 방법에 대한 것입니다. 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.

소개

동영상이나 사진을 일괄 크롤링하는 일반적인 방법은 크롤러를 사용하여 파일 링크 모음을 얻은 다음 writeFile과 같은 방법을 통해 파일을 하나씩 저장하는 것입니다. 그러나 크롤링해야 하는 html 파일(서버 측 렌더링 출력)에는 Toutiao의 비디오 링크를 캡처할 수 없습니다. 비디오 링크는 페이지가 클라이언트 측에서 렌더링될 때 특정 js 파일의 알고리즘이나 암호 해독 방법을 통해 비디오의 알려진 키 또는 해시 값을 기반으로 동적으로 계산되어 비디오 태그에 추가됩니다. 이는 웹사이트에 대한 크롤링 방지 조치이기도 합니다.

이 페이지를 탐색하면 감사 요소를 통해 계산된 파일 주소를 볼 수 있습니다. 그러나 일괄적으로 다운로드할 때 비디오 링크를 하나씩 수동으로 얻는 것은 분명히 바람직하지 않습니다. 다행스럽게도 puppeteer는 Chrome에 대한 액세스를 시뮬레이션하는 기능을 제공하여 브라우저에서 렌더링된 최종 페이지를 크롤링할 수 있습니다.

프로젝트 시작

Command
npm i
npm start

주의사항: Puppeteer 설치 과정이 조금 느리니 인내심을 가지고 기다려주세요.

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

기술 포인트

puppeteer

공식 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('已下载')
    })
  })
}
에 저장됩니다. 대상 웹사이트: Xigua Video
프로젝트 기능: 헤드라인 계정 [Weichen Finance]에서 최신 20개의 비디오를 다운로드합니다.
프로젝트 주소: Github 주소

위 내용은 노드가 헤드라인 동영상을 일괄 크롤링하고 저장하는 방법(코드 구현)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.