Webscraping

Romeo88

Cadet 1st Year
Registriert
Mai 2024
Beiträge
11
Hallo Alle ;)
Ich möchte Daten aus folgender Website (https://www.raceherens.ch/de/liste-des-vaches/120161212639-321433) auslesen um einen Stammbaum für eine Kuh zu erstellen. Die Seite enthält immer Mutter und Vater der Kuh und daneben ist jeweils immer der Name als Link welche wieder auf eine neue Unterseite führt. Dann wieder dasselbe, Vater/Mutter usw.

Wie kann ich diese Daten am besten automatisch auslesen damit ich nicht jeden Link öffnen und alle Daten selber kopieren muss?

Danke im Voraus für Hilfe!
Grüße Romeo88
 

Anhänge

  • Screenshot_2024-05-23-01-31-22-41_40deb401b9ffe8e1df2f1cc5ba480b12~2.jpg
    Screenshot_2024-05-23-01-31-22-41_40deb401b9ffe8e1df2f1cc5ba480b12~2.jpg
    155,5 KB · Aufrufe: 48
Ich würde sagen mit sowas wie bspw. dem HTTrack. Die Website hat in ihrem HTML-Meta auch kein Verbot diesbezüglich wie norobot, usw.
 
  • Gefällt mir
Reaktionen: Romeo88
@Faust2011 Damit hätte man dann zwar eine Offline-Kopie, aber die Daten müssen ja trotzdem noch aus den Seiten extrahiert und verarbeitet werden. Sonst macht man ja wieder alles händisch.

Ich habe früher mal für was ähnliches ein PHP-Script geschrieben, welches mir relevante Daten ausgelesen und in eine DB geschrieben hat. Heutzutage gibt es bestimmt irgendwelche Frameworks/Tools, womit das etwas einfacher geht.
 
  • Gefällt mir
Reaktionen: Romeo88 und Faust2011
@kartoffelpü Oh, das hatte ich anders verstanden. Aber ich glaube, Du hast Recht :)
 
  • Gefällt mir
Reaktionen: Romeo88
ok, das war mal was anderes zum morgen :)
Python:
import requests
from lxml.html.soupparser import fromstring

base_url = "https://www.raceherens.ch"


class Cow(object):

    def __init__(self, link, max_depth=3):
        r = requests.get(f'{base_url}/{link}')
        self._max_depth = max_depth
        self._root = fromstring(r.text)
        self._mutter = self._root.xpath("//div[@class='row']/div/strong[text()='Mutter']/../../div/a")
        self._vater = self._root.xpath("//div[@class='row']/div/strong[text()='Vater']/../../div/a")

    def _get_parent(self, parent):
        if self._max_depth:
            try:
                return Cow(parent[0].attrib['href'], self._max_depth - 1)
            except Exception as e:
                print("error getting parent:", e)

    @property
    def name(self):
        return self._root.xpath("//div[@class='uptitle']")[0].text.strip()

    @property
    def mutter(self):
        return self._get_parent(self._mutter)

    @property
    def vater(self):
        return self._get_parent(self._vater)


def print_cow(cow, comment="", i=0):
    print(i * " ", cow.name, comment)
    if cow.mutter and cow.vater:
        print_cow(cow.mutter, "(mutter)", i+2)
        print_cow(cow.vater, "(vater)", i+2)


print_cow(
    Cow("/de/liste-des-vaches/120161212639-321433")
)

Code:
# python3 muh.py
 TVD 120161212639
   TVD 120119253271 (mutter)
     TVD 120061238685 (mutter)
       TVD 410058007357 (mutter)
       TVD 120031196618 (vater)
     TVD 120055309759 (vater)
       TVD 120035560897 (mutter)
       TVD 120055309674 (vater)
   TVD 120132847709 (vater)
     TVD 120118244379 (mutter)
       TVD 120099535374 (mutter)
       TVD 120099238558 (vater)
     TVD 120104514172 (vater)
       TVD 410059030699 (mutter)
       TVD 120099585454 (vater)
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: dms, konkretor, Romeo88 und eine weitere Person
Vielen Dank @0x8100
wenn ich es richtig verstehe muss ich dieses Script über Python laufen lassen, oder wie?
Ich kenne mich ein wenig mit "Excel VBA" aus, doch hiermit habe ich keine Ahnung. Können Sie mir bitte noch ein wenig helfen??! Vielen Dank
 
das ist python, ja. kurzanleitung: auf python.org den installer runterladen (für windows, linux hat das üblicherweise dabei), in einer konsole "pip3 install requests lxml" eingeben, das script als *.py datei speichern und mit "python3 muh.py" starten.
 
  • Gefällt mir
Reaktionen: Romeo88
OK ich werde es später wenn ich Zuhause bin ausprobieren. Danke dir!
Ergänzung ()

Für was ist der Code?
python3 muh.py
TVD 120161212639
TVD 120119253271 (mutter)
TVD 120061238685 (mutter)
usw.??
 
