#javascript #node.js #web-scraping #puppeteer
#javascript #node.js #веб-очистка #puppeteer
Вопрос:
Я пытаюсь получить полный html для этой страницы. У него есть электронная таблица, которая загружается медленно. Я могу включить электронную таблицу при создании скриншота страницы. Однако я не могу получить html для электронной таблицы. document.body.outerHTML
исключает html для электронной таблицы. Как будто puppeteer все еще видит страницу до загрузки электронной таблицы.
Как мне получить полностью загруженный HTML, включая HTML для электронной таблицы?
(async () => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto("http://www.electproject.org/2016g", {
timeout: 11000,
waitUntil: "networkidle0",
});
await page.setViewport({
width: 640,
height: 880,
deviceScaleFactor: 1,
});
await page.screenshot({ path: "buddy-screenshot.png", format: "A4" }); // this screenshot displays the spreadsheet
let html = await page.evaluate(() => document.body.outerHTML); // this returns the html excluding the spreadsheet
await browser.close();
})();
Ответ №1:
Электронная таблица находится в iframe, поэтому сначала вам нужно получить iframe:
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto("http://www.electproject.org/2016g", {
timeout: 11000,
waitUntil: "networkidle0",
});
await page.setViewport({
width: 640,
height: 880,
deviceScaleFactor: 1,
});
const spreadsheetFrame = page.frames().find(
frame => frame.url().startsWith('https://docs.google.com/spreadsheets/')
);
let spreadsheetHead = await spreadsheetFrame.evaluate(
() => document.body.querySelector('#top-bar').innerText
);
console.log(spreadsheetHead); // 2016 November General Election : Turnout Rates
await browser.close();
})();
Комментарии:
1. Спасибо, это приближает меня, потому что я не понимал, что это iframe. Но он по-прежнему просто получает iframe без загрузки данных электронной таблицы, как и раньше. В итоге я просто получил электронную таблицу напрямую. Но мне все еще интересно, можно ли очистить электронную таблицу в iframe, не переходя к связанной электронной таблице.
2. Возможно, вам нужно подождать еще немного с использованием
frame.waitForSelector()
илиframe.waitForFunction()
.