Power Query – Endlosschleifen bei Webaufrufen vermeiden

This post is also available in: en

Hits: 73

Dieser Artikel ist eine Übersetzung meines englischen Beitrags vom 28. April 2017.

Das Thema Iteration über eine unbekannte Anzahl von Seiten in Power Query wurde bereits mehrfach von verschiedenen Autoren behandelt. Der erste, den ich kenne, war Matt Masson, der die Technik einer vorgenerierten Liste von Seitenzahlen verwendete (PageRange = {1..10000}).

Diese Technik funktioniert gut, kann aber zu einer langen Abfrageausführungszeit oder sogar einem Timeout führen, wenn die Drosselgrenze auf bestimmten Seiten erreicht wird.

Omri Avissar hat eine neue Lösung gefunden. Der Vorteil seiner Lösung ist eine kürzere Ausführungszeit und eine geringere Chance, in ein Time-Out zu laufen. Eine tolle Lösung!

…Unendliche Loops

Neulich musste ich aber feststellen, dass diese Lösung nicht in jedem Fall funktioniert. Ich habe eine Abfrage geschrieben, um Daten aus dem Power BI Kudos Leaderboard (1 Day). Das Leaderboard umfasst nur 2 Seiten und 5’000 Zeilen HTML-Code. Die Abfrage war unglaublich langsam!

Nach einigen Tests und Reverse Engineering habe ich festgestellt, dass die Seite auf die letzte Seite umgeleitet wird, wenn der Parameterwert größer als die Nummer der letzten Seite ist.

Der Aufruf “http://community.powerbi.com/t5/kudos/leaderboardpage/board-id/power-bi-designer/timerange/one_day/tab/authors/page/3”
wurde umgeleitet nach
“http://community.powerbi.com/t5/kudos/leaderboardpage/board-id/power-bi-designer/timerange/one_day/tab/authors/page/2).”

Der nächste Aufruf war Seite 4, dann 5 usw. Das Ergebnis waren immer die Daten der Seite 2. Eine Endlosschleife! Danke für das Microsoft 😉

Lösung

Also musste ich eine Technik finden, um die gesendete URL mit der empfangenen URL zu vergleichen. Glücklicherweise stellt die Seite die URL im HTML-Code in Zeile 13 zur Verfügung:

<meta content="Data shaping, modeling, and report building in the Power BI Desktop app." name="description"/><meta content="noindex" name="robots"/><meta content="text/html; charset=UTF-8" http-equiv="Content-Type"/><link href="http://community.powerbi.com/t5/kudos/leaderboardpage/board-id/power-bi-designer/timerange/one_day/tab/authors/page/2" rel="canonical"/>

Dank des Power Query-Befehls “Text.BetweenDelimiters” konnte ich die gewünschten Informationen aus dem HTML-Code holen:

Function_fnGetHTML

Die Funktion erhält die URL und die Seitenzahl als Eingabe und ruft die Webseite auf. Da die Seite keine brauchbaren Tabellen enthält (……………….), musste ich den HTML-Code importieren, nach der gewünschten Codezeile suchen und das Ergebnis mit der ursprünglichen URL vergleichen. Wenn es sich um eine Übereinstimmung handelt, gibt die Funktion den gesamten HTML-Code zur weiteren Bereinigung zurück oder das Ergebnis ist “falsch”.

Alles, was ich noch tun musste, war, eine Abfrage zu schreiben, welche die Funktion verwendet.Query_Desktop_24Hours

Ich habe die Technik von Omri Avissar angepasst und… voilà, es funktionierte!  Mit einer kleinen Funktion konnte ich die Daten in kurzer Zeit abrufen.

Ich hoffe, dass Euch der Beitrag gefallen hat. Bitte hinterlasst Eure Anregungen und Kritiken wie immer gerne im Kommentar.

Mehr über Power BI und insbesondere Power Query findet Ihr im Power Query Online Buch.

Happy Querying!

Artikel ist hilfreich
1
Verständlichkeit
1
Artikellänge
1
Durchschnitt:
  Wird geladen, bitte warten yasr-loader

Kommentar verfassen