从在线Power BI仪表板中抓取数据

3
我的地方政府已经把开放公共数据的想法丢进了垃圾桶,取而代之的是通过一个没有下载选项的在线Power BI仪表板来发布其COVID-19更新。该仪表板缺乏静态的url,但您可以在这里访问

当Power BI仪表板在线发布时,它们具有复杂的HTML结构,似乎不像普通的HTML文档那样对爬虫作出响应。

使用Puppeteer(一个Node.js模块),我可以从仪表板的第一页中提取一些元素。我真正需要的是访问第二页。为了做到这一点,我需要“点击”屏幕底部的右箭头。可以使用document.querySelector(".pbi-glyph-chevronrightmedium")成功选择它。

然而,我无法与该元素进行交互以达到第二页。虽然Puppeteer可以找到它,但无法单击它。这里的第一行有效,第二行无效:

await page.waitForSelector(".pbi-glyph-chevronrightmedium");
await page.click(".pbi-glyph-chevronrightmedium");

有什么想法吗?之前有一个关于从Power BI仪表盘中抓取数据的问题发布了,但它涉及到不同的方面。我无法执行简单的任务,即单击“下一页”箭头。

const puppeteer = require("puppeteer");
async function scrape() {
  var browser = await puppeteer.launch(),
      page = await browser.newPage();
  return new Promise(async function(resolve, reject) {
    try {
      await page.goto("https://www.covid19.act.gov.au/updates/confirmed-case-information");
      await page.waitForSelector(".col-md-12 a");
      let dashboardUrl = await page.evaluate(function() {
        return document.querySelector(".col-md-12 a").href;
      });
      await page.goto(dashboardUrl);
      await page.waitForSelector(".pbi-glyph-chevronrightmedium");
      console.log("Found the arrow!");
      await page.click(".pbi-glyph-chevronrightmedium");
      console.log("Clicked the arrow!");
      browser.close();
      return resolve("end scrape");
    } catch (error) {
      return reject(error);
    }
  });
}
scrape()
  .then(console.log)
  .catch(console.error);

1个回答

2

代替

await page.click(".pbi-glyph-chevronrightmedium");

使用

await page.$eval(".pbi-glyph-chevronrightmedium", el => el.click());

(source)


太棒了,谢谢!不过,这个解决方案让我感到惊讶。在我的脚本中(不是上面的那个),在这一点之前我已经使用了page.evaluate()。而且,我也能够成功地点击其他页面元素,而不需要使用.evaluate()方法。这是一个长期存在但未解决的 bug 吗? - Markus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接