Node.js 木偶演员无法抓取动态生成的内容
我有以下元素,我想从中提取经度和纬度值:Node.js 木偶演员无法抓取动态生成的内容,node.js,web-scraping,puppeteer,Node.js,Web Scraping,Puppeteer,我有以下元素,我想从中提取经度和纬度值: 这是通过google chrome访问代码时显示的方式,但当我尝试使用Puppeter刮取代码时,得到的结果如下: 。 我认为这应该是一些dinamic生成的内容。有没有办法呈现这个标签并从这个meta标签中提取内容attibute? 我尝试使用: wait page.waitForSelector(“[itemprop=geo]”) 但在等待选择器时出现超时错误 `const page = await browser.newPage(); //
这是通过google chrome访问代码时显示的方式,但当我尝试使用Puppeter刮取代码时,得到的结果如下:
。
我认为这应该是一些dinamic生成的内容。有没有办法呈现这个标签并从这个meta标签中提取内容attibute?
我尝试使用:
wait page.waitForSelector(“[itemprop=geo]”)代码>
但在等待选择器时出现超时错误
`const page = await browser.newPage();
// await page.setViewport({
// width: 1920,
// height: 1080
// });
await page.goto(url, {
waitUntil: 'networkidle2',
timeout: 9000000
});
console.log(`Capturando dados da página ${url}`);
await page.waitForSelector('[itemprop=geo]');
const imoveisOnPage = await page.evaluate(() =>
Array.from(document.querySelectorAll("article.minificha")).map(ficha => {
const site = document.location.hostname;
const elementoTitulo = ficha.querySelector('[itemprop="streetAddress"]');
const elementoCidade = ficha.querySelector('[itemprop="addressLocality"]');
const elementoEstado = ficha.querySelector('[itemprop="addressRegion"]');
const elementoBairro = ficha.querySelector('h2 strong');
const elementoQuartos = ficha.querySelector('li.icone-quartos');//.textContent.trim();
const elementoPreco = ficha.querySelector('.preco strong');
const elementoArea = ficha.querySelector('li.icone-area');
const elementoDescricao = ficha.querySelector('.endereco p');
const elementoAnuncioUrl = ficha.querySelector('figure > div > a');
const elementoAnunciante = ficha.querySelector('.anunciante span');
const elementoLatitude = ficha.querySelector('[itemprop=geo]').children[0].attributes["content"].nodeValue
const elementoLongitude = ficha.querySelector('[itemprop=geo]').children[1].attributes["content"].nodeValue
const elementoId = ficha.getAttribute('data-id');
const resumo = JSON.parse(ficha.getAttribute('data-clickstream'));
const fotosElement = ficha.querySelector('.carrossel-container').getAttribute('data-fotos');
const fotosArray = fotosElement.replace('[', '').replace(']', '').split(',');
let bairro = (elementoBairro !== null) ? elementoBairro.textContent.trim() : resumo.address[3];
let quartos = (elementoQuartos !== null) ? elementoQuartos.textContent.trim() : resumo.bedrooms;
let preco = (elementoPreco !== null) ? elementoPreco.textContent.trim() : resumo.salePrice;
let logradouro = (elementoTitulo !== null) ? elementoTitulo.textContent.trim() : resumo.address[4];
let cidade = (elementoCidade !== null) ? elementoCidade.textContent.trim() : resumo.address[2];
let estado = (elementoEstado !== null) ? elementoEstado.textContent.trim() : resumo.address[1];
let area = (elementoArea !== null) ? elementoArea.textContent.trim() : resumo.areas[0];
let cep = resumo.address[6] || '';
let numero = resumo.address[5] || '';
let descricao = (elementoDescricao !== null) ? elementoDescricao.textContent.trim() : '';
let fotos = fotosArray;
let anuncioUrl = (elementoAnuncioUrl !== null) ? elementoAnuncioUrl.href : '';
let tipo = resumo.unitTypes[0];
let anunciante = elementoAnunciante.textContent.trim();
let titulo = `${resumo.unitTypes[0]} ${cidade} - ${estado}`;
let longitude = (elementoLongitude !== null) ? elementoLongitude.content : '';
let latitude = (elementoLatitude !== null) ? elementoLatitude.content : '';
let location = {
type: 'Point',
coordinates: [longitude, latitude]
}
return {
titulo, tipo, quartos, preco, logradouro, numero,
cidade, bairro, estado, area, cep, descricao,
fotos, resumo, site, anuncioUrl, location
}
})
);
await page.close();`
看起来在…
中有一个脚本标记。此外,您希望等待meta标记实际出现
代码如下所示:
//等待元标记出现
wait page.waitForSelector('[itemprop=geo]meta');
//查询两个元元素
const metaElements=ficha.querySelectorAll(“[itemprop=geo]meta”);
常量elementoLatitude=元元素[0]。属性[“内容”]。节点值;
常量elementologitude=元元素[1]。属性[“内容”]。节点值;
你的代码是什么样子的?我用我正在使用的简化代码编辑了问题。这看起来不是有效代码。您缺少一个页面。请在某处评估。哪一个变量包含“”信息?@ThomasDondorf我试图简化代码,忘记了脚本中重要的部分。代码不需要标记脚本,但需要脚本标记所在的标记范围。感谢您的帮助,但它不起作用。标记span未在页面上呈现,这就是我无法获取内容的原因。我认为标签负责呈现我想要的内容,但不知怎的,当我通过Puppeter访问时,它没有呈现。我明白了,我更新了我的答案。您可以为此使用waitForSelector。