众所周知,powerbi的计划刷新支持每天更新8次,并且计划时间必须是整点或者半点两个选项,这对于很多需要及时刷新的数据来说太慢了,比如双十一、双十二的成交额数据,分毫必争,错失1分钟可能就会产生较严重的问题。
更为严重的是,即便设定整点更新,按计划更新所需的时间执行至少需要10分钟。一开始我以为是数据量大的原因导致,结果,即便更换了一个报表,数据量特别小,只有一张表两行两列的数据,刷新时间仍然需要十几分钟,这我就接受不了了。(下图)
经过各种和世纪互联的沟(si)通(bi),并请教了国外的专家,才得到一个明确的回复,这个事情就是这样,没办法,办不了,等着吧……
我心想,这肯定不行啊……
于是
python大法用起来
那么问题来了,怎么把大象装进冰箱里?
分三步:
第一步,买一个冰箱
第二步,买一头大象
第三步,把大象装进冰箱里。
那么举一反三,我们就可以得出用Python大法自动刷新powerbi的步骤:
第一步,安装python
第二步,根据powerbi网页编写代码
第三步,运行代码,葛优躺喝咖啡,美滋滋
第一步不用说了,内事不决问度娘,外事不决问谷哥
第三步也不用说了,编好了,狠狠地戳一下鼠标左键搞定
说一下第二步:
1.我们需要使用的库是selenium,一个第三方的Python库,可以模拟浏览器操作,是一个用于Web应用程序测试的工具。我们使用的selenium里的webdriver模块来操控浏览器。
fromseleniumimportwebdriver
2.接着,打开Firefox浏览器,路径是你的geckodriver.exe位置,这个在安装软件的时候可以设置的。
brower = webdriver.Firefox(executable_path=r'C:\Program Files\Mozilla Firefox\geckodriver.exe')
3.打开浏览器要输入网址,输入的是这个页面的网址,先拷贝下来,如下的格式:https://app.powerbi.cn/groups/xxxxxxxxxxxxxxxxxxxxxx/list/datasets
将下面的链接改成你自己的链接
brower.get("https://app.powerbi.cn/groups/xxxxxxxxxxxxx/list/datasets")
这样selenium就创建好了一个打开的网页,等待登陆
很明显,我们不能手动去填写账号和密码,太掉价了
4.在填写用户名的地方右键-查看元素
发现有一个input id='i0116',我们就通过这个id来确定输入框的位置,使用的是find_element_by_id,用send_keys输入账号,因为我使用的是国内的世纪互联的账号,你们改成自己的账号就行,国际版国内版代码是相同的。
brower.find_element_by_id('i0116').send_keys('xxxxx@xxxxxx.partner.onmschina.cn')
5.输入的账号后,我们应该点击下一步,在下一步的按钮处点击右键-查看元素,有一个id="idSIButton9",那么就好办了
brower.find_element_by_id('idSIButton9').click()
这样就到了输入密码的界面
6.我们发现输入密码界面和输入账号界面是集备一致的,所以直接将代码写出来:
time.sleep(5)brower.find_element_by_id('i0118').send_keys('duqkyg-qefby1-gipGun')brower.find_element_by_id('idSIButton9').click()
插入一个time.sleep(5),表示暂停5秒,因为可能网速原因导致输入账号后的跳转需要一点点时间,这个可以自己调整。
这样就直接进入到了数据集刷新的页面:
当然,在运行之后的代码前加入time.sleep(10),因为powerbi网页对网速要求很高,看个人网速和电脑配置情况
7.接下来就是要获取刷新按钮的位置并模拟点击了
仍然右键-查看元素
这里我们使用brower.find_element_by_xpath来确定元素的位置
keshi_refresh=brower.find_element_by_xpath(".//*[@class='refreshNow pbi-glyph pbi-glyph-refresh' and @aria-describedby='主任课时提报管理datasetMenu2']")
确定完元素,就要模拟点击
keshi_refresh.click()
上图最后一条就是刚刚按需刷新的记录。
这样就完成了一次刷新。
但是我们想要的是每隔10秒就进行一次刷新啊,而且是24小时不间断?!!
只要创建一个死循环,10秒运行一下模拟点击click()就好:
whileTrue:keshi_refresh.click()time.sleep(10)
效果如下:
这样,我们就完成了利用Python来突破powerbi每天只有8次自动更新并且自动更新时间特别长的难题了。
那么问题就来了,如果雇一个人7d×24h不简单每10秒刷新一次Power BI,我需要每月支付他多少钱?
完整源代码请关注公众号【学谦数据运营】回复“pbi自动刷新”获取。
————————
以上的使用selenium创建浏览器模拟点击刷新的方式已经可以做到完全不影响正常使用电脑的情况下进行。
因为前几天有人在群里问,我随口说了一句,最简单的办法是找一台破电脑,用按键精灵10秒点击一次,需要占用一台电脑。如果有废旧电脑可以打开网页的话,是可以采用这种方式的。
但是这种方式仍然有一个小小的问题,就是需要打开一个新的浏览器页面,并且如果按照10秒模拟点击一次,其实内存消耗还是比较大的,尤其是配置比较低的电脑。那么该怎么办呢?
在点击刷新按钮的时候,右键网页-查看元素-网络,我们发现每一次刷新,其实就是代表着这一个post请求,那么只要我们将这个post请求的内容用Python发送出去,不就达到我们的目的了吗
欲知后事如何,请关注本公众号【学谦数据运营】,等待下次更新。