ホームページ >ウェブフロントエンド >jsチュートリアル >Node がヘッドラインビデオをバッチでクロールして保存する方法 (コード実装)

Node がヘッドラインビデオをバッチでクロールして保存する方法 (コード実装)

不言
不言オリジナル
2018-09-19 17:02:252760ブラウズ

この記事の内容は、Node がヘッドラインビデオのバッチクロールと保存を実装する方法に関するものです。必要な方は参考にしていただければ幸いです。

はじめに

ビデオや画像をバッチでクロールする一般的なルーチンは、クローラーを使用してファイル リンクのコレクションを取得し、writeFile などのメソッドを使用してファイルを 1 つずつ保存することです。ただし、Toutiao のビデオ リンクは、クロールする必要がある HTML ファイル (サーバー側のレンダリング出力) にキャプチャできません。ビデオ リンクは、ページがクライアント側でレンダリングされるときに、特定の js ファイルのアルゴリズムまたは復号化メソッドを通じて、ビデオの既知のキーまたはハッシュ値に基づいて動的に計算され、ビデオ タグに追加されます。これはウェブサイトのクロール対策でもあります。

これらのページを参照すると、audit 要素を通じて計算されたファイル アドレスを確認できます。ただし、バッチでダウンロードする場合、ビデオ リンクを 1 つずつ手動で取得することはお勧めできません。幸いなことに、puppeteer は Chrome へのアクセスをシミュレートする機能を提供しており、ブラウザーによってレンダリングされた最終ページをクロールすることができます。

プロジェクトの開始

コマンド
npm i
npm start

注意: puppeteer のインストールプロセスは少し時間がかかります。気長にお待ちください。

設定ファイル

技術的なポイント

puppeteer

公式API

puppeteerは、ChromeまたはChromiumを制御するための高レベルのAPIを提供します。

puppeteer 主な機能:

  • Web ページを使用して PDF と画像を生成

  • SPA アプリケーションをクロールし、プリレンダリングを生成コンテンツ (つまり、「SSR」サーバー側レンダリング)

  • Web サイトからコンテンツをキャプチャできます

  • 自動化されたフォーム送信、UI テスト、キーボード入力など

使用する API:

  • puppeteer.launch() ブラウザ インスタンスを起動します

  • ブラウザ .newPage() 新しいページを作成します

  • page.goto() 指定した Web ページを入力します

  • page.screenshot() スクリーンショット

  • ##page.waitFor() ページは時間、特定の要素、または関数を待機します。

  • page.$eval()指定された要素。 document.querySelector

  • ##page.$$eval() と同等。特定のタイプの要素を取得します。 document.querySelectorAll
  • # と同等。 ##page.$( '#id .className') ドキュメント内の要素を取得します。操作は jQuery と似ています
  • コード例
// 配置相关
module.exports =  {
  originPath: 'https://www.ixigua.com', // 页面请求地址
  savePath: 'D:/videoZZ' // 存放路径
}
ビデオ ファイルのダウンロードメソッド

#ビデオのメインメソッドをダウンロード

    #
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()
        })
      }
      対象 Web サイト:
    • 西瓜video
      プロジェクト機能: 見出し番号 [ の下にある最新の 20 本のビデオをダウンロードします。 Weichen Finance]
    • プロジェクト アドレス:

      Github アドレス

    以上がNode がヘッドラインビデオをバッチでクロールして保存する方法 (コード実装)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

    声明:
    この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。