Forum: PC-Programmierung Textbrowser: Link folgen


von Gerald (Gast)


Lesenswert?

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!

von Philip K. (philip_k)


Lesenswert?

wget?

von kopfkratzer (Gast)


Lesenswert?

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.

von wurst (Gast)


Lesenswert?

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

von kopfkratzer (Gast)


Lesenswert?

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 ?

von Gerald (Gast)


Lesenswert?

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!

von Dieter (Gast)


Lesenswert?

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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.

von Dieter (Gast)


Lesenswert?

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.

von Dieter (Gast)


Lesenswert?

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
}

von Gerald (Gast)


Lesenswert?

Danke Dieter!

Ich werd's mal versuchen!

von Dieter (Gast)


Lesenswert?

und schon Erfolge aufzuweisen?

von Gerald (Gast)


Lesenswert?

Nein,

ich tu mir noch schwer - habe noch nie perl programmiert... :-)

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Wenn es kein Geheimnis ist, dann poste doch mal ein Beispiel einer
solchen Webseite und dessen, was du gern daraus extrahieren möchtest.

von Gerald (Gast)


Lesenswert?

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...

von Rolf Magnus (Gast)


Lesenswert?

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

von Gerald (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.