ホームページ >ウェブフロントエンド >jsチュートリアル >実用的な共有: Nodejs を使用して 10,000 を超える画像をクロールしてダウンロードする

実用的な共有: Nodejs を使用して 10,000 を超える画像をクロールしてダウンロードする

青灯夜游
青灯夜游転載
2022-03-24 19:49:284841ブラウズ

この記事では、著者が nodejs を使用して 10,000 枚以上の妹の壁紙をクロールした方法を確認するための node の実践的な経験を共有します。

実用的な共有: Nodejs を使用して 10,000 を超える画像をクロールしてダウンロードする

皆さん、こんにちは。私は Xiaoma です。なぜそんなにたくさんの写真をダウンロードする必要があるのですか? 数日前、uni-app uniCloud を使用して壁紙アプレットを無料でデプロイしましたが、アプレットにコンテンツを埋め込むためのリソースが必要になりました。

画像をクロールする

最初にプロジェクトを初期化し、axioscheerio

npm init -y && npm i axios cheerio

axios をインストールします。 Web コンテンツをクロールする場合、cheerio はサーバー側の jquery API であり、これを使用して dom 内の画像アドレスを取得します;

const axios = require('axios')
const cheerio = require('cheerio')

function getImageUrl(target_url, containerEelment) {
  let result_list = []
  const res = await axios.get(target_url)
  const html = res.data
  const $ = cheerio.load(html)
  const result_list = []
  $(containerEelment).each((element) => {
    result_list.push($(element).find('img').attr('src'))
  })
  return result_list
}

このようにして、画像の URL を取得できますページ内で。次に、URLに従って画像をダウンロードする必要があります。

nodejs を使用してファイルをダウンロードする方法

方法 1: 組み込みモジュール「https」と「fs」を使用する

使用nodejs ファイルのダウンロードは、組み込みパッケージまたはサードパーティのライブラリを使用して実行できます。

GET メソッドは、ダウンロードするファイルを取得するために HTTPS で使用されます。 createWriteStream() は、書き込み可能なストリームを作成するために使用されるメソッドで、ファイルの保存場所であるパラメーターを 1 つだけ受け取ります。 Pipe() は、読み取り可能なストリームからデータを読み取り、書き込み可能なストリームにデータを書き込むメソッドです。

const fs = require('fs')
const https = require('https')

// URL of the image
const url = 'GFG.jpeg'

https.get(url, (res) => {
  // Image will be stored at this path
  const path = `${__dirname}/files/img.jpeg`
  const filePath = fs.createWriteStream(path)
  res.pipe(filePath)
  filePath.on('finish', () => {
    filePath.close()
    console.log('Download Completed')
  })
})

方法 2: DownloadHelper

npm install node-downloader-helper

次は、Web サイトから画像をダウンロードするコードです。オブジェクト dl はクラス DownloadHelper によって作成され、次の 2 つのパラメータを受け取ります:

  1. ダウンロードされるイメージ。
  2. ダウンロード後に画像を保存する必要があるパス。

File 変数にはダウンロードされる画像の URL が含まれ、filePath 変数には保存されるファイルへのパスが含まれます。

const { DownloaderHelper } = require('node-downloader-helper')

// URL of the image
const file = 'GFG.jpeg'
// Path at which image will be downloaded
const filePath = `${__dirname}/files`

const dl = new DownloaderHelper(file, filePath)

dl.on('end', () => console.log('Download Completed'))
dl.start()

方法 3: ダウンロードを使用する

は npm マスター sindresorhus によって作成されており、非常に使いやすいです

npm install download

以下は、Web サイトから画像をダウンロードするコードです。ダウンロード関数は、ファイルとファイル パスを受け取ります。

const download = require('download')

// Url of the image
const file = 'GFG.jpeg'
// Path at which image will get downloaded
const filePath = `${__dirname}/files`

download(file, filePath).then(() => {
  console.log('Download Completed')
})

最終コード

当初は Baidu の壁紙をクロールしたかったのですが、解像度が十分ではなく、透かしなどが入っていました。その後、グループの友人が API を見つけました。某モバイルアプリの高画質壁紙は、ダウンロードURLを直接取得できるので、直接利用させていただきました。

次は完全なコードです

const download = require('download')
const axios = require('axios')

let headers = {
  'User-Agent':
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 11_1_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36',
}

function sleep(time) {
  return new Promise((reslove) => setTimeout(reslove, time))
}

async function load(skip = 0) {
  const data = await axios
    .get(
      'http://service.picasso.adesk.com/v1/vertical/category/4e4d610cdf714d2966000000/vertical',
      {
        headers,
        params: {
          limit: 30, // 每页固定返回30条
          skip: skip,
          first: 0,
          order: 'hot',
        },
      }
    )
    .then((res) => {
      return res.data.res.vertical
    })
    .catch((err) => {
      console.log(err)
    })
  await downloadFile(data)
  await sleep(3000)
  if (skip < 1000) {
    load(skip + 30)
  } else {
    console.log(&#39;下载完成&#39;)
  }
}

async function downloadFile(data) {
  for (let index = 0; index < data.length; index++) {
    const item = data[index]

    // Path at which image will get downloaded
    const filePath = `${__dirname}/美女`

    await download(item.wp, filePath, {
      filename: item.id + &#39;.jpeg&#39;,
      headers,
    }).then(() => {
      console.log(`Download ${item.id} Completed`)
      return
    })
  }
}

load()

上記のコードでは、最初に User-Agent を設定し、3 秒の遅延を設定する必要があります。これにより、サーバーがブロックされるのを防ぐことができますクローラーに直接アクセスして 403 を返します。

直接 nodeindex.js を実行すると、イメージが自動的にダウンロードされます。

実用的な共有: Nodejs を使用して 10,000 を超える画像をクロールしてダウンロードする実用的な共有: Nodejs を使用して 10,000 を超える画像をクロールしてダウンロードする

体験

WeChat アプレット検索「水瓜图」体験。

https://p6-juejin.byreimg.com/tos-cn-i-k3u1fbpfcp/c5301b8b97094e92bfae240d7eb1ec5e~tplv-k3u1fbpfcp-zoom-1.awebp?

その他のノード関連知識については、nodejs チュートリアル をご覧ください。

以上が実用的な共有: Nodejs を使用して 10,000 を超える画像をクロールしてダウンロードするの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はjuejin.cnで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。