paul schmitz
New member
Hallo,
bei meinem aktuellen Projekt mit PHP benötige ich etwas Hilfe.
Es geht darum, die aktuellen Flugplandaten von einigen Flughäfen automatisch zu extrahieren und zu speichern.
Die Daten sind:
Flugnummer: 2-3 Großbuchstaben + 2-4 Zahlen (ich habe eine Tabelle der möglichen Großbuchstabenkombinationen)
Startort: String, min. 3 Zeichen, keine Zahlen
Zielort: String, min. 3 Zeichen, keien Zahlen
Planzeit: 2 Zahlen + : + 2 Zahlen, vor "Erwartete Zeit" platziert, erste Zahl von 0-2, zweite von 0-9, nur wenn erste auf 2 ist, 0-3, dritte 0-5, vierte 0-9, aber meist 0 oder 5
Erwartete Zeit: 2 Zahlen + : + 2 Zahlen, Zahlen siehe "Planzeit"
Terminal: 1-2 Zeichen, manchmal davor ein "T" oder ein "Terminal " oder ein
Status: "Verspätet", "Gestartet", "Aufgerufen", "Boarding", "Rollt", "Annulliert", (Hamburg: "Gestrichen"->"Annulliert"), manchmal kleingeschrieben, manchmal großgeschrieben
Im Script gibt es eine Funktion zu jedem Flughafen, benannt nach der Abkürzung für diesen, die diese Daten herausfindet. Sie teilt den Seitenquelltext nach einem eindeutigem Text vor und nach den Daten und teilt die Daten dann nocheinmal nach jedem Zellentrenner. Die Daten werden dann an die Funktion
Jetzt zu meinen Fragen:
1.: Die Funktionen für die einzelnen Flughäfen müssen für jeden einzeln geschrieben werden, da alle unterschiedlich Programmiert sind. Ist es möglich, anhand der oben angegebenen Datenstrukturen für die einzelnen Felder diese aus dem gesamten Quelltext der Seite herauszufiltern (d.H. eine Funktion, der man nur die Url übergibt und die Daten zurückgibt)? Die Schwierigkeit ist außerdem, dass die richtigen Daten den richtigen Flügen zugeordnet werden und nicht vertauscht werden dürfen.
2.:Bei mehreren Flughäfen in einer Stadt schreiben die Flughäfen das unterschiedlich hin. München schreibt "FRANKFURT(FRA)", Hamburg "LONDON/HEATHROW" oder "TENERIFFA-SÜD". Ich habe eine csv-Tabelle mit allen Flughäfen (zumindest 47542), in der Name, Land, IATA-Code, Region, Webseite, ... drin stehen. Bei Name steht immer die Stadt dabei z.B. "London Heathrow Airport". Ist damit eine Umwandlung und Vereinheitlichung in der Datenspeicherung möglich?
3.: Wie speichern man diese Daten am besten, sodass später
4.: Gibt es noch weitere sinnvolle Codeoptimierungen?
bei meinem aktuellen Projekt mit PHP benötige ich etwas Hilfe.
Es geht darum, die aktuellen Flugplandaten von einigen Flughäfen automatisch zu extrahieren und zu speichern.
Die Daten sind:
Flugnummer: 2-3 Großbuchstaben + 2-4 Zahlen (ich habe eine Tabelle der möglichen Großbuchstabenkombinationen)
Startort: String, min. 3 Zeichen, keine Zahlen
Zielort: String, min. 3 Zeichen, keien Zahlen
Planzeit: 2 Zahlen + : + 2 Zahlen, vor "Erwartete Zeit" platziert, erste Zahl von 0-2, zweite von 0-9, nur wenn erste auf 2 ist, 0-3, dritte 0-5, vierte 0-9, aber meist 0 oder 5
Erwartete Zeit: 2 Zahlen + : + 2 Zahlen, Zahlen siehe "Planzeit"
Terminal: 1-2 Zeichen, manchmal davor ein "T" oder ein "Terminal " oder ein
<span>
mit "Terminal " drinStatus: "Verspätet", "Gestartet", "Aufgerufen", "Boarding", "Rollt", "Annulliert", (Hamburg: "Gestrichen"->"Annulliert"), manchmal kleingeschrieben, manchmal großgeschrieben
Im Script gibt es eine Funktion zu jedem Flughafen, benannt nach der Abkürzung für diesen, die diese Daten herausfindet. Sie teilt den Seitenquelltext nach einem eindeutigem Text vor und nach den Daten und teilt die Daten dann nocheinmal nach jedem Zellentrenner. Die Daten werden dann an die Funktion
plane_log()
übergeben, die diese in die csv einträgt. Die Funktion checkI()
nimmt dann Doppeleinträge heraus und schreibt alle 5 Minuten eine Zwischendatei. Die Daten werden ebenfalls als JS-Array ausgegeben, um einer Live-Seite mit JS und AJAX die Daten zu bieten.Jetzt zu meinen Fragen:
1.: Die Funktionen für die einzelnen Flughäfen müssen für jeden einzeln geschrieben werden, da alle unterschiedlich Programmiert sind. Ist es möglich, anhand der oben angegebenen Datenstrukturen für die einzelnen Felder diese aus dem gesamten Quelltext der Seite herauszufiltern (d.H. eine Funktion, der man nur die Url übergibt und die Daten zurückgibt)? Die Schwierigkeit ist außerdem, dass die richtigen Daten den richtigen Flügen zugeordnet werden und nicht vertauscht werden dürfen.
2.:Bei mehreren Flughäfen in einer Stadt schreiben die Flughäfen das unterschiedlich hin. München schreibt "FRANKFURT(FRA)", Hamburg "LONDON/HEATHROW" oder "TENERIFFA-SÜD". Ich habe eine csv-Tabelle mit allen Flughäfen (zumindest 47542), in der Name, Land, IATA-Code, Region, Webseite, ... drin stehen. Bei Name steht immer die Stadt dabei z.B. "London Heathrow Airport". Ist damit eine Umwandlung und Vereinheitlichung in der Datenspeicherung möglich?
3.: Wie speichern man diese Daten am besten, sodass später
- ein Flugplan für einen frei wählbaren Zeitraum erstellt
- die Dauer der einzelnen Schritte (Status) berechnet
4.: Gibt es noch weitere sinnvolle Codeoptimierungen?
PHP:
Fluege=[<?php
function plane_log($flugnummer,$von,$nach,$plan,$erwartet,$bereich,$status){
$flugnummer=str_replace("\r","",$flugnummer);
$flugnummer=str_replace("\n","",$flugnummer);
$nach=str_replace("\r","",$nach);
$nach=str_replace("\n","",$nach);
$plan=str_replace("\r","",$plan);
$plan=str_replace("\n","",$plan);
$erwartet=str_replace("\r","",$erwartet);
$erwartet=str_replace("\n","",$erwartet);
$bereich=str_replace("\r","",$bereich);
$bereich=str_replace("\n","",$bereich);
$status=str_replace("\r","",$status);
$status=str_replace("\n","",$status);
$status=str_replace(" ","",$status);
$plan=str_replace(" ","",$plan);
$bereich=str_replace(" ","",$bereich);
$erwartet=str_replace(" ","",$erwartet);
$flugnummer=str_replace(" ","",$flugnummer);
$fields=array($flugnummer,$von,$nach,$plan,$erwartet,$bereich,$status,date("ymd"));
$fp = fopen('fluege.csv', 'a+');
fputs($fp,"".implode(",",$fields)."\r\n");
fclose($fp);
}
function checkI(){
$lines = array();
if(($handle = fopen("fluege.csv","r"))!==false){
while(($data=fgetcsv($handle,0,","))!==false){
$line=join(",",$data);
if(isset($lines[$line]))continue;
$lines[$line]=true;
}
fclose($handle);
}
$contents = '';
foreach ($lines as $line => $bool) $contents .= $line . "\r\n";
copy("fluege.csv","fluege2.csv");
file_put_contents("fluege.csv", $contents);
if(date("i")%5==0){
file_put_contents("fluege".date("ymd h:i").".csv", $contents);
}
}
function MUC(){
$site=file_get_contents("http://www.munich-airport.de/de/consumer/fluginfo/dep/index.jsp");
$site=explode('<div id="flight_info_table">',$site);
$site=$site[1];
$site=explode('</table>',$site);
$site=$site[0];
$site=explode('<td align="left">',$site);
$jsstring="";
for($i=0;$i<count($site)-1;){
$flugnummer=str_replace("</td>","",$site[++$i]);
$nach=str_replace("</td>","",$site[++$i]);
$plan=str_replace("</td>","",$site[++$i]);
$erwartet=str_replace("</td>","",$site[++$i]);
$bereich=str_replace("</td>","",$site[++$i]);
$status=str_replace("</td>","",$site[++$i]);
$flugnummer=explode(">",$flugnummer);
$flugnummer=str_replace("</a","",$flugnummer[1]);
$bereich=str_replace("T","",$bereich);
$nach=str_replace("(TXL)","-Tegel",$nach);
$erwartet=str_replace("<strong>","",str_replace("</strong>","",$erwartet));
$status=explode("<",$status);
$status=$status[0];
$jsstring.="['".$flugnummer."','Munchen','".$nach."','".$plan."','".$erwartet."','".$bereich."','".$status."'],";
plane_log($flugnummer,"Munchen",$nach,$plan,$erwartet,$bereich,$status);
}
$jsstring=str_replace("\r","",$jsstring);
$jsstring=str_replace("\n","",$jsstring);
$jsstring=str_replace("\t","",$jsstring);
$jsstring=str_replace(" ","",$jsstring);
return $jsstring;
}
function HAM(){
$site=file_get_contents("http://www.hamburg-airport.de/tools/flightplan/flightplan_detail.php/de/departures/today/");
$site=str_replace('<tr class="hidden-xs">',"<tr>",$site);
$site=str_replace('<td class="hidden-xs">',"<td>",$site);
$site=str_replace('<span class="hidden-xs">Terminal </span>',"",$site);
$site=str_replace("</tr>","",$site);
$site=str_replace("<tr>","",$site);
$site=str_replace("<td>","",$site);
$site=str_replace('<td data-title="',"",$site);
$site=str_replace('Flug">',"",$site);
$site=str_replace('Erwartet">',"",$site);
$site=str_replace('Terminal">',"",$site);
$site=str_replace('Status">',"",$site);
$site=explode('</td>',$site);
$jsstring="";
for($i=0;$i<count($site)-1;){
$plan=$site[++$i];
$nach=$site[++$i];
$flugnummer=$site[++$i];
$bereich=$site[++$i];
$erwartet=$site[++$i];
$status=$site[++$i];
$nach=substr($nach,0,-5);
$status=str_replace("gestrichen","annulliert",$status);
++$i;
++$i;
$jsstring.="['".$flugnummer."','Hamburg','".$nach."','".$plan."','".$erwartet."','".$bereich."','".$status."'],";
plane_log($flugnummer,"Hamburg",$nach,$plan,$erwartet,$bereich,$status);
}
$jsstring=str_replace("\r","",$jsstring);
$jsstring=str_replace("\n","",$jsstring);
$jsstring=str_replace("\t","",$jsstring);
$jsstring=str_replace(" ","",$jsstring);
return $jsstring;
}
echo HAM();
echo MUC();
checkI();
?>]