Daten von Seite mit wget extrahieren

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
desputin
Beiträge: 1270
Registriert: 24.04.2015 17:16:34

Daten von Seite mit wget extrahieren

Beitrag von desputin » 10.12.2018 14:33:34

Hallo,
ich benötige von einer Internetseite Daten, die ich aber nicht alle einzeln abrufen möchte, sondern alles in eine Datei kopieren möchte.
Den Zugriff auf die Daten bekomme ich so:

Code: Alles auswählen

https://www.testseite.de/infos/1
Bis

Code: Alles auswählen

https://www.testseite.de/infos/1500
Nun kann ich die Seiten einzeln im Browser aufrufen, aber die Zeit habe ich nicht! Wie kann ich das machen, daß wget die Seiten nacheinander aufruft und in eine csv-Datei schreibt?
Die Infos, die dann über grep bezogen werden müßten sind einmal die E-Mail-Adresse mit:
1.

Code: Alles auswählen

grep -E -o "\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}\b"
2.

Code: Alles auswählen

<h4 class="font-weight-bold">DIESEN TITEL EXTRAHIEREN</h4>
3.

Code: Alles auswählen

<p>
    Straße 0A, PLZ Stadt<br/>
    <a href="
Hier also "Straße..... bis Stadt"

Ginge das? Könnt Ihr mir da helfen?
Viele Grüße desputin
Zuletzt geändert von desputin am 11.12.2018 07:55:32, insgesamt 2-mal geändert.
https://www.daswirdmanjawohlnochsagenduerfen.de
https://www.neoliberalyse.de - Über die Ökonomisierung aller Lebensbereiche. |

cronoik
Beiträge: 2049
Registriert: 18.03.2012 21:13:42
Lizenz eigener Beiträge: GNU Free Documentation License

Re: Daten von Seite mit wget extrahieren

Beitrag von cronoik » 10.12.2018 16:28:36

Ist die Folgeseite verlinkt? Also https://www.testseite.de/infos/1 verlinkt auf https://www.testseite.de/infos/2 ? Dann empfehle ich dir einen Crawler mit Python und Scrapy [1] zu schreiben. Dann kannst du auch mit xpath die Punkte 2 und 3 exthrahieren. Bei Problem kann ich dir gern helfen.

Falls du an wget festhalten willst oder du Scrapy nicht magst, dann wuerde ich die weitere Verarbeitung dennoch mit Python machen. XPath-Pakte und http-Anfragen-Pakete gibt es genug (siehe [2] und [3]).

[1] https://scrapy.org/
[2] https://lxml.de/
[3] http://docs.python-requests.org/en/master/
Hilf mit unser Wiki zu verbessern!

uname
Beiträge: 12044
Registriert: 03.06.2008 09:33:02

Re: Daten von Seite mit wget extrahieren

Beitrag von uname » 10.12.2018 16:49:19

Übe erst mal mit den ersten 10 Seiten:

Code: Alles auswählen

for i in {1..10};do wget https://www.testseite.de/infos/$i --no-check-certificate -o $i.txt;done
Funktioniert das schon mal? Anschließend kannst du ja immer noch in den Dateien 1.txt bis 10.txt mit grep oder sonstwas suchen.

eggy
Beiträge: 3331
Registriert: 10.05.2008 11:23:50

Re: Daten von Seite mit wget extrahieren

Beitrag von eggy » 10.12.2018 16:57:27

desputin hat geschrieben: ↑ zum Beitrag ↑
10.12.2018 14:33:34
Nun kann ich die Seiten einzeln im Browser aufrufen, aber die Zeit habe ich nicht! Wie kann ich das machen, daß wget die Seiten nacheinander aufruft und in eine csv-Datei schreibt?
Sowas geht mit curl einfacher:

Code: Alles auswählen

curl https://debianforum.de/forum/viewtopic.php\?f=34\&t=17160[1-5] -o "dfde_#1.html"
weitere Beispiel findest in der curl manpage unter -output

Benutzeravatar
desputin
Beiträge: 1270
Registriert: 24.04.2015 17:16:34

Re: Daten von Seite mit wget extrahieren

Beitrag von desputin » 10.12.2018 17:00:34

Hallo cronic,

vielen Dank!
Nein, die Seiten verlinken nicht einander untereinander. Ich muß die Abfrage für jede Unterseite also ein Mal durchführen. Ist aber nur eine stumpf hochzählende Ziffer am Ende...
Ich bin mir nicht sicher, wo ich da anfangen soll und welche Scriptsprache in dem Fall für meinen Zweck am geeignetsten ist...
https://www.daswirdmanjawohlnochsagenduerfen.de
https://www.neoliberalyse.de - Über die Ökonomisierung aller Lebensbereiche. |

