我正在尝试在thingiverse上自动下载多个文件。我随机选择一个物体。但是我很难找到我需要的链接,点击然后下载。有人遇到过这个问题吗我能得到帮助吗?
我已经尝试了其他几种变化。
import puppeteer from 'puppeteer';
async function main() {
const browser = await puppeteer.launch({
headless: true,
});
const page = await browser.newPage();
const response = await page.goto('https://www.thingiverse.com/thing:2033856/files');
const buttons = await page.$x(`//a[contains(text(), 'Download')]`);
if(buttons.length > 0){
console.log(buttons.length);
} else {
console.log('no buttons');
}
await wait(5000);
await browser.close();
return 'Finish';
}
async function wait(time: number) {
return new Promise(function (resolve) {
setTimeout(resolve, time);
});
}
function start() {
main()
.then((test) => console.log('DONE'))
.catch((reason) => console.log('Error: ', reason));
}
start();
下载页面
代码我能让它工作。选择器为:a[class^="ThingFile__download"]
木偶师是:const puppeteer = require('puppeteer-extra');
在await page.goto()
之前,我总是建议设置视口:
await page.setViewport({width: 1920, height: 720});
设置之后,将await page.goto()
更改为具有waitUntil
选项:
const response = await page.goto('https://www.thingiverse.com/thing:2033856/files', { waitUntil: 'networkidle0' }); // wait until page load
接下来,这是一个非常重要的部分。你必须做waitForSelector()
或waitForFunction()
。
我在const response
后面添加了这两行代码:
await page.waitForSelector('a[class^="ThingFile__download"]', {visible: true})
await page.waitForFunction("document.querySelector('a[class^="ThingFile__download"]') && document.querySelector('a[class^="ThingFile__download"]').clientHeight != 0");
接下来,获取buttons
。对于我的测试,我只是抓取了button
href
。
const buttons = await page.$eval('a[class^="ThingFile__download"]', anchor => anchor.getAttribute('href'));
最后,不要检查这个变量的.length
。在这种情况下,我们只是返回href
值,这是一个string
。当您尝试获取按钮时,您将获得Promise
的ElementHandle
:
const button = await page.$('a[class^="ThingFile__download"]');
console.log(button)
if (button) { ... }
现在,如果你将page.$
更改为page.$$
,你将获得Array<ElementHandle>
的Promise
,并且可以在那里使用.length
。
const buttonsAll = await page.$$('a[class^="ThingFile__download"]');
console.log(buttonsAll)
if (buttons.length > 0) { ... }