Webseite auslesen, Auswertung erstellen

Warenschild

Cadet 1st Year
Registriert
Juli 2012
Beiträge
10
Ich habe folgendes Problem ich bräuchte eine Liste mit den gespielten Liedern eines Radiosender.
Diese Liste ist auch schon so auf deren Homepage verfügbar, blos in einem Format das mir nichts nützt.

Es handelt sich um diese Seite:
http://www.hazzardofdarkness.net/modules.php?name=Playlist kopieren


Ich bräuchte diese Liste in folgenden Format:

KÜNSTLER1 | SONG1
KÜNSTLER2 | SONG2
KÜNSTLER3 | SONG3
KÜNSTLER4 | SONG4

und nicht über mehrere Seiten


Hätte jemand von euch eine Idee wie man sowas realisieren kann? Ein Script , ein kleines Programm? Oder irgendein Auswertungstool
 
Kann man nicht in Dreamweaver direkt solche Datenquellen anzapfen?

Ich glaub man gibt dazu nur die Website an, markiert den Teil mit den Daten (hier die Tabelle) und kann dann Variablen für die Spalten zuweisen.
Das kann man dann verarbeiten und wieder ausgeben.

Sagt dir das was?
 
mit einem Script könnte man das realisieren, einfach die Tabelle auslesen (ist auch schön strukturiert im Code, machts einfach) und dann durch alle Seiten gehen und im gewünschten Format bereitstellen.
 
Ideen? On Mass.

wie wäre es wenn du uns sagst was deine bevorzugte sprache ist? Java? Php? Perl? ruby? C# whatever. das kann eigentlich jede sprache.
besonders leicht wird es natürlich wenn diese Sprache dir methoden zur verfügung stellt um das DOM zu manipulieren.

PHP kann das (externe lib), in java gibts sicherlich auch ne lib und javascript kann das von haus aus.

Ich würde das wohl in einer smybiose aus php und javascript machen. nicht weil es besonders schlau ist sowas als webapp zu schreiben, sondern weil sich dort der aufwand in grenzen halten wird.

der ablauf:
1) per http_rquest die seite laden
2) Den String parsen oder direkt das DOM verarbeiten
3) Gefilterte daten ausgeben
4) fertig

Ein komplettes programm wirst du hier nicht bekommen.

P.S.
ist immernoch eine grauzone was das parsen und auswerten von fremden websites und _deren_ content geht
 
Wieso als Web-App?
Man braucht: Eine Sprache, die cURL kann und die Funktionen bereit stellt, um den DOM auszuwerten. Außerdem muss sie entweder die ausgelesenen Daten in eine Datenbank schreiben (SQLite wär da passend) oder direkt in eine Textdatei etc... z.B. als JSON-Object.

Da braucht es keine Web-App und erst recht einen Webserver für. Wozu gibts z.B. bei PHP denn den CLI-Modus? Im Webserver-Modus würde dir dieses Script eh n Zeitüberlauf erzeugen, da müsstest du erst die Max Execution Time ordentlich anheben, bei >7000 auszulesenden Seiten.
 
Vielen Dank für die vielen Antworten.
Ich arbeite hauptsächlich mit C#.

Daher werde ich mal Mercsens Vorschlag im DotNet Framework umsetzen, dafür hab ich schon ein paar Libs gefunden.
 
Mercsen schrieb:
Ich würde das wohl in einer smybiose aus php und javascript machen. nicht weil es besonders schlau ist sowas als webapp zu schreiben, sondern weil sich dort der aufwand in grenzen halten wird.
Aha...
Man könnte zur Feier des Tages auch noch 3 bis 7 andere Programmiersprachen mit hineinmischen...

Mercsen schrieb:
Ein komplettes programm wirst du hier nicht bekommen.
Wird er doch!
Weil ich heute meinen guten Tag habe und außerdem gefällt mir sein Nick und ...

Ist in Perl: Einfach hier
runterladen, installieren, das u.a. Script als "playlist.pl" speichern und danach mit "playlist.pl" in der DOS-Box (Eingabeaufforderung) ausführen ;)
Code:
#!/usr/bin/perl -w

use LWP::Simple;


