环境:node----v14.5.0

vscode----2019

依赖库

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

const puppeteer = require("puppeteer")
const axios = require("axios")
const fs = require("fs")
const url = require("url")
const path = require("path")
//配置无界浏览器的启动参数
let options = {
defaultViewport: {
width: 1536,
height: 824
},
headless: false,
ignoreDefaultArgs: "--enable-automation",
// ignoreHTTPSErrors: true, // 忽略证书错误
// devtools: true, // 开发者控制台
}
//删除目录文件(更新)
function delDir(path) {
let files = [];
if (fs.existsSync(path)) {
files = fs.readdirSync(path);
files.forEach((file, index) => {
let curPath = path + "/" + file;
if (fs.statSync(curPath).isDirectory()) {
delDir(curPath); //递归删除文件夹
console.log("删除文件夹成功")
} else {
fs.unlinkSync(curPath); //删除文件
console.log("删除文件成功")
}
});
fs.rmdirSync(path);
} }
//下载作用
async function downMusic(eles) {
let res = await axios.get(eles.src, { responseType: 'stream' });
let artistIcon = path.extname(eles.src)
let ws = fs.createWriteStream("./music/" + eles.alt + "/" + eles.alt + artistIcon, { flags: 'w' });
res.data.pipe(ws)
res.data.on("close", function() {
console.log("下载完成!")
ws.close()
}) } //主函数
async function openChrome() {
delDir("./music")
fs.mkdir("./music", (err) => { if (err) { console.log(err) } else { console.log("创建成功:", "./music") } })
let browser = await puppeteer.launch(options)
let page = await browser.newPage()
page.on('requestfailed', function() {
console.log("连接超时")
})
page.on('console', function(args) {
console.log(args._text)
})
await page.goto("https://music.migu.cn/v3/music/artist?tagId=1&type=A&firstLetter=1&page=1")
let eles = await page.$$eval(".thumb-img.lazy-image", (elements) => {
let eles = []
elements.forEach(function(item, i) {
let info = {
alt: item.alt,
src: item.src
}
eles.push(info)
}) return eles; })
console.log(eles)
eles.forEach((item, i) => {
fs.mkdir("./music/" + item.alt, function(err) {
if (err) { console.log(err) } else { downMusic(item) fs.mkdir("./music/" + item.alt + "/song", (err) => { if (err) { console.log(err) } else { console.log("创建成功:", "./music/" + item.alt + "/song") } })
}
})
})
let song_list = []
let artist_a = await page.$$eval(".thumb-link", (elements) => {
elements.forEach((element) => {
console.log(element.href) })
}) }
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. C++类基本--随笔二

    1 #include <iostream> 2 #include <string.h> 3 using namespace std; 4 5 class Internet 6 ...

  2. WPS Excel启用正则表达式

    WPS Excel启用正则表达式 新建一个空白表格文件 进入VB编辑器 插入模块 工具-引用-勾选正则表达式 (Microsoft VBScript Regular Express 5.5) 复制代码 ...

  3. C - C(换钱问题)

    换钱问题: 给出n种钱,m个站点,现在有第 s种钱,身上有v 这么多: 下面 m行 站点有a,b两种钱,rab a->b的汇率,cab a-->b的手续费, 相反rba cba :  问在 ...

  4. AWS注册到连接

    1. 注册AWS账号 https://www.cnblogs.com/cmt/p/13912814.html 2.注册完成之后,选择实例 Ubuntu,下载xxx.pem文件,查看实例得到ip 比如我 ...

  5. Python+Selenium+Mysql(动态获取数据,数据库交互)

    一.创建数据库连接 #!coding:utf-8 import pymysql ''' Python3之后不再支持MySQLdb的方式进行访问mysql数据库: 可以采用pymysql的方式 连接方式 ...

  6. Navicat 快捷键 for Mysql

     常用快捷键: 1. ctrl + q: 打开新查询窗口 2. ctrl + r: 运行当前窗口内的所有语句 3. ctrl + w: 关闭当前窗口 4. F6: 打开一个MySQL命令行窗口 5. ...

  7. jmespath(2)投影Projections

    投影 投影是JMESPath的关键特性之一.它允许您将表达式应用于元素集合.有五种投影: 列表投影 切片投影 对象投影 展平投影 过滤投影 处理投影需要注意的点 投影评估分为两个步骤.左侧(LHS)创 ...

  8. 牛客网多校第5场 I vcd 【树状数组+离散化处理】【非原创】

    题目:戳这里 学习博客:戳这里 作者:阿狸是狐狸啦 n个点,一个点集S是好的,当且仅当对于他的每个子集T,存在一个右边无限延长的矩形,使的这个矩形包含了T,但是和S-T没有交集. 求有多少个这种集合. ...

  9. POJ - 3280 Cheapest Palindrome 【区间dp】【非原创】

    Keeping track of all the cows can be a tricky task so Farmer John has installed a system to automate ...

  10. Leetcode(22)-括号生成

    给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合. 例如,给出 n = 3,生成结果为: [ "((()))", "(()())& ...