Hallo, ich möchte von verschiedenen Webseiten automatisiert Informationen auslesen. Dazu möchte ich mir ein shell-Skript schreiben, das auf meinem Raspberry läuft und regelmäßig ausgeführt wird. Dieses soll die Webseiten mit dem Textbrowser W3M aufrufen und entsprechende Passagen an mich per Mail senden. Leider ist auf manchen Webseiten die gewünschte Information nie unter einer festen Adresse erreichbar, sondern man muss ein bis zwei Links klicken. Man kann mit "grep" die Zeile mit dem Link suchen, aber wie kann man diesem dann automatisiert folgen? Danke!
kopfkratz Ja und wo liegt nun das Problem ? Du parst die HTML Tags nach Deinem Stichwort und wenn da ein Link auftaucht machst Du damit eine Rekursion bis Du am gewünschten Dokument bist.
rss geht nicht? inwiefern muss man 1-2mal klicken? ist das mit javascript o.ä. gelöst? ansonsten kann ich meinem vorredner zustimmen: wget mit --mirror option oder rekursion einschränken
wurst schrieb: > rss geht nicht? > > inwiefern muss man 1-2mal klicken? ist das mit javascript o.ä. gelöst? > > ansonsten kann ich meinem vorredner zustimmen: wget mit --mirror option > oder rekursion einschränken Er will ja nicht alles herunterladen sondern eine bestimmte Info in einem HTML Dokument finden. Oder habe ich da was falsch verstanden ? OK wget in grep umleiten geht auch, fragt sich nur wie man da dann einen bestimmten Textteil finden und mailen kann ?
Ich bin da nicht so erfahren... Habe jetzt wget -r -l1 ausgeführt und mir so ca 10 Dateien runtergeladen. Wirklich weitergekommen bin ich dadurch nicht. @kopfkratzer: genau so soll es sein.. Kannst Du mir Deinen Tipp nochmal etwas genauer erläutern? Danke!
Hallo Gerald, wget ist eine nettes Tool, aber ich glaube das was Du brauchst ist Perl mit dem Modul WWW::Mechanize. Das Modul ist richtig nett, ich selbst hole damit meine digitale Version der Tageszeitung aus dem Netz und sende sie mir per eMail zu. Die Webseite der Tageszeitung sowie das App sind eine Zumutung. Dafür wird eine https-Verbindung inkl. Login problemlos mit WWW::Mechanize aufgebaut, die richtigen Links gesucht und danach runtergeladen. Das ganze Skript hat 75 Zeilen! Der Versand erfolgt danach mit dem Perl Skript smtp-cli per eMail. Das alles läuft nachts um 5:30h auf meinem Raspberry und morgens auf dem Weg zur Arbeit lese ich in Ruhe meine eMails. Hier die wichtigen Links: http://www.linux-magazin.de/Ausgaben/2004/03/Datenruessel http://www.logix.cz/michal/devel/smtp-cli/ Dieter
WWW::Mechanize kannte ich noch nicht, habe aber schon ähnliches mit den normalen Perl-Modulen gebaut (HTTP::Request, HTML::TokeParser, LWP::UserAgent). Finde ich auch sinnvoller, als zu versuchen, einen w3m zu automatisieren.
in dem von mir genannten Link wird auch beschrieben wie einfach es es mit dem Perl Modul WWW::Mechanize::Shell die Website von einer Shell zu bedienen und daraus später dann ein WWW::Mechanize kompatibles Skript zu erstellen. Das geht erstaunlich gut.
Hier mal ein Simples Beispiel für alle Interessierten:
1 | #!/usr/bin/perl -w
|
2 | #use strict;
|
3 | use WWW::Mechanize; |
4 | use WWW::Mechanize::FormFiller; |
5 | use URI::URL; |
6 | #use Date::Calc qw(Today);
|
7 | use Date::Calc qw(Today Day_of_Week Decode_Month |
8 | Add_Delta_YMD Date_to_Days); |
9 | |
10 | # Titel der einzelnen PDF-Teilausgaben
|
11 | # Achtung es sind nicht an jedem Wochentag alle Teile erhältlich, daher wird weiter unten eine
|
12 | # Schnittmenge zwischen diesem Array und den wirklich erhältlichen Zeitungen gebildet.
|
13 | my @Daten = ("Hauptzeitung", "Lokalteil", "Stellenmarkt", "Immobilien", "Lokalteil 2"); |
14 | |
15 | my $zeitung; |
16 | my ($year, $month, $day) = Today(); |
17 | my $file2 = sprintf("_%02d_%02d_%d", $day, $month, $year); |
18 | my $agent = WWW::Mechanize->new( autocheck => 1 ); |
19 | my $formfiller = WWW::Mechanize::FormFiller->new(); |
20 | |
21 | $agent->agent('User-Agent=Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.7'); |
22 | $agent->env_proxy(); |
23 | |
24 | |
25 | $agent->get('https://login.musterzeitung'); |
26 | $agent->form_number(1) if $agent->forms and scalar @{$agent->forms}; |
27 | $agent->form_number(2); |
28 | $formfiller->add_filler( 'inputLogin' => Fixed => 'mustermann' ); |
29 | $formfiller->add_filler( 'inputPass' => Fixed => 'mussermannPassword' ); |
30 | $formfiller->fill_form($agent->current_form); |
31 | $agent->submit(); |
32 | $agent->follow_link('n' => 1); |
33 | $agent->follow_link('n' => 2); |
34 | # Debug
|
35 | $agent->save_content('out.html'); |
36 | # End/Debug
|
37 | # Suche den Link mit der Beschriftung 'Download der Zeitung'
|
38 | $agent->follow_link('text_regex' => qr((?^:Download der Zeitung))); |
39 | |
40 | |
41 | # Linkstext abspeichern
|
42 | my @Alpha; |
43 | @Alpha = $agent->links(); |
44 | my $x = WWW::Mechanize::Link->new(); |
45 | my @List; |
46 | foreach $x (@Alpha) |
47 | {
|
48 | push(@List,$x->text()); |
49 | }
|
50 | |
51 | # Schnittmenge beider Listen finden
|
52 | my ($el, $el2); |
53 | foreach $el (@List) { |
54 | foreach $el2 (@Daten) { |
55 | if (defined $el2 && $el =~ /^\Q$el2/ ) { |
56 | #print "gefunden\n";
|
57 | push(@final,$el2); |
58 | undef $el2; |
59 | last; |
60 | }
|
61 | }
|
62 | }
|
63 | |
64 | # Download Zeitung
|
65 | foreach $zeitung(@final) |
66 | {
|
67 | # Debug
|
68 | $agent->save_content('out.html'); |
69 | # End/Debug
|
70 | |
71 | # Zeitung suchen
|
72 | $agent->find_link('text_regex' => qr((?^:$zeitung))); |
73 | if ($agent->success()) { |
74 | # den Link folgen
|
75 | $agent->follow_link('text_regex' => qr((?^:$zeitung))); |
76 | # und als PDF speichern
|
77 | $agent->save_content($zeitung.$file2.'.pdf', binmode => ':raw'); |
78 | |
79 | print "$zeitung geladen\n"; |
80 | print $zeitung.$file2. ".pdf geschrieben\n"; |
81 | |
82 | # wieder zurück
|
83 | $agent->back(); |
84 | } else { |
85 | print "$zeitung nicht gefunden"; |
86 | }
|
87 | }
|
Wenn es kein Geheimnis ist, dann poste doch mal ein Beispiel einer solchen Webseite und dessen, was du gern daraus extrahieren möchtest.
Nö, ist kein Geheimnis. Ich möchte wöchentlich die Gewinnzahlen der AktionMensch Lotterie schicken lassen. www.aktion-mensch.de --> Lotterie --> Alle Gewinnzahlen Die Adresse der Seite ist ein zufälliger Code, der sich immer ändert - warum auch immer. Momentan hänge ich aber bei der Installation der CPAN Module. Mein Raspberry installiert da schon seit Stunden rum...
Gerald schrieb: > Die Adresse der Seite ist ein zufälliger Code, der sich immer ändert - > warum auch immer. Da ist eine Session-ID drin. Aber die kannst du auch weglassen: https://www.aktion-mensch.de/co/am/pls/lotterie/am.controller?p_seite=service_gewinnzahlen
Na toll... ..jetzt muss ich mir ien anderes Feierabendprojekt suchen... ;-)
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.