My-Gate • Blog » 2009 » Juli

GIPP: Google Image PHP Parser

GIPP, ist mir eigentlich erst in den Sinn gekommen, als ich den Titel angeschaut habe…
Da ich die Suche für ein Covers von Filme etwas schneller machen wollte, habe ich nach einem GIPP gesucht. Hab auch einen gefunden, doch tollerweise benützt dieser cURL und naja dies kann man ja auch ein wenig anderst lösen, vorallem wenn cURL nicht installiert ist.
Darum hab ich dann meine eigene Funktion, bzw. GIPP geschrieben.

<?php

function googleImageResults($search,$start=0)
{
 $html = file_get_contents("http://images.google.ch/images?q=".htmlspecialchars(str_replace(" ","+",$search))."&start=".$start);
 //echo $html;
 preg_match_all('/dyn.setResults((.+));/', $html, $matches);

 $html = $matches[0][0];

 // Special chars decode
 $html = str_replace("\x3d","=",$html);
 $html = str_replace("\x26","&",$html);
 $html = str_replace("\x3c","<",$html);
 $html = str_replace("\x3e",">",$html);

 // Replace Useless Things
 $html = str_replace("dyn.setResults(","",$html);
 $html = str_replace(");","",$html);
 $html = str_replace("[]","",$html);
 $html = str_replace("[[","[",$html);
 $html = str_replace("]]","]",$html);
 $html = str_replace(",,""","",$html);

 // Loading in a Array
 $images = array();
 $imgs = array();
 $img = array();

 while(strpos($html,"[")!==FALSE)
 {
  $start = strpos($html,"[");
  $end = (strpos($html,"],")===FALSE?strpos($html,"]"):strpos($html,"],"));
  $image = substr($html,$start+1,$end-$start-1);
  $images[] = $image;
  $html = str_replace("[".$image."]","",$html);
 }

 foreach($images as $image)
 {
  $image = str_replace('","',"n",$image);
  $image = str_replace('"',"",$image);

  $img = explode("n",$image);
  //echo $image;

  $temp = array();

  $temp['searchurl'] = $img[0];
  $temp['searchhost'] = $img[14];
  $temp['searchlanguage'] = substr($img[0],strpos($img[0],"&hl=")+4,strpos($img[0],"&",strpos($img[0],"&hl=")+1)-(strpos($img[0],"&hl=")+4));
  $temp['searchstart'] = substr($img[0],strpos($img[0],"&start=")+7,strpos($img[0],"&",strpos($img[0],"&start=")+1)-(strpos($img[0],"&start=")+7));
  $temp['searchum'] = $img[15];
  $temp['searchcachid'] = $img[2];
  $temp['searchusg'] = substr($img[0],strpos($img[0],"&usg=")+5,strpos($img[0],"&",strpos($img[0],"&usg=")+1)-(strpos($img[0],"&usg=")+5));

  $temp['fileurl'] = $img[3];
  $temp['fileheight'] = substr($img[0],strpos($img[0],"&h=")+3,strpos($img[0],"&",strpos($img[0],"&h=")+1)-(strpos($img[0],"&h=")+3));
  $temp['filewidth'] = substr($img[0],strpos($img[0],"&w=")+3,strpos($img[0],"&",strpos($img[0],"&w=")+1)-(strpos($img[0],"&w=")+3));
  $temp['filesize'] = substr($img[0],strpos($img[0],"&sz=")+4,strpos($img[0],"&",strpos($img[0],"&sz=")+1)-(strpos($img[0],"&sz=")+4));
  $temp['fileformat'] = $img[10];
  $temp['fileinfo'] = $img[9];

  $temp['thumbnailurl'] = $img[14]."?q=tbn:".$img[2].$img[3];
  $temp['thumbnailwidth'] = $img[4];
  $temp['thumbnailheight'] = $img[5];

  $temp['host'] = $img[11];
  $temp['hostsite'] = substr($img[0],strpos($img[0],"&imgrefurl=")+11, strpos($img[0],"&",strpos($img[0],"&imgrefurl=")+1)- (strpos($img[0],"&imgrefurl=")+11));
  $temp['hostkeywords'] = $img[6];

  $temp['nothing1'] = $img[1];
  $temp['nothing2'] = $img[7];
  $temp['nothing3'] = $img[8];
  $temp['nothing4'] = $img[12];
  $temp['nothing5'] = $img[13];

  $imgs[] = $temp;
 }
 return $imgs;
}

?>

Nicht gerade der beste Schreibstil, aber ich komm irgendwie nie so richt mit regulären Ausdrücken klar, darum das ganze strpos/substr Zeugs…
Am Ende erhält man ein normales Index-Array mit mehreren Assoziierten-Arrays.
Die „nothing“ Inhalte enthalten normalerweise nichts, aber vielleicht findet jemand mehr darüber raus…
Die „unknow“ Inhalte hab ich bis jetzt einfach nicht zuordnen können. Aber da gibt es auch noch weitere Sachen, bei denen ich den Sinn noch nicht begriffen habe (z.B. ’searchum‘ oder ’searchusg‘).

Also für allen nicht so experimentier freudigen:

<?php

include("fileMitDer_googleImageResults_Funktion");

$images = googleImageResults("James Bond");
$jamesBondBild = $images[0]['fileurl'];

