Komplette Webseiten mit Java herunterladen?

... komplette Frage anzeigen

3 Antworten

Lade doch einfach die Startseite herunter, und dann iteriere rekursiv über alle Unterseiten. Dabei wird jede HTML-Seite nach CSS, JS und Bilddateien durchsucht.

Ich verstehe jetzt nicht ganz, wo genau das Problem liegen soll. :)

Für einfache Fälle dürfte "openStream()" der URL-Klasse genügen. Eine Website lässt sich so mit zwei bis drei Zeilen Java-Code herunterladen.

Zum Parsen kannst du etwas "Richtiges" benutzen, oder du fummelst dir auf die Schnelle ein paar RegExen zusammen.

Mmmh ... also ich würde vermutlich höchstens 50 Zeilen benötigen. Vielleicht auch 100 Zeilen wenn ich nicht Pfusche. 300 Zeilen mit Unit-Tests. 500 Zeilen mit Dokumentation. Aber in deinem Falle reicht die 50-Zeilen Pfusch-Version aus, denke ich. :)

Guck dir einfach die Api-Docs der URL-Klasse an! Alles andere ergibt sich automatisch von selbst. :)

PS: Viele Webserver erkennen solche Requests und blocken diese. Du solltest also unbedingt die "robots.txt" berücksichtigen, und mithilfe einiger Kniffe die Erkennung deines Crawlers verhindern. Wie das genau geht, findest du bei Google. :)

Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von TeeTier
06.02.2016, 17:51

PS: Hier gibt es viele gute Hinweise zu dem Thema:

http://stackoverflow.com/questions/238547/how-do-you-programmatically-download-a-webpage-in-java

Beachte bitte NICHT die oberste Antwort, sondern die vom User "jinguy" etwas weiter unten.

Dort gibt er folgendes Snippet als Hinweis für das Ändern des User-Agents:

conn.setRequestProperty ( "User-agent",
"my agent name");

Das Problem ist, dass Java intern den User-Agent auf "my agent name/Java x.y.z" mit der Java-Version setzt. Daran erkennt man als geübter Admin die billigen Crawler von Skript-Kiddies und kann diese sehr komfortabel blocken.

Ich habe mir dafür mal ein Workaround überlegt ... ist aber schon ca. 10 Jahre her, also keine Ahnung ob das noch funktioniert:

conn.setRequestProperty("User-agent",
"my agent name\r\nX-Foo: foo");

Der Übersicht halber habe ich das jetzt mal auf 2 Zeilen verteilt.

Intern wird damit der User-Agent WIRKLICH auf "my agent name" gesetzt, und da - zumindest vor vielen Jahren - Java nicht auf ungültige Zeichen prüft, folgt darauf ein weiterer Header "X-Foo" mit dem Wert "foo/Java x.y.z".

Selbst eine Website, die im User-Agent nach "Java x.y.z" sucht, wird dabei nichts finden, und einen "X-Foo" Header dürfte keine Website der Welt erwarten und parsen. :)

Ich habe diesen Trick Jahre lang eingesetzt und immer geheim gehalten, damit kein übereifriger Webmaster einen Schutz dagegen in seine Websites einbaut. Aber erstens benutze ich Java schon sehr lange nicht mehr für Crawling-Aufgaben, da andere Sprachen hierfür deutlich effizienter sind, und außerdem dürften vermutlich noch viele andere Leute außer mir im Laufe der Zeit auf die gleiche Idee gekommen sein.

Wer wirklich ernsthaft crawlen will, der setzt sowieso keine fertigen Bibliotheken ein, sondern baut sich seine HTTP-Lib selber. :)

0
Kommentar von FelixCrafting
19.02.2016, 11:41

Es währe nett von dir, wenn du mir bitte so eine Klasse zusammenschreiben würdest.

0

Solltest du damit auch die PHP Scripte etc. meinen welche für die letztendliche funktion der Seite zuständig sind wird das nicht funktionieren, die komplette seite kopieren geht höchstens bei reinen HTML seiten. (Mit funktionalität)

Antwort bewerten Vielen Dank für Deine Bewertung

Ich weiß jetzt nicht ganz genau, aber es gibst ein addon für Firefox. Es heißt "page-Hacker".
Hier kannst du kommplette Websiten Bearbeiten, und sie als HTML auf der Platte speicher.

Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von FelixCrafting
06.02.2016, 16:31

Ich brauche ein Java-Programm, was auf Befehl hin die Seite autom. herunterlät.

0

Was möchtest Du wissen?