my $page= get("http://www.hazzardofdarkness.net/modules.php?name=Playlist");
my ($table)= ($page=~/<div id=\"playlist\"><table>(.*?)<\/table>/);

while( $table=~/<td class=\"time\">.*?<\/td><td class=\"band\">(.*?)<\/td><td class=\"song\">(.*?)</gs )
{
	printf("%-30s   %s\n", $1, $2);
}

HTH

BigNum
 
Zuletzt bearbeitet von einem Moderator: (Beitrag wiederhergestellt)
Entweder überseh ich was oder du hast da keine Lösung dafür präsentiert, das es >7000 Seiten in der History sind.
 
ich zwinge ja keinen das so zu machen, das wäre für_mich_ am schnellesten gegangen da ich mich in anderen sprachen so gut wie kaum mit der thematik beschäftigt habe. In java könnte ich das noch hinbekommen (auch wenn ich die dom lib nicht kenne (jaja geht auch ohne, bin aber js verwöhnt :p)) der rest wäre fürmich neuland, da wäre es für mich schneller das mit php und js zu machen. Ich entschuldige mich dafür! :rolleyes:

jedenfalls ist es nicht weiter schwer die seiten abzugrasen, man muss am ende nur ein &page=X einfügen, kann man ja schnell in einer schleife iterieren.
 
Schnell ist gut. Das dauert schon eine ganze Weile. :p

Code:
import java.io.BufferedReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

class SiteParser {
    private static final String EMPTY_STRING = "";
    private static final String LINE_BREAK = System
            .getProperty("line.separator");

    public static void main(String[] args) throws IOException {
        HttpURLConnection con = null;
        FileWriter fw = new FileWriter("tracks.txt");
        long before;
        long totalBefore = System.currentTimeMillis();
        for (int i = 0;;i++) {
            before = System.currentTimeMillis();
            System.out.print("parsing page " + i);
            con = (HttpURLConnection) new URL(
                    "http://www.hazzardofdarkness.net/modules.php?name=Playlist&page="+i)
                    .openConnection();

            if (con == null) {
                return;
            }

            if (con.getResponseCode() != 200) {
                System.out.println(con.getResponseCode() + " " + con.getResponseMessage());
                return;
            }

            InputStream is = con.getInputStream();
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            StringBuilder completeResponse = new StringBuilder();
            String singleResponse = null;
            is = con.getInputStream();
            while ((singleResponse = br.readLine()) != null) {
                completeResponse.append(singleResponse + LINE_BREAK);
            }
            Pattern pattern = Pattern
                    .compile("\"band\">.*?</td><td class=\"song\">.*?</td>");
            Matcher matcher = pattern.matcher(completeResponse);
            StringBuilder detectedArtistsAndSongs = new StringBuilder();
            while (matcher.find()) {
                detectedArtistsAndSongs.append(matcher.group()
                        .replace("\"band\">", EMPTY_STRING)
                        .replace("</td><td class=\"song\">", " - ")
                        .replace("</td>", EMPTY_STRING)
                        + LINE_BREAK);
            }
            con.disconnect();
            fw.write(detectedArtistsAndSongs.toString());
            System.out.print(" took "+(System.currentTimeMillis() - before)/1000f + "s"+LINE_BREAK);
        }
        fw.close();
        System.out.println("finished in " +(System.currentTimeMillis() - totalBefore)/ 1000 / 60 +"min");
    }
}
Mir war gerade so. :freaky:
 
Zuletzt bearbeitet: (return und break verwechselt)
Daaron schrieb:
Entweder überseh ich was oder du hast da keine Lösung dafür präsentiert, das es >7000 Seiten in der History sind.
Ja, klar, Asche auf mein Haupt.

Und damit es alle anderen auch lernen, bekommst Du als kleine Hausaufgabe (abzuliefern bis morgen früh) auf, dieses Programm so umzuschreiben, daß es auch schön alle 7000+ Seiten abholt...

Ich hab's extra nicht mit eingebaut, da ich erstens nicht vom Wesentlichen ablenken wollte und es zweitens jedem Nicht-Programmier-Grünschnabel möglich sein sollte es so umzuschreiben, daß es alle 7000+ Seiten holt. Drittens würde ich es als Seitenbetreiber als "unfreundlichen Akt" verstehen, wenn jemand per Script über 7000 mal mir (zu bezahlenden) Traffic verursachen würde. Dann lieber per EMail anfragen, ob ich alle Titel/Interpreten per EMail als ".txt"-File schicken könnte...

Mercsen schrieb:
ich zwinge ja keinen das so zu machen, das wäre für _mich_ am schnellesten gegangen da ich mich in anderen sprachen so gut wie kaum mit der thematik beschäftigt habe.
Ich als Hobby-Psychologe sage Dir, daß das genau Dein Problem ist: Es geht Dir hauptsächlich um Dich!
Statt dem Fragesteller konkret zu helfen baust Du Luftschlösser auf, deutest möglichst komplizierte Lösungen (Stichwort 2 Programmiersprachen) unscharf an und wirfst mit Fachausdrücken um Dich, damit Du in einem (vermeintlich) guten Licht dastehst.
Ich schreibe das hauptsächlich Deiner Jugendlichkeit (und damit meine ich nicht, daß Du noch keine 18 Jahre alt bist) und Unreflektiertheit zu.

Tipp von einem (etwas) älteren Mann: Denk mal drüber nach!
Und denk auch mal drüber nach Groß- und Kleinschreibung zu verwenden, damit Du es Deinen Lesern möglichst einfach machst Deine Texte zu lesen und nicht damit Du es möglichst einfach hast Deine Antwort zu schreiben. Das ist auch eine Frage der inneren Einstellung und des Respektes Anderen gegenüber...


Einen schönen sonnigen Tag

BigNum
 
Also bei solch sauberem HTML-Gerüst würde ich da definitiv über das DOM an die Einträge, nicht mit regulären Ausdrücken.

Das einzige, was zunächst nicht trivial erscheint, ist die Inkonsistenz der Daten wenn man alle 7000 Seiten ausliest. Es muss nur ein neues Lied gespielt worden sein während dem Auslesen und jede einzige der 7000 Seiten wird anders aussehen als zu Beginn des Lesens.
 
Ach, kein Ding... 7000 parallele Threads, die den Kram gleichzeitig auslesen. Das klappt schon *G*

Ne, mal ernsthaft: um das Problem zu minimieren sollte man erst alle Seiten auslesen und dann auswerten. Das senkt die Zeit zwischen den Aufrufen und die Chance, dass sich in der Liste was ändert. Aber andererseits: 8000 textclient-basierte Requests innerhalb von vielleicht ner halben Minute: da kriegste ne Anzeige wegen Verdacht auf DoS-Attacke *G*
 
carom schrieb:
Also bei solch sauberem HTML-Gerüst würde ich da definitiv über das DOM an die Einträge, nicht mit regulären Ausdrücken.
Und das DOM basiert auf was? Eben!

Jetzt musst Du nur noch erklären warum es über DOM besser ist und hier eine funktionierende Lösung präsentieren...

carom schrieb:
Das einzige, was zunächst nicht trivial erscheint, ist die Inkonsistenz der Daten wenn man alle 7000 Seiten ausliest.
Klar, es ist immer so, daß alles was andere schon gelöst haben als trivial erscheint.

Tipp: Beschäftige Dich mal mit Assoziativen Arrays (oder manchmal auch Hash genannt) dann erscheint Dir das vielleicht auch als trivial.


HTH

BigNum
 
BigNum schrieb:
Und das DOM basiert auf was? Eben!

Auf was denn?

BigNum schrieb:
Jetzt musst Du nur noch erklären warum es über DOM besser ist und hier eine funktionierende Lösung präsentieren...


Warum es besser ist? Ich finde es eigentlich nicht komisch, bei Problemen Technologien einzusetzen, die extra für diese gemacht wurden. Regex sitzt hier nur in der zweiten Reihe.

Wie du sicherlich weißt, sind reguläre Ausdrücke für reguläre Sprachen gedacht. HTML ist aber komplexer als eine reguläre Sprache, es ist zumindest mal eine kontextfreie Sprache. Für kleine Probleme wie die des TS mag dies nicht von Bedeutung sein (ich sagte ja nicht, dass es nicht geht), aber mit regulären Ausdrücken kann man HTML nicht komplett begreifen. Beispielsweise ist es nicht möglich, mit regulären Ausdrücken alleine einen HTML-Parser zu bauen.
Das ganze wird dadurch etwas aufgeweicht, dass man die Mächtigkeit von regulären Ausdrücken in Programmiersprachen künstlich erhöht. Das non-greedy-Flag, welches es heutzutage eigentlich in jeder Implementierung gibt, ist bereits nicht mehr regulär. Zufälligerweise ist die Regex-Implementierung im von dir verwendeten Perl eine der mächtigsten überhaupt und quasi turing-vollständig, vielleicht findest du es deswegen so gut. Das gilt aber eben lange nicht für alle Sprachen.

Und dann eben ganz praktische Dinge. Reguläre Ausdrücke sind wohl kaum intuitiver zu verstehen als traversieren über DOM, mit welcher Technologie auch immer. Außerdem sind regulare Ausdrücke bei HTML fehleranfällig für die kleinsten Änderungen, unerwartete Whitespaces beispielsweise.

Habe jetzt keine Lust, hier jetzt alles aufzulisten. Reguläre Ausdrücke sind halt nicht der top-notch für HTML.

http://stackoverflow.com/questions/7196915/regular-expressions-vs-xpath-when-parsing-html-text
http://stackoverflow.com/questions/3406174/which-is-faster-xpath-or-regexp
http://stackoverflow.com/questions/...ept-xhtml-self-contained-tags/1732454#1732454

Hier mal quick n dirty wie ich es gemacht hätte:

Code:
require 'rubygems'
require 'nokogiri'
require 'open-uri'
   
doc = Nokogiri::HTML(open("http://www.hazzardofdarkness.net/modules.php?name=Playlist")) 

doc.xpath("//div[@id='playlist']//tr[position() > 2]/td[@class='band']").each do |node|
  puts node.text + " | " + node.next.text
end


BigNum schrieb:
Klar, es ist immer so, daß alles was andere schon gelöst haben als trivial erscheint.

Mitnichten.

BigNum schrieb:
Tipp: Beschäftige Dich mal mit Assoziativen Arrays (oder manchmal auch Hash genannt) dann erscheint Dir das vielleicht auch als trivial.

Tipp: Erst mal das Problem in vollem Umfang verstehen. Nicht nur Duplikate sind möglich, sondern auch das Gegenteil, Lieder können vereinzelt fehlen wenn man Seite x + 1 vor Seite x aufruft. Bleibt nur, von Seite 1 bis 70xx step by step durchzugehen, mit Nebenläufigkeit ist nichts mehr. Da das nicht das aller schönste ist, hielt ich eine bessere Lösung für nicht trivial.

edit:

While it is true that asking regexes to parse arbitrary HTML is like asking Paris Hilton to write an operating system, it's sometimes appropriate to parse a limited, known set of HTML.

Trifft es ziemlich gut.

edit: Und klar, wenn das Quell-HTML dermaßen verhunzt ist, dass es nicht ohne reguläre Ausdrücke geht.
 
Zuletzt bearbeitet:
Psychologie stunde #2:

BigNum der einzige der hier in einem guten Licht dastehen willst bist ja wohl du!
wer geht denn nicht auf den thread ein und versucht stattdessen der welt sein wissen aufzudrücken? da sehe ich bisher nur einen und das dass hier ein psychologie forum ist wäre mir auch neu o.O

Zum einfacheren lesen von texten: Wieso versuchst du nicht mal dich nicht als Mittelpunkt der welt zu sehen und einfach gerade heraus sagst was du willst, anstatt endloslange rumzulabern für eine aussage die auch in 2 sätzen zu verfassen gewesen wäre?
Wenn du meinst du weißt alles besser und stehst über dem rest: Sag es doch einfach :)

Zudem hat es nichts mit Respekt zu tun und meiner Einstellung anderen gegenüber das ich nahezu alles kleinschreibe, solche aussagen verbitte ich mir! Du kennst mich doch nicht und das "Ich" im Internet wie wie das literarische ich.

lies mal den ersten post, da wird gefragt ob jemand ideen hat, die hatte ich, habe sie geschrieben und fertig, wo ist also dein problem wenn ich sage das ich das so gelöst hätte. ich habe ja nie gesagt das es schlau wäre es so zu machen, sogar gesagt das es nur für mich am schnellesten geht weil der aufwand mich im rest einzulesen größer wäre es als in einem für mich bekannten Umfeld zu realisieren.
Sollte ich stattdessen schreiben: Jemand anders hatte die und die idee, wenn nach unseren ideen gefragt wird? *kopfschüttel*

Ob man die daten nun selber per regex parst oder das an einen dom parser leitet ist echt lachs, erzeugt aber sauberen code wenn man ne dom lib nimmt. Wenn man aber zerhackstückelten code hat ist nen eigener parser wohl die bessere wahl.
 
Zurück
Oben