OK..! Aber die Ausgabe ist somit ziemlich vermischt. Kann man das nicht sortierter ausgeben lassen? Oder ist das nicht möglich? Es wäre hilfreich wenn Mutter und Vater ausgegeben werden und dann immer eine Generation zurück, Mutter und Vater von "Mutter" dann Mutter und Vater von "Vater" usw.
Einfach der Reihe nach hinunter. Sonst muss ich trotzdem alle nachschauen und selber sortieren.
Der dazugehörige Name mit TVD Nr. wäre eben auch sehr hilfreich. Doch wenn ich das Script verstehe, kann ich das vielleicht noch selber machen!
Danke
 
jede generation ist doch schon um zwei leerzeichen weiter eingerückt? die eltern jedes tieres sind so erkennbar. du kannst das natürlich gerne so ändern wie du magst :)
 
Ahh... ich Vollidiot 🙆‍♂️ natürlich, jetzt verstehe ich es. Sorry! Und ja ich werde dann den Code/Script genau anschauen damit ich es verstehe und auch etwas für die Zukunft lernen kann. Excel VBA habe ich auch durch studieren der Scripte gelernt.
Genau, dann kann ich selber Anpassungen machen falls ich ihm folgen kann 😉
Vielen vielen Dank für deine Hilfe!
Vielleicht brauche ich dann deine Hilfe nochmals, aber ich hoffe dass ich es dem Rest selber bin.
Gute Nacht 💤
 
Sorry aber ich brauche nochmals Hilfe. Bitte...!
Mir kommt immer die Meldung:
SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape

Mache ich etwas falsch?
Ich habe das Script oben kopiert und als .py Datei abgespeichert und in Python mit dem Befehl:
python3 cd "C:\Users\LeoKar\OneDrive\Desktop\ReinesHerens.py"
gestartet!
 
ich habe die datei mal angehängt, vielleicht gab es bei dir ein problem mit dem erstellen wegen des zeichensatzes. wenn es damit auch nicht geht, einmal die volle fehlermeldung posten inkl. zeilennummer wo der fehler aufgetreten ist. heute bin ich allerdings dann nicht mehr im forum unterwegs.
 

Anhänge

  • muh.zip
    722 Bytes · Aufrufe: 20
  • Gefällt mir
Reaktionen: Romeo88 und mae1cum77
Danke aber bei mir funktionierts nicht. Kann sein dass ich einen Fehler bei der Ausführung mache oder ist irgendwo sonst ein Fehler drin.

Hier die volle Fehlermeldung welche ausgegeben wird:

Python 3.12.3 (tags/v3.12.3:f6650f9, Apr 9 2024, 14:05:25) [MSC v.1938 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>> python3 cd"C:\Users\LeoKar\OneDrive\Desktop\muh.py"
File "<stdin>", line 1
python3 cd"C:\Users\LeoKar\OneDrive\Desktop\muh.py"
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape
 
du musst python3 "C:\Users\LeoKar\OneDrive\Desktop\muh.py" als einen befehl in der konsole ausführen. du hast erst "python3" gestartet und in dessen konsole es nochmal probiert. das kann nicht gehen.
 
Hallo 0x8100
Jetzt habe ich den Fehler gefunden! Es fehlte das Modul "Beautifulsoup"
Das Modul "requests" hast du mir noch in der Kurzanleitung notiert.

Vielleicht brauche ich dann irgendwann deine Hilfe wieder ;)

Vielen Dank für dein Engagement!!! :daumen:
 
Hallo 0x8100
Sorry für die Störung am Sonntag.
Ich habe jetzt einige Sachen ausprobiert, damit es mir den Namen der Mutter und des Vaters vor der TVD-Nr. ausgibt. Aber bis jetzt war es mir nur möglich den Namen der ersten Kuh "Tinette" auszugeben.
Kannst mir hier bitte nochmals helfen?
Ich habe im Quellcode der Website gesucht, doch hier ist mir nicht klar welchen Tab usw. ich dafür nehmen muss?!
Danke u. Grüße
 
mangels besseren wissen habe ich als "name" diesen string mit "tvd..." gewählt, da mir das eindeutiger als z.b. "tinette" erschien. hat dieses "tvd..."-dingens eine besondere bezeichnung? dann kann man fix im script den namen und diesen bezeichner getrennt speichern (oder ist die kombination aus beidem der eigentliche name? ich kenne mich da nicht aus :)).

anonsten siehst du ja, dass für das aktuelle tier beide angaben separat angegeben sind:
1716728927115.png


und für die elterntiere es ein string ist:
1716728994859.png


ich hatte mit nur für das "tvd..." entschieden und daher das einmal nur aus dem "uptitle" element ausgelesen und bei den eltern anhand des "-" getrennt.
 
Die TVD ist die Bezeichnung für Tierverkehrsdatenbank. Das stört mich auch nicht und möchte ich auch beibehalten. Ich möchte nur bei allen Ausgaben dass es so aussieht:
TAMINA - TVD 120119253271 (Mutter)
NAPOLEON - TVD 120132847709 (Vater)

Ansonsten muss ich beim Erstellen des Stammbaumes trotzdem alle Namen über die TVD-Nummer nachschauen und dann bin ich wieder gleich weit, dh. muss es manuel machen.
Ergänzung ()

Die Kombination aus Namen und TVD-Nr. wäre schön. Aber ich bin es diesem Code noch nicht. Darum bitte ich dich nochmals. Ich muss den danach studieren damit ich in Zukunft das besser verstehe.
 
Zuletzt bearbeitet:
Zurück
Oben