从在线Power BI仪表板中收集数据

时间:2020-04-13 02:57:48

标签: javascript html web-scraping powerbi puppeteer

我的地方政府已经将开放式公共数据的想法扔进了垃圾箱,而是选择通过在线Power BI仪表板(不提供下载选项)发布其COVID-19更新。仪表板缺少静态的url,但是您可以access it here

在线发布时,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");

有什么想法吗?还发布了一个有关scraping from a Power BI dashboard的问题,但涵盖了不同方面。我无法执行单击“下一页”箭头的简单任务。

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 个答案:

答案 0 :(得分:2)

代替

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

使用

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

Ecto.Adapters.SQL.query/4