环境:node----v14.5.0

vscode----2019

依赖库

   (需要自行设置好目录结构,否则会报目录错误)

  1. const puppeteer = require("puppeteer")
  2. const axios = require("axios")
  3. const fs = require("fs")
  4. const url = require("url")
  5. const path = require("path")
  6. //配置无界浏览器的启动参数
  7. let options = {
  8. defaultViewport: {
  9. width: 1536,
  10. height: 824
  11. },
  12. headless: false,
  13. ignoreDefaultArgs: "--enable-automation",
  14. // ignoreHTTPSErrors: true, // 忽略证书错误
  15. // devtools: true, // 开发者控制台
  16. }
  17. //删除目录文件(更新)
  18. function delDir(path) {
  19. let files = [];
  20. if (fs.existsSync(path)) {
  21. files = fs.readdirSync(path);
  22. files.forEach((file, index) => {
  23. let curPath = path + "/" + file;
  24. if (fs.statSync(curPath).isDirectory()) {
  25. delDir(curPath); //递归删除文件夹
  26. console.log("删除文件夹成功")
  27. } else {
  28. fs.unlinkSync(curPath); //删除文件
  29. console.log("删除文件成功")
  30. }
  31. });
  32. fs.rmdirSync(path);
  33. }
  34.  
  35. }
  36. //下载作用
  37. async function downMusic(eles) {
  38. let res = await axios.get(eles.src, { responseType: 'stream' });
  39. let artistIcon = path.extname(eles.src)
  40. let ws = fs.createWriteStream("./music/" + eles.alt + "/" + eles.alt + artistIcon, { flags: 'w' });
  41. res.data.pipe(ws)
  42. res.data.on("close", function() {
  43. console.log("下载完成!")
  44. ws.close()
  45. })
  46.  
  47. }
  48.  
  49. //主函数
  50. async function openChrome() {
  51. delDir("./music")
  52. fs.mkdir("./music", (err) => { if (err) { console.log(err) } else { console.log("创建成功:", "./music") } })
  53. let browser = await puppeteer.launch(options)
  54. let page = await browser.newPage()
  55. page.on('requestfailed', function() {
  56. console.log("连接超时")
  57. })
  58. page.on('console', function(args) {
  59. console.log(args._text)
  60. })
  61. await page.goto("https://music.migu.cn/v3/music/artist?tagId=1&type=A&firstLetter=1&page=1")
  62. let eles = await page.$$eval(".thumb-img.lazy-image", (elements) => {
  63. let eles = []
  64. elements.forEach(function(item, i) {
  65. let info = {
  66. alt: item.alt,
  67. src: item.src
  68. }
  69. eles.push(info)
  70. })
  71.  
  72. return eles;
  73.  
  74. })
  75. console.log(eles)
  76. eles.forEach((item, i) => {
  77. fs.mkdir("./music/" + item.alt, function(err) {
  78. if (err) { console.log(err) } else {
  79.  
  80. downMusic(item)
  81.  
  82. fs.mkdir("./music/" + item.alt + "/song", (err) => { if (err) { console.log(err) } else { console.log("创建成功:", "./music/" + item.alt + "/song") } })
  83. }
  84. })
  85. })
  86. let song_list = []
  87. let artist_a = await page.$$eval(".thumb-link", (elements) => {
  88. elements.forEach((element) => {
  89. console.log(element.href)
  90.  
  91. })
  92. })
  93.  
  94. }
  95. openChrome()

效果图如下:

