node.js - Puppeteer 无法抓取动态生成的内容

标签 node.js web-scraping puppeteer

我想从以下元素中提取经度和纬度值:

<span itemprop="geo" itemscope="" itemtype="http://schema.org/GeoCoordinates"> <meta itemprop="latitude" content="-25.5170846"> <meta itemprop="longitude" content="-49.1831061"> </span> .

这就是通过 google chrome 访问时代码显示的方式,但是当我尝试使用 Puppeteer 抓取它时,我得到的是以下内容: <script type="jsv/71_"></script> 。 我认为这应该是一些动态生成的内容。有没有办法渲染这个标签并从这个元标签中提取内容属性? 我尝试使用:

await 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();`

最佳答案

看起来 <span itemprop="geo">...</span> 里面有一个 script 标签。此外,您需要等到元标记真正出现。

代码如下所示:

// Wait for meta tags to appear
await page.waitForSelector('[itemprop=geo] meta');

// query both meta elements
const metaElements = ficha.querySelectorAll('[itemprop=geo] meta');

const elementoLatitude = metaElements[0].attributes["content"].nodeValue;
const elementoLongitude = metaElements[1].attributes["content"].nodeValue;

关于node.js - Puppeteer 无法抓取动态生成的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55381962/

相关文章:

node.js - 保护 node-webkit 桌面应用程序中的源代码

javascript - 使用 Selenium 和 python 抓取 javascript 生成的内容时出现问题

javascript - 无法使用ElectronJS运行NodeJS脚本(已更新)

node.js - 无法即时抓取和打印链接

javascript - 如何在 puppeteer 中访问全局变量

javascript - node-rsa : Encoding too long, 使用以太坊账户的公钥

node.js - 如何在express-request-proxy Node 包中添​​加Redis配置

node.js - 如何使用 Jest 库测试基本的 socket.io Node.js 应用程序?

javascript - 如何正确使用getElementByXpath和getElementsByXpath?

python - 我想使用 scrapy python 单击网站链接