Bài viết này hướng dẫn cách trích xuất dữ liệu từ báo cáo Power BI đã được xuất bản lên web mà không cần truy cập trực tiếp vào nguồn dữ liệu. Đây là kiến thức nâng cao, yêu cầu bạn có nền tảng về lập trình Python và tương tác với Excel.
Để hiểu rõ hơn về code và cách triển khai, bạn có thể tham khảo khóa học “Lập trình tương tác Python Excel chìa khóa tối ưu công việc”.
Video phân tích và giải thích code được trình bày chi tiết dưới đây:
Video hướng dẫn trích xuất dữ liệu Power BI
Phân tích và Giải Thích Code Python
Dưới đây là đoạn code Python được sử dụng trong video:
import re
import json
import base64
import requests
from bs4 import BeautifulSoup
from urllib.parse import unquote
url="https://app.powerbi.com/view?r=eyJrIjoiYjQzZDE1ZDgtNTI0NS00N2U5LThlM2QtMTljZTcwMTgyY2E4IiwidCI6IjQ0YmQ2NjgzLWI0MTQtNGFjNC1iY2VjLTY4NDFiZDNmMzlkMyIsImMiOjEwfQ%3D%3D"
token = url.split('=')[-1]
unquoted_token = unquote(token)
token_string = base64.b64decode(unquoted_token).decode('utf-8')
d = json.loads(token_string)
tenantId = d['t']
resourceKey = d['k']
html_data = requests.get(url).text
resolvedClusterUri = re.search(r"var resolvedClusterUri = '(.*?)'", html_data)[1].replace('-redirect', '-api')
requestId = re.search(r"var requestId = '(.*?)'", html_data)[1]
activityId = re.search(r"var telemetrySessionId = '(.*?)'", html_data)[1]
url = resolvedClusterUri + "/public/reports/" + resourceKey + "/modelsAndExploration?preferReadOnlySession=true"
query_url = resolvedClusterUri + "/public/reports/querydata?synchronous=true"
headers={'ActivityId': activityId, 'RequestId': requestId, 'X-PowerBI-ResourceKey': resourceKey}
data = requests.get(url, headers=headers).json()
for s in data['exploration']['sections']:
if 'query' in s['visualContainers'][0]:
payload = {
"version": "1.0.0",
"queries": [
{
"Query": json.loads(s['visualContainers'][0]['query']),
"CacheKey": '',
"QueryId": "",
"ApplicationContext": {
"DatasetId": data['models'][0]['dbName'],
"Sources": [
{
"ReportId": data['exploration']['report']['objectId']
}
]
}
}
],
"cancelQueries": [],
"modelId": data['models'][0]['id']
}
section_data = requests.post(query_url, json=payload, headers=headers).json()
print(section_data['results'][0]['result']['data']['dsr']['DS'][0]['ValueDicts']['D0'])
print('-' * 80)
print(section_data['results'][0]['result']['data']['dsr']['DS'][0]['PH'][0]['DM0'])
Chi Tiết Các Bước Thực Hiện
Đầu tiên, code lấy URL của báo cáo Power BI và trích xuất token
từ URL. Sau đó, token
được giải mã base64 để lấy tenantId
và resourceKey
.
Tiếp theo, code sử dụng requests
để lấy nội dung HTML của trang báo cáo và trích xuất resolvedClusterUri
, requestId
, và activityId
bằng biểu thức chính quy.
Gửi Yêu Cầu và Trích Xuất Dữ Liệu
Với thông tin đã thu thập được, code xây dựng URL API để lấy thông tin về mô hình và dữ liệu của báo cáo. headers
được thiết lập để xác thực yêu cầu.
Cuối cùng, code lặp qua các section
trong dữ liệu exploration và gửi yêu cầu POST đến API querydata
để lấy dữ liệu thực tế từ mỗi section
. Dữ liệu được in ra màn hình.
Kết Luận
Việc trích xuất dữ liệu từ báo cáo Power BI đã xuất bản trên web có thể thực hiện được thông qua việc phân tích URL và sử dụng API. Đoạn code Python trên cung cấp một phương pháp hiệu quả để thực hiện việc này. Bạn có thể áp dụng và tùy chỉnh code này cho các báo cáo Power BI khác. Hãy tìm hiểu thêm về các thư viện Python như requests
, json
, và re
để nâng cao kỹ năng lập trình của bạn.
Discussion about this post