Benutzeravatar
desputin
Beiträge: 1270
Registriert: 24.04.2015 17:16:34

Re: Daten von Seite mit wget extrahieren

Beitrag von desputin » 10.12.2018 17:05:57

hallo uname und eggy, super, das klappt beides! Ich habe mich jetzt erstmal für die curl-Variante entschieden.

Dann habe ich aber am Ende 1.500 Dateien, ist vermutlich nicht so sinnvoll.... Oder wie fasse ich die Dateien dann in eine zusammen?
Dann müßte ich halt nur noch mit regex diese drei Extrakte machen, wie ich bereits beschrieben habe.
https://www.daswirdmanjawohlnochsagenduerfen.de
https://www.neoliberalyse.de - Über die Ökonomisierung aller Lebensbereiche. |

inne
Beiträge: 3273
Registriert: 29.06.2013 17:32:10
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Re: Daten von Seite mit wget extrahieren

Beitrag von inne » 10.12.2018 17:14:29

Alternativ zu den besichtigen Lösungen.

Speicher die Webseiten mit wget als HTML und dann kannst Du das HTML mit xpath entsprechend parsen. Das Programm xpath ist im Paket libxml-xpath-perl.
Um dir bei xpath-Abfragen zu helfen, müsste man den kompletten HTML-Code kennen.
Zuletzt geändert von Anonymous am 10.12.2018 18:14:44, insgesamt 1-mal geändert.

inne
Beiträge: 3273
Registriert: 29.06.2013 17:32:10
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Re: Daten von Seite mit wget extrahieren

Beitrag von inne » 10.12.2018 17:20:22

desputin hat geschrieben: ↑ zum Beitrag ↑
10.12.2018 17:05:57
Dann habe ich aber am Ende 1.500 Dateien, ist vermutlich nicht so sinnvoll.... Oder wie fasse ich die Dateien dann in eine zusammen?
Dann müßte ich halt nur noch mit regex diese drei Extrakte machen, wie ich bereits beschrieben habe.
In dem Du z.B. mit einer Schleife über die einzelnen Datei iterierst und die Ausgabe dann in eine neue Datei schreibst.

eggy
Beiträge: 3331
Registriert: 10.05.2008 11:23:50

Re: Daten von Seite mit wget extrahieren

Beitrag von eggy » 10.12.2018 17:22:36

"cat dfde* >> alles"
Ich würd die wahrscheinlich eher einzeln lassen, seh hier keinen grossen Vorteil die zusammenzubringen. Ist jedoch ne reine Geschmackssache. Wie Du die Einzeldateien behandelst haben die Vorredner ja schon ausgeführt, zusätzlich: grep arbeitet auch auf mehreren Dateien: "grep was *html"

Benutzeravatar
desputin
Beiträge: 1270
Registriert: 24.04.2015 17:16:34

Re: Daten von Seite mit wget extrahieren

Beitrag von desputin » 10.12.2018 17:30:50

Hallo Ihr,
ok, also wie ich die 1500 Dateien runterlade ist schonmal klar. Super.

Jetzt bin ich aber verwirrt. Wie bekommte ich denn mit grep meine drei Punkte so in eine Reihe (mit Kommata getrennt), daß ich sie als CSV mit Libreoffice geöffnet bekomme? Da müßte ich dem Grep-Befehl ja quasi drei Aufträge geben und ihm sagen, daß er die jeweiligen Spalten und Zeilen eines Tabellendokuments erzeugen soll, oder?
https://www.daswirdmanjawohlnochsagenduerfen.de
https://www.neoliberalyse.de - Über die Ökonomisierung aller Lebensbereiche. |

cronoik
Beiträge: 2049
Registriert: 18.03.2012 21:13:42
Lizenz eigener Beiträge: GNU Free Documentation License

Re: Daten von Seite mit wget extrahieren

Beitrag von cronoik » 11.12.2018 02:25:23

desputin hat geschrieben: ↑ zum Beitrag ↑
10.12.2018 17:30:50
Da müßte ich dem Grep-Befehl ja quasi drei Aufträge geben und ihm sagen, daß er die jeweiligen Spalten und Zeilen eines Tabellendokuments erzeugen soll, oder?
Mir faellt jetzt keine Moeglichkeit wie das gehen soll, da grep zeilenweise arbeitet (das muss aber nichts heissen). Du kannst aber die Ausgaben verbinden:

Code: Alles auswählen

