傀儡师。 Page.evluate() 不是 运行 或没有得到结果
Puppeteer. Page.evluate() is not running or not getting results
我正在尝试 运行 Pupeteer 的一个非常简单的例子。但是在 page.evalute() 方法中什么也没发生,没有错误,没有结果。我做错了什么?
const puppeteer = require("puppeteer");
module.exports = class zrGrabber {
async startGrabbing() {
try {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto('https://www.zr.ru/news/avtomobili/');
await page.evaluate(() => {
const links = document.querySelectorAll(`div.head > h2 > a`)
console.log(links)
});
browser.close();
} catch (err) {
console.log(err)
}
}
}
这就是 运行在 Node 上的表现:
const http = require('http');
const port = 3000;
const cron = require('node-cron');
const zrGrabber = require('./grabbers/zr.grabber');
const requestHandler = (request, response) => {
response.end('Hello Node.js Server!')
}
const server = http.createServer(requestHandler)
server.listen(port, (err) => {
cron.schedule('* * * * *', async () => {
const zr = new zrGrabber();
await zr.startGrabbing();
});
if (err) {
return console.log('something bad happened', err)
}
console.log(`server is listening on ${port}`)
})
console.log(links)
是在页面上下文中执行的,所以links
是在浏览器控制台输出的(如果你在可见模式下启动Chrome并打开DevTools就可以看到它在关闭浏览器之前)。如果你需要这个在Node.js进程控制台中输出,你需要return可序列化的值,获取它并在Node.js上下文中管理它:
const links = await page.evaluate(() => {
const links = document.querySelectorAll(`div.head > h2 > a`);
return [...links].map(link => link.href);
});
console.log(links);
browser.close();
我正在尝试 运行 Pupeteer 的一个非常简单的例子。但是在 page.evalute() 方法中什么也没发生,没有错误,没有结果。我做错了什么?
const puppeteer = require("puppeteer");
module.exports = class zrGrabber {
async startGrabbing() {
try {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto('https://www.zr.ru/news/avtomobili/');
await page.evaluate(() => {
const links = document.querySelectorAll(`div.head > h2 > a`)
console.log(links)
});
browser.close();
} catch (err) {
console.log(err)
}
}
}
这就是 运行在 Node 上的表现:
const http = require('http');
const port = 3000;
const cron = require('node-cron');
const zrGrabber = require('./grabbers/zr.grabber');
const requestHandler = (request, response) => {
response.end('Hello Node.js Server!')
}
const server = http.createServer(requestHandler)
server.listen(port, (err) => {
cron.schedule('* * * * *', async () => {
const zr = new zrGrabber();
await zr.startGrabbing();
});
if (err) {
return console.log('something bad happened', err)
}
console.log(`server is listening on ${port}`)
})
console.log(links)
是在页面上下文中执行的,所以links
是在浏览器控制台输出的(如果你在可见模式下启动Chrome并打开DevTools就可以看到它在关闭浏览器之前)。如果你需要这个在Node.js进程控制台中输出,你需要return可序列化的值,获取它并在Node.js上下文中管理它:
const links = await page.evaluate(() => {
const links = document.querySelectorAll(`div.head > h2 > a`);
return [...links].map(link => link.href);
});
console.log(links);
browser.close();