最后,我弄清楚了如何使用Node.js。安装了所有库/扩展。因此puppeteer可以正常工作,但是像以前使用Xmlhttp一样...它仅获取页面的模板/正文,而没有必要的信息。页面上的所有脚本都会在浏览器(Web应用程序?)中打开几秒钟后激活。加载整页后,我需要在某些标签内获取信息。另外,我会问,是否有可能使用纯JavaScript,因为我没有使用类似jQuery的代码。所以对我来说加倍困难...
这是我到目前为止所拥有的。
const puppeteer = require('puppeteer');
const $ = require('cheerio');
let browser;
let page;
const url = "really long link with latitude and attitude";
(async () => puppeteer
.launch()
.then(await function(browser) {
return browser.newPage();
})
.then(await function(page) {
return page.goto(url).then(function() {
return page.content();
});
})
.then(await function(html) {
$('strong', html).each(function() {
console.log($(this).text());
});
})
.catch(function(err) {
//handle error
}))();
我只在强标签内获得模板默认主体元素。但是它应该包含的数据不止10个。
答案 0 :(得分:14)
如果您想要与检查相同的完整html?在这里:
const puppeteer = require('puppeteer');
(async function main() {
try {
const browser = await puppeteer.launch();
const [page] = await browser.pages();
await page.goto('https://example.org/', { waitUntil: 'networkidle0' });
const data = await page.evaluate(() => document.querySelector('*').outerHTML);
console.log(data);
await browser.close();
} catch (err) {
console.error(err);
}
})();
答案 1 :(得分:0)
一些注意事项:
您不需要cheerio
和puppeteer
,也不需要重新解析page.content()
:您已经具有运行所有脚本的完整DOM,并且可以评估{{ 1}}上下文,例如在使用page.evaluate()
的浏览器中,并在Web API上下文和Node.js API上下文之间传输可序列化的数据。
尝试仅使用异步/等待,这将简化您的代码和流程。
如果需要等到所有脚本和其他依赖项都加载完毕,请在page.goto()
中使用window
。
如果您怀疑文档脚本需要一些时间才能达到所需的状态,请使用各种测试功能,例如page.waitForSelector()
或退回到page.waitFor(milliseconds)
。
这是一个简单的脚本,可在页面中输出所有标签名称。
waitUntil: 'networkidle0'
您可以更详细地指定任务,我们可以尝试编写更合适的内容。
www.bezrealitky.cz的脚本(任务来自下面的评论):
'use strict';
const puppeteer = require('puppeteer');
(async function main() {
try {
const browser = await puppeteer.launch();
const [page] = await browser.pages();
await page.goto('https://example.org/', { waitUntil: 'networkidle0' });
const data = await page.evaluate(
() => Array.from(document.querySelectorAll('*'))
.map(elem => elem.tagName)
);
console.log(data);
await browser.close();
} catch (err) {
console.error(err);
}
})();
答案 2 :(得分:-1)
let bodyHTML = await page.evaluate(() => document.documentElement.outerHTML);
此