seth: Bilder aus dyn. Webseite

Beitrag lesen

gudn tach!

ich möchte die Bild-URL von einer Webseite haben, die die Bilder per Ajax nachlädt (Nachrichtenseite).

wenn nicht alles automatisch laufen soll, sondern man von hand diverse sachen vorarbeiten darf, dann geht's u.u. relativ einfach, wie hingucker auch schon kurz gezeigt hat. ich greife hinguckers loesung weiter unten auf.

Das ganze von der Linuxshell oder/und php per cron laden.

ok, dann nehmen wir perl. :-)

  • wkhtmltopdf url file.pdf gibt mir zwar ein pdf mit bildern - bekomm sie aber aus dem pdf nicht raus.

ich kenne wkhtmltopdf nicht, aber wenn die bilder im pdf noch bilder sind, dann lassen sie sich vielleicht mit 'pdfimages' extrahieren.

Wer kann mir helfen?

hingucker. allerdings bin ich so frei, den loesungsweg von hingucker etwas detailierter zu beschreiben und zu modifizieren.

es geht dir darum, die comics von diesem url runterzuladen. also:

  1. rechtsklick auf eines der bilder, 'view image info', aha z.b. 'http://images.scribblelive.com/2015/9/18/0c4ee31a-0098-4edd-aae7-73df249397da.jpg'. domain merken.
  2. irgendein tool zum ueberwachen des traffics aktivieren, z.b. in firefox 'tools'->'web developer'->'network' oder das plugin livehttpheaders oder allgemeiner: wireshark.
  3. originalseite (mit den comics) erneut laden
  4. im network-tool schauen, welche requests an images.scribblelive.com geschickt wurden.
  5. diese requests manuell erneut senden (das koennen GET oder auch POST requests sein) und ergebnis anschauen. am vielversprechendsten sieht der inhalt von 'http://apiv1.scribblelive.com/event/1065698/page//?Token=Q872zTYJ&Max=100&Order=asc&format=json&callback=RecentPosts.GetInstance%280%29.DrawPosts' aus. da stehen sogar schon die bilder drin. allerdings scheint der callback-parameter nur dazu zu fuehren, dass der json-output komplett in einen zusaetzlichen funktionsaufruf eingebacken wird. ohne den parameter sieht das ergebnis besser aus: 'http://apiv1.scribblelive.com/event/1065698/page//?Token=Q872zTYJ&Max=100&Order=asc&format=json'
  6. in einem tool, mit dem man den json-matsch schoener anschauen kann, die struktur analysieren, z.b.
#!/usr/bin/perl
use strict;
use warnings;
use LWP::Simple;
use JSON;
use Data::Dumper;

my $url = 'http://apiv1.scribblelive.com/event/1065698/page//?Token=Q872zTYJ&Max=100&Order=asc&format=json';
my $struct = decode_json(get $url);
print Dumper $struct;

speichern als z.b. 'dl_comics.pl' und dann

perl dl_comics.pl | less

aha, aha, so so, wir wollen also die 'Url's der ersten eintraege von 'Media' aller elemente, die in 'Posts' enthalten sind.

in perl geht das einfach mittels

my @images = grep{defined} map{ $_->{Media}->[0]{Url} } @{$struct->{Posts}};

das 'grep{defined}' sortiert nur die faelle aus, in denen kein 'Media'-element existiert.

somit waere das komplette script (frei nach hingucker)

#!/usr/bin/perl
use strict;
use warnings;
use LWP::Simple;
use JSON;
use Data::Dumper;

my $url = 'http://apiv1.scribblelive.com/event/1065698/page//?Token=Q872zTYJ&Max=100&Order=asc&format=json';
my $struct = decode_json(get $url);
my @images = grep{defined} map{ $_->{Media}->[0]{Url} } @{$struct->{Posts}};
print Dumper \@images;

im gegensatz zum von hingucker verwendeten url, sind bei diesem auch mehr bilder drin, aber immer noch nicht alle. einige bilder sind offenbar in 'Content' statt in 'Media' enthalten.

ok, wenn man eh html-code durchsuchen soll, dann kann man sich auch gleich das json-gedoens sparen und mit regulaeren ausdruecken arbeiten:

#!/usr/bin/perl
use strict;
use warnings;
use LWP::Simple;
use Data::Dumper;

my $url = 'http://apiv1.scribblelive.com/event/1065698/page//?Token=Q872zTYJ&Max=100&Order=asc&format=json';
my $re_image = qr/(\bimages\.scribblelive\.com\/[0-9a-f\/-]+\.[a-z]+)/;
my @images = sort keys{map {'http://' . $_ => 1} (get($url) =~ /$re_image/g)};
print Dumper \@images;

von hinten nach vorne gelesen:

  • get($url) ist der content, der mit dem regexp durchforstet wird.
  • alle (g-modifier) fundstellen werden in ein array geklatscht, auf das map angewendet wird.
  • {map {'http://' . $_ => 1} ...} erstellt eine hash reference, bei der jedem url eine 1 zugewiesen wird. dadurch werden doppelte eintraege verhindert.
  • mit 'keys' greift man nun die urls heraus.
  • 'sort' ist fuer die sortierung der urls.

das ganze geht auch in einer zeile, aber dadurch wird's nicht lesbarer.

am ende erhaelt man jedenfalls eine liste mit dann hoffentlich allen bildern (der ersten comic-seite, fuer die zweite kann man analog verfahren).

prost

seth