{ grep hallo bla.txt; grep du bla.txt; }  | tr "\n" " " >> out.txt
Fuer die Punkte 2 und 3 wuerde jedoch nicht mit grep arbeiten, sondern mit XPath.
desputin hat geschrieben: ↑ zum Beitrag ↑
10.12.2018 17:00:34
...
Ich bin mir nicht sicher, wo ich da anfangen soll und welche Scriptsprache in dem Fall für meinen Zweck am geeignetsten ist...
Auch wenn es hier vielleicht Unglaeubige gibt, aber die Antwort auf die Frage welche Skriptsprache am geeignesten ist, ist unabhaengig von den Anforderungen immer Python.* Mit der Bash kann man aber auch arbeiten.

*masslose Erhoehung einer eigenen oberflaechlichen Meinung zur Allgemeinverbindlichkeit
Hilf mit unser Wiki zu verbessern!

Benutzeravatar
desputin
Beiträge: 1270
Registriert: 24.04.2015 17:16:34

Re: Daten von Seite mit wget extrahieren

Beitrag von desputin » 11.12.2018 08:01:57

Ich würde doch erstmal lieber versuchen, das mit grep zu versuchen.
Also wie bekomme ich denn mit Grep diese Elemente extrahiert?

2.

Code: Alles auswählen

<h4 class="font-weight-bold">Späti Ecke 2</h4>
oder

Code: Alles auswählen

<h4 class="font-weight-bold">Supermarkt Lempke</h4>
oder

Code: Alles auswählen

<h4 class="font-weight-bold">Super Supermarkt</h4>
bzw. 3.

Code: Alles auswählen

[4x Leerzeichen]Soding Str. 31, 20489 Musterstadt<br/>
oder

Code: Alles auswählen

[4x Leerzeichen]Elbstr. 3, 63667 Nidda<br/>
https://www.daswirdmanjawohlnochsagenduerfen.de
https://www.neoliberalyse.de - Über die Ökonomisierung aller Lebensbereiche. |

cronoik
Beiträge: 2049
Registriert: 18.03.2012 21:13:42
Lizenz eigener Beiträge: GNU Free Documentation License

Re: Daten von Seite mit wget extrahieren

Beitrag von cronoik » 11.12.2018 08:29:39

desputin hat geschrieben: ↑ zum Beitrag ↑
11.12.2018 08:01:57
Ich würde doch erstmal lieber versuchen, das mit grep zu versuchen.
Sag dann aber nicht das es dir nicht gesagt worden sei.
Fuer die 2. kannst du so arbeiten:

Code: Alles auswählen

egrep -z "<h4 class=\"font-weight-bold\">(.+)<\/h4>" bla.txt
Das setzt allerdings voraus, dass es den tag h4 mit der Klasse nur einmal gibt. Fuer den 3. Punkt kannst du auch so arbeiten:

Code: Alles auswählen

egrep -z "^[[:space:]]{4}(.+)<br\/>" bla.txt
aber hier ist das Risiko andere Sache zu matchen noch hoeher.
Hilf mit unser Wiki zu verbessern!

Benutzeravatar
Lohengrin
Beiträge: 3227
Registriert: 29.08.2004 00:01:05
Wohnort: Montsalvat

Re: Daten von Seite mit wget extrahieren

Beitrag von Lohengrin » 11.12.2018 08:59:55

desputin hat geschrieben: ↑ zum Beitrag ↑
11.12.2018 08:01:57
Ich würde doch erstmal lieber versuchen, das mit grep zu versuchen.
Na dann. Ich versuche nicht in Worten zu beschreiben, was das tut. Es tut nämlich genau das, was da steht.
desputin hat geschrieben: ↑ zum Beitrag ↑
11.12.2018 08:01:57
2.

Code: Alles auswählen

<h4 class="font-weight-bold">Späti Ecke 2</h4>

Code: Alles auswählen

grep '^<h4 class="font-weight-bold">.*</h4>$'
desputin hat geschrieben: ↑ zum Beitrag ↑
11.12.2018 08:01:57

Code: Alles auswählen

[4x Leerzeichen]Soding Str. 31, 20489 Musterstadt<br/>

Code: Alles auswählen

grep '^   .*<br/>$'
Wie man es mit grep schafft, so etwas wie sed -e 's/^ \(.*\)<br\/>$/\1/' zu machen, weiß ich nicht.
Harry, hol schon mal das Rasiermesser!

eggy
Beiträge: 3331
Registriert: 10.05.2008 11:23:50

Re: Daten von Seite mit wget extrahieren

Beitrag von eggy » 11.12.2018 10:06:16

desputin hat geschrieben: ↑ zum Beitrag ↑
11.12.2018 08:01:57
Ich würde doch erstmal lieber versuchen, das mit grep zu versuchen.
Freies Html parsen ist -jedenfalls sobald die Dateien komplizierter werden- kein großer Spaß. Da sollte man lieber gleich nen Tool nehmen, das mit der darunterliegenden Dokumentenstruktur arbeitet.
Nimm innes nettes Angebot an und lass Dir zeigen wie sowas mit xpath geht.
(@inne: so war das doch gemeint, oder? :mrgreen: )

