この記事では、著者が nodejs を使用して 10,000 枚以上の妹の壁紙をクロールした方法を確認するための node の実践的な経験を共有します。
皆さん、こんにちは。私は Xiaoma です。なぜそんなにたくさんの写真をダウンロードする必要があるのですか? 数日前、uni-app uniCloud を使用して壁紙アプレットを無料でデプロイしましたが、アプレットにコンテンツを埋め込むためのリソースが必要になりました。
最初にプロジェクトを初期化し、axios
と cheerio
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に従って画像をダウンロードする必要があります。
方法 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 つのパラメータを受け取ります:
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('下载完成') } } 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 + '.jpeg', headers, }).then(() => { console.log(`Download ${item.id} Completed`) return }) } } load()
上記のコードでは、最初に User-Agent
を設定し、3 秒の遅延を設定する必要があります。これにより、サーバーがブロックされるのを防ぐことができますクローラーに直接アクセスして 403 を返します。
直接 nodeindex.js
を実行すると、イメージが自動的にダウンロードされます。
、
WeChat アプレット検索「水瓜图」体験。
https://p6-juejin.byreimg.com/tos-cn-i-k3u1fbpfcp/c5301b8b97094e92bfae240d7eb1ec5e~tplv-k3u1fbpfcp-zoom-1.awebp?
その他のノード関連知識については、nodejs チュートリアル をご覧ください。
以上が実用的な共有: Nodejs を使用して 10,000 を超える画像をクロールしてダウンロードするの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。