node_puppeteer无界爬虫的更多相关文章

  1. 无界鼠标 Mouse Without Borders

    最近遇到一个不爽的事,单位的办公电脑,配置低,自带笔记本电脑,屏幕小. 在给自己的笔记本电脑外接了22寸显示器以后,屏幕是舒服了很多,而且外接了微软的人机工学键鼠套装,加上自己的伪人机工学椅,舒适性确 ...

  2. [JSOI2016]无界单词[动态规划、kmp]

    题意 题目链接 分析 对于第一问,枚举最终串最小的相同前后缀来统计答案. 由于最小的相同前后缀也是无界单词,所以可以考虑先求解子问题. 定义状态 \(f(i)\) 表示长度为 \(i\) 的串中有多少 ...

  3. python concurrent.futures.Threadpoolexcutor的有界队列和无界队列

    1.默认是无界队列,如果生产任务的速度大大超过消费的速度,则会把生产任务无限添加到无界队列中,这样一来控制不了生产速度,二来是会造成系统内存会被队列中的元素堆积增多而耗尽. 2.改写为有界队列 cla ...

  4. 【LOJ】#2078. 「JSOI2016」无界单词

    题解 用所有的方案减去有界的方案 我们规定两个前缀后缀相同时长度最短的,设长度为l,因为长度最短所以他们也是无界单词,可以递推 \(f[i] = \sum_{j = 1}^{\lfloor \frac ...

  5. oracle IMP-00085: 为无界导出文件指定了多个输入文件

    导入按表导出的数据的时候,提示为无界导出文件指定了多个输入文件 命令如下: imp user/user@database file=e:\test.dmp  提示信息: Import: Release ...

  6. 有界、无界队列对ThreadPoolExcutor执行的影响

    本文转载自https://blog.csdn.net/kusedexingfu/article/details/72491864 Java提供了4钟线程池: newCachedThreadPool n ...

  7. [转] Java 无界阻塞队列 DelayQueue 入门实战

    原文出处:http://cmsblogs.com/ 『chenssy』 DelayQueue是一个支持延时获取元素的无界阻塞队列.里面的元素全部都是"可延期"的元素,列头的元素是最 ...

  8. mouse without borders无界鼠标使用教程

    mouse without borders无界鼠标使用教程 摘自https://www.jianshu.com/p/6a0209ad03f8   老黑随笔 关注  0.4 2018.05.18 11: ...

  9. Java泛型(7):无界通配符<?>

    无界通配符<?>很容易和原生类型混淆. 以List为例: List表示持有任何Object类型的原生List,其实就等价于List<Object> List<?>表 ...

随机推荐

  1. Chrome标签整理

    程序人生 设计素材类网站 关于生活 求职相关网站 Web前端 科技新闻相关网站 优秀资源内含丰富学习资料 项目实例视频资料等 面试简历相关 适合初学者自学的编程网站 国内优秀博客 由于平时经常浏览一些 ...

  2. OutOfMemoryError系列

    OutOfMemoryError系列 1.[OutOfMemoryError系列(1): Java heap space](https://blog.csdn.net/renfufei/article ...

  3. 使用Spring MVC实现文件上传与下载

    前段时间做毕业设计的时候,想要完成一个上传文件的功能,后来,虽然在自己本地搭建了一个ftp服务器,然后使用公司的工具完成了一个文档管理系统:但是还是没有找到自己想要的文件上传与下载的方式. 今天看到一 ...

  4. Java二维数组转成稀疏sparsearray数组

    稀疏数组 基本介绍 当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组. 稀疏数组的处理方法是: 记录数组一共有几行几列,有多少个不同的值 把具有不同值的元素的行列及值记 ...

  5. docker(8)Dockerfile指令介绍

    前言 Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明. Dockerfile简介 Dockerfile是用来构建Docker镜像的构建文件,是由一系列 ...

  6. CF-1291 D - Irreducible Anagrams

    D. Irreducible Anagrams 题意 若两个字符串中每个字符的个数都是一样的,则称他们互为\(anagrams\).现在定义两个字符串s,t是\(reducible~anagram\) ...

  7. 最近公共祖先(LCA)---tarjan算法

    LCA(最近公共祖先).....可惜我只会用tarjan去做 真心感觉tarjan算法要比倍增算法要好理解的多,可能是我脑子笨吧略略略 最近公共祖先概念:在一棵无环的树上寻找两个点在这棵树上深度最大的 ...

  8. Color Changing Sofa Gym - 101962B、Renan and Cirque du Soleil Gym - 101962C、Hat-Xor Gym - 101962E 、Rei do Cangaço Gym - 101962K 、Sorting Machine Gym - 101962M

    Color Changing Sofa Gym - 101962B 题意:给你一个由字母构成的字符串a,再给你一个由0.1构成的字符串b.你需要在a字符串中找到一个可以放下b的位置,要保证b字符串中0 ...

  9. 牛客练习赛70 B.拼凑 (序列自动机)

    题意:有一个模板串,有\(T\)个字符串,从字符串中找到某个子串,使得这个子串中的子序列包含模板串,求最短的子串的长度. 题解:找子序列,很容易想到序列自动机,根据序列自动机的原理,我们一定可以确保除 ...

  10. 支撑性服务 & 自动化

    连载传送门: 什么是云原生? 云原生设计理念 .NET 微服务 谈到云原生,绕不开"容器化" Backing services 云原生系统依赖于许多不同的辅助资源,例如数据存储.消 ...