inne
Beiträge: 3273
Registriert: 29.06.2013 17:32:10
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Re: Daten von Seite mit wget extrahieren

Beitrag von inne » 11.12.2018 12:32:26

Ich spike (auch) nur und Fefe sagt, meine Quelle ist auch noch Mist :mrgreen:
Ne XPath tue ich auch selten, aber man findet doch prima Beispiele die das Prinzip erklären und i.d.R. sogar spezielle die für Einweg gut sind.
Zuletzt geändert von Anonymous am 11.12.2018 12:57:57, insgesamt 1-mal geändert.

inne
Beiträge: 3273
Registriert: 29.06.2013 17:32:10
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Re: Daten von Seite mit wget extrahieren

Beitrag von inne » 11.12.2018 12:35:50

2ter Gedanke ist das HTML in Firefox öffnen und mit WebDeveloper eine XPath-Abfrage generieren lassen...

Benutzeravatar
desputin
Beiträge: 1270
Registriert: 24.04.2015 17:16:34

Re: Daten von Seite mit wget extrahieren

Beitrag von desputin » 11.12.2018 17:25:33

Hallo Ihr, danke!

Ich habe die Datein nun also schon heruntergeladen und versuche nur noch die drei Befehle

Code: Alles auswählen

grep '^<h4 class="font-weight-bold">.*</h4>$'
und

Code: Alles auswählen

grep '^   .*<br/>$'

und

Code: Alles auswählen

grep -E -o "\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}\b"
In einen Befehl zu bekommen. Dann werde ich mit suchen und ersetzen die überflüssigen br und h4 Tags raushauen.

Kann ich also die Befehle mit grep in einen kombinieren? Alternativ würde es auch gehen, wenn grep den ersten, zweiten und dritten Befehl jeweils in 1500 neue Dateien schreibt. Ich will halt verhindern, daß bei der ganzen Konvertiererei die Zeilen verrutschen und ich dann eine falsche Adresse neben einer E-Mail-Adresse und dem Titel stehen habe. Oder grep führt die Befehlte für jede Datei halt hintereinander aus, so daß ich mit Libreoffice jeweils jede dritte Zeile automatisiert in Spalten umsortieren kann.
https://www.daswirdmanjawohlnochsagenduerfen.de
https://www.neoliberalyse.de - Über die Ökonomisierung aller Lebensbereiche. |

Benutzeravatar
MSfree
Beiträge: 10686
Registriert: 25.09.2007 19:59:30

Re: Daten von Seite mit wget extrahieren

Beitrag von MSfree » 11.12.2018 17:56:49

Man kann auch Debianlynx dazu mißbrauchen, die mit wget runtergeladenen HTML-Seiten in ASCII-Text zu wandeln, den man deutlich leichter parsen kann.

cronoik
Beiträge: 2049
Registriert: 18.03.2012 21:13:42
Lizenz eigener Beiträge: GNU Free Documentation License

Re: Daten von Seite mit wget extrahieren

Beitrag von cronoik » 11.12.2018 20:54:26

desputin hat geschrieben: ↑ zum Beitrag ↑
11.12.2018 17:25:33
In einen Befehl zu bekommen....

Kann ich also die Befehle mit grep in einen kombinieren? Alternativ würde es auch gehen, wenn grep den ersten, zweiten und dritten Befehl jeweils in 1500 neue Dateien schreibt. Ich will halt verhindern, daß bei der ganzen Konvertiererei die Zeilen verrutschen und ich dann eine falsche Adresse neben einer E-Mail-Adresse und dem Titel stehen habe. Oder grep führt die Befehlte für jede Datei halt hintereinander aus, so daß ich mit Libreoffice jeweils jede dritte Zeile automatisiert in Spalten umsortieren kann.
Siehe [1].
desputin hat geschrieben: ↑ zum Beitrag ↑
11.12.2018 17:25:33
Dann werde ich mit suchen und ersetzen die überflüssigen br und h4 Tags raushauen.
Das musst du auch nicht machen wenn du gleich mit look ahead und look behind arbeitest:

Code: Alles auswählen

grep -Po '(?<=^<h4 class="font-weight-bold">).*(?=</h4>$)' bla.txt 

Code: Alles auswählen

Späti Ecke 2                                                                                                                         
Supermarkt Lempke                                                                                                                    
Super Supermarkt 
[1] viewtopic.php?f=34&t=171605#p1191868
Hilf mit unser Wiki zu verbessern!

Antworten