您的位置:首页 > 技术中心 > 前端框架 >

实战分享:利用nodejs​爬取并下载一万多张图片

时间:2022-03-29 11:22

本篇文章给大家分享一个node实战,看看作者是如何用 nodejs 爬了一万多张小姐姐壁纸的,希望对大家有所帮助!

哈喽,大家好,我是小马,为什么要下载这么多图片呢? 前几天使用 uni-app + uniCloud 免费部署了一个壁纸小程序,那么接下来就需要一些资源,给小程序填充内容。

爬取图片

首先初始化项目,并且安装 axioscheerio

  1. npm init -y && npm i axios cheerio

axios 用于爬取网页内容,cheerio 是服务端的 jquery api, 我们用它来获取 dom 中的图片地址;

  1. const axios = require('axios')
  2. const cheerio = require('cheerio')
  3. function getImageUrl(target_url, containerEelment) {
  4. let result_list = []
  5. const res = await axios.get(target_url)
  6. const html = res.data
  7. const $ = cheerio.load(html)
  8. const result_list = []
  9. $(containerEelment).each((element) => {
  10. result_list.push($(element).find('img').attr('src'))
  11. })
  12. return result_list
  13. }

这样就可以获取到页面中的图片 url 了。接下来需要根据 url 下载图片。

如何使用 nodejs 下载文件

方式一:使用内置模块 ‘https’ 和 ‘fs’

使用 nodejs 下载文件可以使用内置包或第三方库完成。

GET 方法用于 HTTPS 来获取要下载的文件。 createWriteStream() 是一个用于创建可写流的方法,它只接收一个参数,即文件保存的位置。Pipe()是从可读流中读取数据并将其写入可写流的方法。

  1. const fs = require('fs')
  2. const https = require('https')
  3. // URL of the image
  4. const url = 'GFG.jpeg'
  5. https.get(url, (res) => {
  6. // Image will be stored at this path
  7. const path = `${__dirname}/files/img.jpeg`
  8. const filePath = fs.createWriteStream(path)
  9. res.pipe(filePath)
  10. filePath.on('finish', () => {
  11. filePath.close()
  12. console.log('Download Completed')
  13. })
  14. })

方式二:DownloadHelper

  1. npm install node-downloader-helper

下面是从网站下载图片的代码。一个对象 dl 是由类 DownloadHelper 创建的,它接收两个参数:

  1. 将要下载的图像。
  2. 下载后必须保存图像的路径。

File 变量包含将要下载的图像的 URL,filePath 变量包含将要保存文件的路径。

  1. const { DownloaderHelper } = require('node-downloader-helper')
  2. // URL of the image
  3. const file = 'GFG.jpeg'
  4. // Path at which image will be downloaded
  5. const filePath = `${__dirname}/files`
  6. const dl = new DownloaderHelper(file, filePath)
  7. dl.on('end', () => console.log('Download Completed'))
  8. dl.start()

方法三: 使用 download

是 npm 大神 sindresorhus 写的,非常好用

  1. npm install download

下面是从网站下载图片的代码。下载函数接收文件和文件路径。

  1. const download = require('download')
  2. // Url of the image
  3. const file = 'GFG.jpeg'
  4. // Path at which image will get downloaded
  5. const filePath = `${__dirname}/files`
  6. download(file, filePath).then(() => {
  7. console.log('Download Completed')
  8. })

最终代码

本来想去爬百度壁纸,但是清晰度不太够,而且还有水印等,后来, 群里有个小伙伴找到了一个 api,估计是某个手机 APP 上的高清壁纸,可以直接获得下载的 url,我就直接用了。

下面是完整代码

  1. const download = require('download')
  2. const axios = require('axios')
  3. let headers = {
  4. 'User-Agent':
  5. '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',
  6. }
  7. function sleep(time) {
  8. return new Promise((reslove) => setTimeout(reslove, time))
  9. }
  10. async function load(skip = 0) {
  11. const data = await axios
  12. .get(
  13. 'http://service.picasso.adesk.com/v1/vertical/category/4e4d610cdf714d2966000000/vertical',
  14. {
  15. headers,
  16. params: {
  17. limit: 30, // 每页固定返回30条
  18. skip: skip,
  19. first: 0,
  20. order: 'hot',
  21. },
  22. }
  23. )
  24. .then((res) => {
  25. return res.data.res.vertical
  26. })
  27. .catch((err) => {
  28. console.log(err)
  29. })
  30. await downloadFile(data)
  31. await sleep(3000)
  32. if (skip < 1000) {
  33. load(skip + 30)
  34. } else {
  35. console.log('下载完成')
  36. }
  37. }
  38. async function downloadFile(data) {
  39. for (let index = 0; index < data.length; index++) {
  40. const item = data[index]
  41. // Path at which image will get downloaded
  42. const filePath = `${__dirname}/美女`
  43. await download(item.wp, filePath, {
  44. filename: item.id + '.jpeg',
  45. headers,
  46. }).then(() => {
  47. console.log(`Download ${item.id} Completed`)
  48. return
  49. })
  50. }
  51. }
  52. load()

上面代码中先要设置 User-Agent 并且设置 3s 延迟, 这样可以防止服务端阻止爬虫,直接返回 403。

直接 node index.js 就会自动下载图片了。

1.png2.png

体验

微信小程序搜索 “西瓜图库” 体验。

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

更多node相关知识,请访问:nodejs 教程!

以上就是实战分享:利用nodejs​爬取并下载一万多张图片的详细内容,更多请关注gxlsystem.com其它相关文章!

热门排行

今日推荐

热门手游