node_puppeteer无界爬虫
环境: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无界爬虫的更多相关文章
- 无界鼠标 Mouse Without Borders
最近遇到一个不爽的事,单位的办公电脑,配置低,自带笔记本电脑,屏幕小. 在给自己的笔记本电脑外接了22寸显示器以后,屏幕是舒服了很多,而且外接了微软的人机工学键鼠套装,加上自己的伪人机工学椅,舒适性确 ...
- [JSOI2016]无界单词[动态规划、kmp]
题意 题目链接 分析 对于第一问,枚举最终串最小的相同前后缀来统计答案. 由于最小的相同前后缀也是无界单词,所以可以考虑先求解子问题. 定义状态 \(f(i)\) 表示长度为 \(i\) 的串中有多少 ...
- python concurrent.futures.Threadpoolexcutor的有界队列和无界队列
1.默认是无界队列,如果生产任务的速度大大超过消费的速度,则会把生产任务无限添加到无界队列中,这样一来控制不了生产速度,二来是会造成系统内存会被队列中的元素堆积增多而耗尽. 2.改写为有界队列 cla ...
- 【LOJ】#2078. 「JSOI2016」无界单词
题解 用所有的方案减去有界的方案 我们规定两个前缀后缀相同时长度最短的,设长度为l,因为长度最短所以他们也是无界单词,可以递推 \(f[i] = \sum_{j = 1}^{\lfloor \frac ...
- oracle IMP-00085: 为无界导出文件指定了多个输入文件
导入按表导出的数据的时候,提示为无界导出文件指定了多个输入文件 命令如下: imp user/user@database file=e:\test.dmp 提示信息: Import: Release ...
- 有界、无界队列对ThreadPoolExcutor执行的影响
本文转载自https://blog.csdn.net/kusedexingfu/article/details/72491864 Java提供了4钟线程池: newCachedThreadPool n ...
- [转] Java 无界阻塞队列 DelayQueue 入门实战
原文出处:http://cmsblogs.com/ 『chenssy』 DelayQueue是一个支持延时获取元素的无界阻塞队列.里面的元素全部都是"可延期"的元素,列头的元素是最 ...
- mouse without borders无界鼠标使用教程
mouse without borders无界鼠标使用教程 摘自https://www.jianshu.com/p/6a0209ad03f8 老黑随笔 关注 0.4 2018.05.18 11: ...
- Java泛型(7):无界通配符<?>
无界通配符<?>很容易和原生类型混淆. 以List为例: List表示持有任何Object类型的原生List,其实就等价于List<Object> List<?>表 ...
随机推荐
- Idea里面远程提交spark任务到yarn集群
Idea里面远程提交spark任务到yarn集群 1.本地idea远程提交到yarn集群 2.运行过程中可能会遇到的问题 2.1首先需要把yarn-site.xml,core-site.xml,hdf ...
- 关于POI相关通用方法源码
设置宽度,1个汉字的宽度 导入excel用,返回行数 sheetName是sheet,显示名 导出excel 导出excel 获得excel数据 写输出,最后用 重新单元格指定位置 移到下一行,列开头 ...
- (Linux环境Kafka集群安装配置及常用命令
Linux环境Kafka集群安装配置及常用命令 Kafka 消息队列内部实现原理 Kafka架构 一.下载Kafka安装包 二.Kafka安装包的解压 三.设置环境变量 四.配置kafka文件 4.1 ...
- CS229 Lecture 02
最近忙成狗,各种意义上.第二章其实之前已经看过了但是已经完全忘记了,于是重新看了一遍当复习. 判别学习算法:直接学习$p(y|x)$,或学习一个假设$h_{\theta}(x)$输出结果 生成学习算法 ...
- java+js正则表达式获取URL(带端口)域名
function isPassUrl(remoteLoginUrl){ var flag = false; var passUrlStr = document.getElementById(" ...
- 并发队列:ArrayBlockingQueue实际运用场景和原理
ArrayBlockingQueue实际应用场景 之前在某公司做过一款情绪识别的系统,这套系统通过调用摄像头接口采集人脸信息,将采集的人脸信息做人脸识别和情绪分析,最终经过一定的算法将个人情绪数据转化 ...
- nginx教程<二>(高可用)
1.nginx集群 对于访问量较大的网站来说,随着流量的增加单台服务器已经无法处理所有的请求,这时候需要多台服务器对大量的请求进行分流处理,即负载均衡. 而如果实现负载均衡,必须在网站的入口部署服务器 ...
- 深入理解Java虚拟机读书笔记 -- Java内存区域
Graal VM: Run Programs Faster Anywhere. 跨语言全栈虚拟机,可以作为"任何语言"的运行平台使用. Java内存结构 程序计数器:线程私有,较小 ...
- git从安装到多账户操作一套搞定(二)多账户使用
作者:良知犹存 转载授权以及围观:欢迎添加微信:Allen-Iverson-me-LYN 总述 GIT是当今热门代码管理技术,但是如此火的系统,竟然是大神林纳斯花了两周用C写出来的一个分布式版 ...
- Codeforces Round #626 Div2 D. Present(位掩码,二分)
题目链接:https://codeforces.com/contest/1323/problem/D 题意:给了大小为4e5的数组a,其中1<=ai<=1e7.求所有点对和的异或和,即: ...