+ Antworten
Ergebnis 1 bis 3 von 3

Thema: Webcrawler in Clojure

  1. #1
    User Viertel Megabyte Themenstarter
    Avatar von inv_zim
    Registriert seit
    31.07.2013
    Ort
    Rhein-Main Gebiet
    Fachbeiträge
    364
    Genannt
    31 Post(s)
    Hi,

    ich habe einen Webcrawler in Clojure geschrieben und fände es schön, wenn ihr mal drüberschauen würdet, ob ich da noch etwas besser machen könnte (Übersichtlichkeit, "funktionalere" Vorgehensweise, etc.)

    Clojure Code:
    1.  
    2. (ns verkehrsblatt.core
    3.   (:gen-class)
    4.   (:require [clojure.xml :as xml]
    5.               [net.cgrand.enlive-html :as html]
    6.   )
    7.  )
    8.  
    9. (defrecord Aufbietung
    10.   [fahrzeugbrief anzahl-halter fin hersteller datum]
    11.  )
    12.  
    13. (def uri "http://www.verkehrsblatt.de/docs/aufbietungen/suche.php?Fahrzeugbriefnummer=&FahrzeugID=&Datum=&Zeitraum_von=01.08.2013&Zeitraum_bis=01.08.2013&SuchZeitraum=Suchen#liste")
    14.  
    15. (defn get-data [url]
    16.   (html/select (html/html-resource (java.net.URL. url))  #{[:.tabelle5 :tr]})
    17.  )
    18.  
    19. (defn columns-for-row [row]
    20.   (Aufbietung.
    21.    (:content (nth row 1))
    22.    (:content (:content (nth row 2)))
    23.    (first (:content (nth row 3)))
    24.    (:content (:content (nth row 4)))
    25.    (:content (nth row 5))
    26.    )    
    27.   )
    28.  
    29. (defn -main [& args]
    30.   (map #(columns-for-row (:content %)) (filter #(.startsWith (:class (:attrs %)) "zeile") (get-data uri))
    31.   )
    32.  )

    Gecrawlt wird die Seite http://www.verkehrsblatt.de/docs/auf...m=Suchen#liste, da ein bekannter von mir hier regelmäßig nach "verloren" gemeldeten Fahrzeugbriefen suchen muss. Zurzeit tut er dies händisch und er hat mich gefragt, ob so etwas auch durch Software möglich ist. Generell bin ich kein Fan von Crawlern, aber er ist sich im klaren, dass es Probleme geben kann, wenn die Webseite geändert wird und es fällt durch den Crawler auch nicht mehr Traffic für die Seite an, da finde ich das schon okay.

    Da er mir noch nicht sagen konnte in welchem Format er die Datensätze gerne hätte speichere ich sie vorübergehend in einem Record, an dieser Stelle wird später direkt als Excel Datei oder in eine Datenbank geschrieben. Auch das "zu crawlende" Datum wird natürlich später über Parameter abgefragt, oder je nachdem das heutige ausgewählt.

    Gruß,
    Tim
    Geändert von inv_zim (15.08.2013 um 10:28 Uhr) Grund: Formatierung

  2. #2
    User Kilobyte Avatar von Majora
    Registriert seit
    31.07.2013
    Fachbeiträge
    152
    Genannt
    21 Post(s)
    Suche mal. Nach clojure + deconstructuring.

    Damit kannst du das col-for-row evtl verbessern. Das nth sieht auf dauer daemlich aus.

    (defn c-4-r [_ a b c d e ]
    (Aufbietung
    (:content a)
    (:content (:content b))
    ...)

    Ausserdem solltest du der schliessenden klammer der fn keine neue Zeile spendieren.
    Das braucht zuviel Platz, da eh eine Leerzeile kommt. Dann passt bei guter lesbarkeit mehr auf den screen.

    Die uri ist imho in der main per let besser aufgehoben.

    Ansonsten sieht das schon recht gut aus.

    Clojure Code:
    1.  
    2. (ns aufbietung.core
    3.   (:gen-class)
    4.   (:require [clojure.xml :as xml]
    5.             [net.cgrand.enlive-html :as html]))
    6.  
    7. (defrecord Aufbietung [fahrzeugbrief anzahl-halter fin hersteller datum])
    8.  
    9. (defn get-data [url]
    10.   (html/select
    11.    (html/html-resource (java.net.URL. url))
    12.    #{[:.tabelle5 :tr]}))
    13.  
    14. (defn columns-for-row
    15.   [[_ a b c d e &f]]
    16.   (Aufbietung.
    17.    (:content a)
    18.    (:content (:content b))
    19.    (first (:content c))
    20.    (:content (:content d))
    21.    (:content e)))
    22.  
    23. (defn -main []
    24.   (let [uri "http://www.verkehrsblatt.de/docs/aufbietungen/suche.php?Fahrzeugbriefnummer=&FahrzeugID=&Datum=&Zeitraum_von=01.08.2013&Zeitraum_bis=01.08.2013&SuchZeitraum=Suchen#liste"
    25.         data (get-data uri)]
    26.     (print
    27.      (map
    28.       #(columns-for-row (:content %))
    29.       (filter
    30.        #(.startsWith (:class (:attrs %)) "zeile")
    31.        data)))))

    Also ich würde das in etwa so machen. Wenn ich das ganze drucke, dann gibt es im Nachhinein eine schöne Nullpointer Exception. Keine Ahnung woher. Und so würde ich es in etwa formatieren.
    Geändert von Majora (15.08.2013 um 20:31 Uhr) Grund: Mit Destructuring und Formatierung
    Not the owner of java-forum.org - Just his nick

  3. #3
    User Viertel Megabyte Themenstarter
    Avatar von inv_zim
    Registriert seit
    31.07.2013
    Ort
    Rhein-Main Gebiet
    Fachbeiträge
    364
    Genannt
    31 Post(s)
    Hi,

    danke für die Anregungen! Sehe gerade, dass in meinem Buch sogar ein ziemlich großes Kapitel zu deconstructuring gibt, das wird dann heute Abend mal die Lektüre. Auf den ersten Blick ein schönes Feature.
    Das mit der schließenden Klammer ist wohl noch eine Java-Marotte, ich sehe mich vielleicht auch mal nach Quellen zu Code-Style um, da wird sich ja was finden lassen.

    Gruß,
    Tim

    Nachtrag: Die NullPointerException fliegt wohl, weil mittendrin Zeilen stehen, welche das Attribut "class" nicht besitzen, da kann ich natürlich nicht auf startsWith prüfen, das muss ich noch behandeln.
    Geändert von inv_zim (15.08.2013 um 21:20 Uhr)

+ Antworten Thema als "gelöst" markieren

Direkt antworten Direkt antworten

Nenne einen der beiden magnetischen Pole der Erde!

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Ähnliche Themen

  1. IDE für Clojure?
    Von inv_zim im Forum JVM-Sprachen
    Antworten: 6
    Letzter Beitrag: 28.01.2014, 05:31

Berechtigungen

  • Neue Themen erstellen: Ja
  • Themen beantworten: Ja
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •