Hente flere billeder fra Google Billedsøgning script
Hej alle sammen
Forsøger i forbindelse med et lille projekt for en af mine venner, at få lavet et script som udfra navnet på en mappe eller ligende kan hente et billede der passer til indholdet. Altså f.eks. hvis mappen hedder "openSUSE" henter den det "første" billede fra Google billedsøgning og gemmer i mappen.
But first things first... Skal have en måde hvorpå man i det hele taget kan få hentet billederne fra Google på en automatiseret måde via et script. I den forbindelse fandt jeg et gammet script "Wget Google image collector", men det virker ikke rigtigt - umiddelbart har jeg på fornemmelsen at det skyldes det "nye design" på Google, da scriptet er fra 2006. Har forsøgt en langrække forskellige ting, og prøvet selv at tilpasse meeen....
Men derfor håbede jeg på at der var nogle af jer, som kunne hjælpe mig med at få det tilpasset således at det virker endnu engang. (Eller måske har en helt anden måde at få det til at virke på?) .
I en anden forbindelse fik jeg desuden et tip fra Julemand101 om at der findes siden "Google Image Ripper", som måske kan gøre processen nemmere end at hente direkte fra Google.
Håber I har en idé om hvor jeg vil hen af og I kan hjælpe mig - ellers er det bare at spørge :-)
Henvisninger:
Wget Google image collector: http://www.krazyworks.com/wget-google-image-collector/
Google Image Ripper: http://dearcomputer.nl/gir/
- Log in to post comments
Kommentarer11
Må det være i PHP? Det er
Må det være i PHP? Det er ret nemt. Det er det måske også i bash, men jeg er ikke så godt inde i det.
I princippet er det sådan
I princippet er det sådan set "ligegyldigt" om det er PHP... Men umiddelbart faldt jeg over et shell script, da det er det eneste jeg sådan lige umiddelbart kendte rigtigt til... :-)
Her er et simpelt, men
Her er et simpelt, men virksomt eksempel.

Gem filen fx med navnet gimage.php og brug det således i terminalen:
php gimage.php
Mon ikke det kan lede dig på rette spor?
<?php
echo 'Indtast søgestreng: ';
$query = urlencode(trim(fgets(STDIN)));
$url = "http://images.google.com/images?q=$query";
echo $url,"\n";
$html = file_get_contents($url);
if (preg_match('%
$imgurl = $match[1];
$filename = basename($imgurl);
$imgdata = file_get_contents($imgurl);
file_put_contents($filename, $imgdata);
echo "Billedet '$filename' er gemt.\n";
}
else {
echo "Billedet kunne ikke gemmes";
}
?>
Tusind tak Marlar, virker
Tusind tak Marlar, virker helt perfekt :-D Beklager jeg først svarer nu, har ikke lige haft tid før..
Nu må jeg se om jeg kan få resten til at virke, men igen Tusind tak :-D
Tilføjelse:
Hvis det kunne have interesse har jeg leget lidt med Marlar´s script, således at den kan håndtere flere søgekriterier på "en gang", altså f.eks. hvis man både vil have et billede af en Hund, Kat osv.
Tekst filen søgeord bestemmer hvad der skal søges efter (Kriterierne er adskildt med ny linje), et eksempel
Hund
Kat
Fisk
Gris
Her er selve hovedfilen
<?php

# Henter data fra tekst filen
$HentTitler = file_get_contents("sogeord.txt");
# Placerer hver linje i Array
$Explodetitler = explode("\n",$HentTitler);
# Erstatter hver gang variablen $query kommer med værdien i $Explodetitler
foreach ($Explodetitler as $query) {
# echo 'Indtast søgestreng: ';
# Giver tekst input
#$query = urlencode(trim(fgets(STDIN)));
$url = "http://images.google.com/images?q=$query";
echo $url,"\n";
$html = file_get_contents($url);
if (preg_match('%
$imgurl = $match[1];
$filename = basename($imgurl);
$imgdata = file_get_contents($imgurl);
file_put_contents($filename, $imgdata);
# $dir bestemmer mål for hvor I filen skal kopieres. Fjern sektion, hvis der skal gemmes i nuværrende mappe.
$dir = "./$query/$filename";
copy($filename, $dir);
unlink($filename);
echo "Billedet '$filename' er gemt.\n";
}
else {
echo "Billedet kunne ikke gemmes";
}
}
?>
Endnu engang tak Marlar
Hej Froksen
Godt at du kunne
Hej Froksen
Godt at du kunne bruge eksemplet!
En lille detalje: Du må ikke undlade urlencode() da du ellers får problemer med søgeord med specialtegn eller mellemrum fx "lille hund". Danske tegn vil måske også give problemer.
Indsæt derfor denne linje først i din forach-løkke:
$query = urlencode($query);
Hej Marlar
Super tip, takker
Hej Marlar
Super tip, takker :-D Har fixet det så det også virker - tsk tsk, lader da ligefrem at det kan gå hen og lykkes ;-)
Igen tak
<?php

#shell_exec("ls -1 | grep .zip | sed 's/\(.*\)\..*/\1/' > zipfilnavne.txt");
# Danner sogeord udfra mappenavne
shell_exec("ls -d */ > sogeord.txt");
# Henter data fra tekst filen
#$HentTitler = file_get_contents("zipfilnavne.txt");
$HentTitler = file_get_contents("sogeord.txt");
# Placerer hver linje i Array
$Explodetitler = explode("\n",$HentTitler);
#$Explodetitler_urlencode = urlencode($Explodetitler)
# Erstatter hver gang variablen $query kommer med værdien i $Explodetitler
foreach ($Explodetitler as $query) {
# echo 'Indtast søgestreng: ';
# Giver tekst input
#$query = urlencode(trim(fgets(STDIN)));
# Er nødvendig for at scriptet tilslut kan kopirer filerne til de rigtige mapper. Fjern evt. hvis denne funktion ikke skal bruges.
$mappedir = $query;
# Er nødvendigt for at kunne håndtere special tegn og mellemrum i filnavne.
$query = urlencode($query);
$url = "http://images.google.com/images?q=$query";
echo $url,"\n";
$html = file_get_contents($url);
if (preg_match('%
$imgurl = $match[1];
$filename = basename($imgurl);
$imgdata = file_get_contents($imgurl);
file_put_contents($filename, $imgdata);
# $dir bestemmer mål for stedet hvor i der skal kopieres. Fjern sektion, hvis der skal gemmes i nuværrende mappe.
$dir = "./$mappedir/$filename";
copy($filename, $dir);
unlink($filename);
echo "Billedet '$filename' er gemt i mappen $mappedir.\n";
}
else {
echo "Billedet kunne ikke gemmes";
}
}
?>
Du kan lige så godt få et
Du kan lige så godt få et tip mere :-)

I stedet for at gå omvejen over shell_exec, kan du springe hele den første smøre over og starte direkte med:
foreach (glob('*', GLOB_ONLYDIR) as $query) {
Desuden kan du gemme direkte i den rigtige mappe i stedet for at kopiere og slette billedet:
file_put_contents("$mappedir/$filename", $imgdata);
Det samlede script bliver så noget kortere:
<?php
foreach (glob('*', GLOB_ONLYDIR) as $query) {
# Er nødvendig for at scriptet tilslut kan kopirer filerne til de rigtige mapper. Fjern evt. hvis denne funktion ikke skal bruges.
$mappedir = $query;
# Er nødvendigt for at kunne håndtere special tegn og mellemrum i filnavne.
$query = urlencode($query);
$url = "http://images.google.com/images?q=$query";
$html = file_get_contents($url);
if (preg_match('%
$imgurl = $match[1];
$filename = basename($imgurl);
$imgdata = file_get_contents($imgurl);
file_put_contents("$mappedir/$filename", $imgdata);
echo "Billedet '$filename' er gemt i mappen $mappedir.\n";
}
else {
echo "Billedet kunne ikke gemmes";
}
}
?>
Få det til at virke med det nye Google?
Hej alle sammen..
Er der nogen der kan få dette script til at virke med det nye Google image search? Har googlet lidt, og forsøgt lidt selv, men kan bare ikke få det til at virke... :-S
OT: Nogle der kender noget
OT: Nogle der kender noget lignende til dette bare gjort i bash :)?
#8: Jeg skal se om jeg kan
#8: Jeg skal se om jeg kan få tid at kigge på det i løbet af et par dage.
I bash...og med lynx
I bash...og med lynx (tekstbaseret browser) installeret:
#!/bin/bash
for searchterm in $(cat searchterms.txt)
do
mkdir -p "searchresults/$searchterm"
cd searchresults/$searchterm
lynx -listonly -force_html -dump -image_links -accept_all_cookies "http://www.google.dk/images?q=$searchterm&hl=da&biw=1523&bih=742" | grep -m 1 -i http://www.google.dk/imgres | sed 's/.*imgurl=\(.\+\)&imgrefurl.*/\"\1\"/' | xargs wget
cd ../..
done
Og så en fil ved siden af, der hedder searchterms.txt med linjeseparerede søgetermer:
hund
kat
slange
Det går sikkert galt, hvis søgetermerne indeholder eksotiske tegn (og sikkert også mellemrum), men mon ikke du kan finpolere det selv :)