$images2 = googleImageResults("James Bond",21);
$jBBOffSet21 = $images[0]['fileurl'];

?>

So ich hoffe man kommt nach und das Script findet irgendwo seinen Zweck!

Sorry dass es nicht so schön dargestellt wird…

Kommentare [0]
Geschrieben am 29.07.2009 von admin in Computer, Web

Mein SQL

PHP ist schon toll. MySQL natürlich auch! Doch ist es nicht mühsam, wenn man eine Tabelle mit ~1000 Einträgen hat und merkt, dass man in einem Feld etwas vergessen hat wegzulassen?

Die “normale” Lösung wäre nun, ein PHP Skript zu schreiben, welches die Tabelle komplett runterlädt, denn Fehler mit PHP-Funktionen reparieren und denn wieder alles in die Tabelle einfügen. Nach mehrmaligem wiederholen von solch einer Prozedur wird man bald einmal nach einem besseren Weg suchen … und in SQL selbst finden!

Mein Problem:

Wie es ist:

Sean Connery::James Bond
Skinner::imdb:nm0000125
Ursula Andress::Honey Ryder
Skinner::imdb:nm0000266
Joseph Wiseman::Dr. No
Skinner::imdb:nm0936476
Jack Lord::Felix Leiter
Skinner::imdb:nm0520437

Wie es sein sollte:

Sean Connery::James Bond::imdb:nm0000125
Ursula Andress::Honey Ryder::imdb:nm0000266
Joseph Wiseman::Dr. No::imdb:nm0936476
Jack Lord::Felix Leiter::imdb:nm0520437

Meine Lösung in SQL:

Anzeigen (zur Kontrolle):

SELECT REPLACE([spalten_name],’[such_string]’,’[ersetz_string]’) FROM [tabelle];
z.B. SELECT REPLACE(actors,’nSkinner‘,“) FROM videodb_videodata;

Ersetzten (wenn Kontrolle OK):

UPDATE [tabelle] SET [spalten_name] = REPLACE([spalten_name],’[such_string]’,’[ersetz_string]’);
z.B. UPDATE videodb_videodata SET actors = REPLACE(actors,’nSkinner‘,“);

Nun gut dieses Problem wäre gelöst! Doch Moment mal, da hab ich in jedem Feld noch einen Zeilenumbruch, welcher nicht dort sein sollte. Doch zum Glück besitzt SQL auch noch weitere praktische Funktionen!

Entfernen eines Zeichen am Schluss

Wie es ist:


Maxwell Shaw::Communications Foreman (uncredited)::imdb:nm0789871
Bob Simmons::James Bond in Gunbarrel Sequence (uncredited)::imdb:nm0799689
  

Wie es sein soll:


Maxwell Shaw::Communications Foreman (uncredited)::imdb:nm0789871
Bob Simmons::James Bond in Gunbarrel Sequence (uncredited)::imdb:nm0799689

   = nichts, soll nur Umbruch veranschaulichen

Lösung

Anzeigen (zur Kontrolle):

SELECT SUBSTR([spalten_name],[start_pos_beginnt_1],{[länge]}) FROM [tabelle];
z.B. SELECT SUBSTR(actors,1,LENGTH(actors)) FROM videodb_videodata;

Ersetzten (wenn Kontrolle OK):

UPDATE [tabelle] SET [spalten_name] = SUBSTR([spalten_name],[start_pos_beginnt_1],{[länge]});
z.B. UPDATE videodb_videodata SET actors = SUBSTR(actors,1,LENGTH(actors));

Nun für ein wenig mehr erfahrene Personen war dies nun wohl offensichtlich, aber vielleicht kann es ja au anderen von Nutzen sein.

Eine kurze Übersicht über die verschiedenen Befehle in SQL findet man hier (English).
Die Probleme sind aus dem Arbeiten mit VideoDB [1] [2] [3] und eigenen Update Skripts entstanden.

[1] http://www.videodb.net/blog/
[2] http://sourceforge.net/projects/videodb/
[3] http://www.splitbrain.org/projects/videodb

Kommentare [0]
Geschrieben am 26.07.2009 von admin in Computer, Web

Tools für Monitor(e)

Monitor aus!

Seit dem ich nun ein neues Notebook habe (Dell Inspiron 640m), fehlt mir die FN-Tastenkombination um den Monitor auszuschalten. Da ich nicht jedes Mal in Standby fahren oder den Deckel schliessen möchte, habe ich nach einer Alternative gesucht und bin nach kurzem Suchen und ausprobieren auf eine befriedigende Lösung gestossen.

Standby.exeQuelle

Als Alternative gibt es ein Programm welche eine grafische Oberfläche hat und zuerst noch einen drei Sekunden langen Countdown hat.

MonOff.exeQuelle

Multi-Taskbar

Da ich seit kurzem mit zwei Monitoren Arbeite, habe ich oft das Problem gehabt, dass meine Taskbar einfach zu klein war. Deshalb hab ich mich auf die Suche gemacht nach einer anständigen Lösung und tatsächlich gibt es da eine: UltraMon

UltraMon_2.7.1_en_x32.msi

Leider lässt sich die Freeversions nur als Trial verwenden. "But Google is your best friend!"

Kommentare [2]
Geschrieben am 20.07.2009 von admin in Computer, Windows