首页 > 解决方案 > 使用 Puppeteer 进行 DOM 选择

问题描述

尝试从 coinfarm.online 抓取某些内容时,我总是遇到错误。所以我要最后的价格。当我在浏览器内的控制台上尝试它时,它工作得很好,但是使用这个脚本我总是得到一个错误或空值。

const puppeteer = require("puppeteer");

(async () => {
  const browser = await puppeteer.launch({ headless: true });
  const page = await browser.newPage();
  await page.goto("https://coinfarm.online", { waitUntil: "load", timeout: 0 });

  const example = await page.evaluate(
    () => document.querySelector("#xbt_last").innerText
  );

  console.log("Price: " + example);

  await browser.close();
})();

我也用 XPath 尝试过,但也没有用....

标签: javascriptnode.jspuppeteer

解决方案


我为你做了这个

const puppeteer = require ('puppeteer')
const uaString = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3882.0 Safari/537.36'

;(async () => {
    const browser = await puppeteer.launch ({
        headless : true,
        devtools : false
    })
    const [page] = await browser.pages()

    page.setDefaultNavigationTimeout(0)
    page.setUserAgent(uaString)
    page.setRequestInterception(true)

    page.on('request', async request => {
        if ( request.resourceType() === 'image' || request.resourceType() === 'font' || request.resourceType() === 'media' ) {
            request.abort ()
        } else {
            request.continue ()
        }
    })

    const open = await page.goto ('https://s.tradingview.com/embed-widget/tickers/?locale=en#%7B%22symbols%22%3A%5B%7B%22description%22%3A%22BitMex%20XBT%22%2C%22proName%22%3A%22BITMEX%3AXBTUSD%22%7D%2C%7B%22description%22%3A%22Binance%20USDT%22%2C%22proName%22%3A%22BINANCE%3ABTCUSDT%22%7D%2C%7B%22description%22%3A%22BitFinex%20USDT%22%2C%22proName%22%3A%22BITFINEX%3ABTCUSD%22%7D%2C%7B%22description%22%3A%22BitFlyer%20JPY%22%2C%22proName%22%3A%22BITFLYER%3ABTCJPY%22%7D%5D%2C%22width%22%3A%22100%25%22%2C%22height%22%3A72%2C%22utm_source%22%3A%22coinfarm.online%22%2C%22utm_medium%22%3A%22widget%22%2C%22utm_campaign%22%3A%22tickers%22%7D', {timeout: 0, waitUntil: 'networkidle0'})
    const wait = await page.waitForSelector('.tv-ticker-item-change__last')
    const eVal = await page.evaluate( () => document.querySelectorAll('.tv-ticker-item-change__last')[0].innerText )

    console.log ( parseFloat( eVal ) )

    const exit = await browser.close()
})()

推荐阅读