- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试自定义一个在 soundcloud 上播放歌曲并录制它的 puppeteer 脚本。使用 CSS 选择器,我也想打印歌曲持续时间。
我似乎无法让 CSS 选择器工作。我正在使用的网址是 https://soundcloud.com/octasine/octasine-audio-example-1
我现在有一个可用的 CSS 选择器,可以从页面中获取分钟和秒。我看到的挑战是有时页面还没有完成渲染,我使用 await page.waitForNavigation();
得到一个空数组返回。导致 promise 失败。
我缺少什么才能让 puppeteer 更可靠地工作?
这就是我使用 CSS 选择器的方式:
const work = async () => {
const inputsValues = [];
const inputElements = await page.$$('span.sc-visuallyhidden');
for (const element of inputElements) {
let inputValue;
inputValue = await element.getProperty('innerText');
inputValue = await inputValue.jsonValue();
if (inputValue.includes('Duration')){
console.log("DURATION");
mins = inputValue.split(" ")[1];
secs = inputValue.split(" ")[3];
console.log(mins);
console.log(secs);
console.log(inputValue);
}
inputsValues.push(inputValue);
}
console.log(inputsValues)
}
await work();
我的完整脚本
example.js
:
// example.js -- node version v14.17.2 -- dependency installed with npm i puppeteer-stream
const { launch, getStream } = require("puppeteer-stream");
const fs = require("fs");
const { Console } = require("console");
const file = fs.createWriteStream(__dirname + "/test.webm");
async function test() {
const browser = await launch();
const page = await browser.newPage();
await page.goto("https://soundcloud.com/octasine/octasine-audio-example-1");
// await page.waitForNavigation();
let html_var = await page.content();
// Write the file
fs.writeFile("example.html", html_var, function (err) {
// Checks if there is an error
if (err) return console.log(err);
});
console.log("Wrote html to example.html");
// await page.click("//a[contains(text(), 'Play')]");
await page.evaluate(() => {
let elements = document.getElementsByClassName('snippetUXPlayButton');
for (let element of elements)
element.click();
});
const work = async () => {
const inputsValues = [];
const inputElements = await page.$$('span.sc-visuallyhidden');
for (const element of inputElements) {
let inputValue;
inputValue = await element.getProperty('innerText');
inputValue = await inputValue.jsonValue();
if (inputValue.includes('Duration')){
console.log("DURATION");
mins = inputValue.split(" ")[1];
secs = inputValue.split(" ")[3];
console.log(mins);
console.log(secs);
console.log(inputValue);
}
inputsValues.push(inputValue);
}
console.log(inputsValues)
}
await work();
let page_url = await page.url();
console.log(page_url)
await page.evaluate(() => {
let elements = document.getElementsByClassName('sc-visuallyhidden');
for (let element of elements)
console.log(element.innerHTML);
});
const stream = await getStream(page, { audio: true, video: true });
console.log("recording");
stream.pipe(file);
setTimeout(async () => {
await stream.destroy();
file.close();
console.log("finished");
browser.close();
}, 1000 * 5 + mins * 60000 + secs * 1000);
}
test();
基于来自
https://www.npmjs.com/package/puppeteer-stream 的示例脚本的脚本
最佳答案
带有 span.sc-visuallyhidden
的元素选择器是一一动态填充到DOM中的,因此长度为$$('span.sc-visuallyhidden')
随着页面加载而增长。在您填写 inputElements
的那一刻数组它可能还不包含 Duration。
为了 100% 确保它在您的元素集中可用,您需要等到它被渲染到 DOM 中。例如。通过捕获它的确切选择器:
await page.waitForSelector('.playbackTimeline__duration > span.sc-visuallyhidden')
我建议重构你的
work()
用作
page.$$eval
像这样的方法:
const inputsValues = await page.$$eval('span.sc-visuallyhidden', elems => elems.map(el => el.innerText))
输出是:
8 months ago, 2,452 plays, View all likes, View all reposts, 10 followers, 2 tracks, 414 plays, View all likes, View all comments, Current time: 0 seconds, Duration: 2 minutes 26 seconds, Current track: Octasine Audio Example 1
...包含:
Duration: 2 minutes 26 seconds
您可以像以前一样处理到分钟和秒。
关于javascript - 如何在 puppeteer 中确定性地使用 CSS 选择器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68443623/
我使用 Deflater 编写了一个备份程序SHA-1 用于存储文件和哈希值。我看到Java的Deflater使用zlib 。如果我显式设置 Deflater 的级别,无论平台和 JRE 版本如何,我
考虑以下算法: r = 2 while r >= 1: x = -1 + 2 * random.random() y = -1 + 2 * random.random() r
我正在编写一个持久保存到磁盘的映射类。我目前只允许 str键,但如果我可以使用更多类型会很好:希望最多可以是任何可散列的(即与内置 dict 相同的要求),但更合理的是我会接受字符串、unicode、
我有一个不使用随机化的脚本,当我运行它时会给出不同的答案。我希望每次运行脚本时答案都是一样的。该问题似乎只发生在某些(病态)输入数据上。 该代码段来自一种计算线性系统特定类型 Controller 的
这对我来说不是问题,没有它我也可以生活,但我只是好奇这是否可能以及如何实现。 今天我了解到,scrapy.Request 不会按照启动的顺序完成。 伪代码示例: class SomeSpider(sc
我正在运行这个 SVD来自 scipy 的求解器,代码如下: import numpy as np from scipy.sparse.linalg import svds features = np
我正在尝试使用确定性 Miller-Rabin 算法实现素数检查功能,但结果并不总是正确的:在检查前 1,000,000 个数字时,它只找到 78,495 而不是 78,498。 这是使用 [2, 7
我正在审查各种 Android 声音 API,我想知道我应该使用哪一个。我的目标是获得低延迟的音频,或者至少是关于播放延迟的确定性行为。 我们遇到了很多问题,Android 声音 API 似乎很垃圾,
过去,我处理过对时间要求严格的软件开发。这些应用程序的开发基本上是这样进行的:“让我们编写代码,测试延迟和抖动,并优化它们,直到它们在可接受的范围内。”我觉得这非常令人沮丧。这不是我所说的 适当的工程
给定: SQL Server 表名为 TEST_TABLE TEST_TABLE 中名为 TEST_FIELD 的列 VARCHAR(50) NOT NULL 第 1 行:10YR3/6 第 2 行:
我在 64 位 Windows PC 上使用 Microsoft Visual Studio Community 2015,版本 14.xxx。 程序读取一个文本文件,其中每一行都是桥牌(四名玩家,每
我需要在 PHP 中创建一个可证明公平(确定性和种子)加密安全 (CS) 随机数生成器。我们正在运行 PHP 5,而 PHP 7 现在并不是一个真正的选择。但是,我找到了 PHP 7 的新 CS 函数
我是一名优秀的程序员,十分优秀!