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<?>表 ...
随机推荐
- Tomcat 核心组件 Container容器相关
前言 Engine容器 Host容器 前言 Connector把封装了Request对象以及Response对象的Socket传递给了Container容器,那么在Contianer容器中又是怎么样的 ...
- CentOS 安装TFTP
1.当然是使用yum安装最直接,一共会安装3个东东tftp.i386tftp-server.i386xinetd.i386[root@localhost CentOS]# yum -y install ...
- 802.1X
1.简介 IEEE802 LAN/WAN委员会为解决无线局域网网络安全问题,提出了802.1X协议.后来,802.1X协议作为局域网端口的一个普通接入控制机制在以太网中被广泛应用,主要解决以太网内认证 ...
- Java编程工具IDEA的使用
IDEA psvm + Enter 快速构建main方法 sout + Enter 快速打印与句 Ctrl+Shift + Enter,语句完成 Ctrl+F12,可以显示当前文件的结构 Ctrl + ...
- 前端html基础学习笔记二
表单 1 : 表单标签 <form></form> 属性 : action = '接口地址' method = 'get / post' name = '表单名称' 2 : 表 ...
- 每个开发人员都应该知道的WebSockets知识
转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 原文出处:https://blog.bitsrc.io/deep-dive-into-websockets- ...
- Codeforces Round #540 (Div. 3) B. Tanya and Candies (后缀和)
题意:有\(n\)个数,你可以任意去除某个位置的元素然后得到一个新数组,使得新数组奇数位和偶数的元素相等,现在问你有多少种情况合法. 题解:先求个后缀和,然后遍历,记录奇数和偶数位置的前缀和,删去\( ...
- Miller_Rabbin算法判断大素数
普通的素数测试我们有O(√ n)的试除算法.事实上,我们有O(s*log³n)的算法. 下面就介绍一下Miller_Rabbin算法思想: 定理一:假如p是质数,且(a,p)=1,那么a^(p-1)≡ ...
- 爬虫入门六 总结 资料 与Scrapy实例-bibibili番剧信息
title: 爬虫入门六 总结 资料 与Scrapy实例-bibibili番剧信息 date: 2020-03-16 20:00:00 categories: python tags: crawler ...
- 杭电多校HDU 6579 Operation (线性基 区间最大)题解
题意: 强制在线,求\(LR\)区间最大子集异或和 思路: 求线性基的时候,记录一个\(pos[i]\)表示某个\(d[i]\)是在某个位置更新进入的.如果插入时\(d[i]\)的\(pos[i]\) ...