Je voudrais télécharger la n-ème image que Google me donne avec la ligne de commande, comme avec la commande wget
Pour rechercher l'image de [something]
, je vais simplement à la page https://www.google.cz/search?q=[something]&tbm=isch
, mais comment puis-je obtenir l'URL du n-ième résultat de recherche pour pouvoir utiliser wget?
Première tentative
Vous devez d’abord définir l’agent utilisateur pour que Google autorise la sortie des recherches. Ensuite, nous pouvons rechercher des images et sélectionner celle désirée. Pour ce faire, nous insérerons des retours à la ligne manquants, wget renverra les recherches Google sur une seule ligne et filtrera le lien. L'index du fichier est stocké dans la variable count
.
$ count=10
$ imagelink=$(wget --user-agent 'Mozilla/5.0' -qO - "www.google.be/search?q=something\&tbm=isch" | sed 's/</\n</g' | grep '<img' | head -n"$count" | tail -n1 | sed 's/.*src="\([^"]*\)".*/\1/')
$ wget $imagelink
L'image sera maintenant dans votre répertoire de travail, vous pouvez modifier la dernière commande et spécifier le nom du fichier de sortie souhaité.
Vous pouvez le résumer dans un script shell:
#! /bin/bash
count=${1}
shift
query="$@"
[ -z $query ] && exit 1 # insufficient arguments
imagelink=$(wget --user-agent 'Mozilla/5.0' -qO - | "www.google.be/search?q=${query}\&tbm=isch" | sed 's/</\n</g' | grep '<img' | head -n"$count" | tail -n1 | sed 's/.*src="\([^"]*\)".*/\1/')
wget -qO google_image $imagelink
Exemple d'utilisation:
$ ls
Documents
Downloads
Music
script.sh
$ chmod +x script.sh
$ bash script.sh 5 awesome
$ ls
Documents
Downloads
google_image
Music
script.sh
Maintenant, le google_image
devrait contenir la cinquième image de Google lorsque vous recherchez «génial». Si vous rencontrez des bugs, faites le moi savoir, je vais m'en occuper.
Meilleur code
Le problème avec ce code est qu'il renvoie des images en basse résolution. Une meilleure solution est la suivante:
#! /bin/bash
# function to create all dirs til file can be made
function mkdirs {
file="$1"
dir="/"
# convert to full path
if [ "${file##/*}" ]; then
file="${PWD}/${file}"
fi
# dir name of following dir
next="${file#/}"
# while not filename
while [ "${next//[^\/]/}" ]; do
# create dir if doesn't exist
[ -d "${dir}" ] || mkdir "${dir}"
dir="${dir}/${next%%/*}"
next="${next#*/}"
done
# last directory to make
[ -d "${dir}" ] || mkdir "${dir}"
}
# get optional 'o' flag, this will open the image after download
getopts 'o' option
[[ $option = 'o' ]] && shift
# parse arguments
count=${1}
shift
query="$@"
[ -z "$query" ] && exit 1 # insufficient arguments
# set user agent, customize this by visiting http://whatsmyuseragent.com/
useragent='Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:31.0) Gecko/20100101 Firefox/31.0'
# construct google link
link="www.google.cz/search?q=${query}\&tbm=isch"
# fetch link for download
imagelink=$(wget -e robots=off --user-agent "$useragent" -qO - "$link" | sed 's/</\n</g' | grep '<a href.*\(png\|jpg\|jpeg\)' | sed 's/.*imgurl=\([^&]*\)\&.*/\1/' | head -n $count | tail -n1)
imagelink="${imagelink%\%*}"
# get file extention (.png, .jpg, .jpeg)
ext=$(echo $imagelink | sed "s/.*\(\.[^\.]*\)$/\1/")
# set default save location and file name change this!!
dir="$PWD"
file="google image"
# get optional second argument, which defines the file name or dir
if [[ $# -eq 2 ]]; then
if [ -d "$2" ]; then
dir="$2"
else
file="${2}"
mkdirs "${dir}"
dir=""
fi
fi
# construct image link: add 'echo "${google_image}"'
# after this line for debug output
google_image="${dir}/${file}"
# construct name, append number if file exists
if [[ -e "${google_image}${ext}" ]] ; then
i=0
while [[ -e "${google_image}(${i})${ext}" ]] ; do
((i++))
done
google_image="${google_image}(${i})${ext}"
else
google_image="${google_image}${ext}"
fi
# get actual picture and store in google_image.$ext
wget --max-redirect 0 -qO "${google_image}" "${imagelink}"
# if 'o' flag supplied: open image
[[ $option = "o" ]] && gnome-open "${google_image}"
# successful execution, exit code 0
exit 0
Les commentaires doivent être explicites, si vous avez des questions sur le code (comme le long pipeline), je me ferai un plaisir de vous expliquer les mécanismes. Notez que je devais définir un agent utilisateur plus détaillé sur le wget, il peut arriver que vous deviez définir un agent utilisateur différent, mais je ne pense pas que ce sera un problème. Si vous rencontrez un problème, visitez le site http://whatsmyuseragent.com/ et fournissez la sortie dans la variable useragent
.
Lorsque vous souhaitez ouvrir l'image au lieu de la télécharger uniquement, utilisez l'indicateur -o
, exemple ci-dessous. Si vous souhaitez étendre le script et inclure également un nom de fichier de sortie personnalisé, faites le moi savoir et je l'ajouterai pour vous.
Exemple d'utilisation:
$ chmod +x getimg.sh
$ ./getimg.sh 1 dog
$ gnome-open google_image.jpg
$ ./getimg.sh -o 10 donkey
Ceci est un ajout à la réponse fournie par ShellFish . Beaucoup de respect à eux pour avoir travaillé cela. :)
Google a récemment changé son code Web pour la page de résultats des images, ce qui a malheureusement cassé le code de Shellfish. Je l'utilisais tous les soirs dans un travail cron jusqu'à il y a environ 4 jours, quand il cessait de recevoir les résultats de recherche. Lors de mes recherches, j'ai constaté que Google avait supprimé des éléments tels que imgurl et s'était beaucoup déplacé vers javascript.
Ma solution est une extension du code génial de Shellfish, mais des modifications ont été apportées pour prendre en charge ces modifications de Google. Certaines de mes propres améliorations ont également été apportées.
Il effectue une recherche Google unique, enregistre les résultats, télécharge en bloc un nombre spécifié d'images, puis les construit en une seule image de galerie à l'aide d'ImageMagick. Jusqu'à 1 000 images peuvent être demandées.
Ce script bash est disponible sur https://git.io/googliser
Je vous remercie.
Code Python pour télécharger des images haute résolution de Google. j'avais la réponse originale ici/ Python - Télécharger des images à partir de Google Recherche d'images?
Télécharge actuellement 100 images originales suite à une requête de recherche
Code
from bs4 import BeautifulSoup
import requests
import re
import urllib2
import os
import cookielib
import json
def get_soup(url,header):
return BeautifulSoup(urllib2.urlopen(urllib2.Request(url,headers=header)))
query = raw_input("query image")# you can change the query for the image here
image_type="ActiOn"
query= query.split()
query='+'.join(query)
url="https://www.google.co.in/search?q="+query+"&source=lnms&tbm=isch"
print url
#add the directory for your image here
DIR="C:\\Users\\Rishabh\\Pictures\\"+query.split('+')[0]+"\\"
header={'User-Agent':"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.134 Safari/537.36"
}
soup = get_soup(url,header)
ActualImages=[]# contains the link for Large original images, type of image
for a in soup.find_all("div",{"class":"rg_meta"}):
link , Type =json.loads(a.text)["ou"] ,json.loads(a.text)["ity"]
ActualImages.append((link,Type))
print "there are total" , len(ActualImages),"images"
###print images
for i , (img , Type) in enumerate( ActualImages):
try:
req = urllib2.Request(img, headers={'User-Agent' : header})
raw_img = urllib2.urlopen(req).read()
if not os.path.exists(DIR):
os.mkdir(DIR)
cntr = len([i for i in os.listdir(DIR) if image_type in i]) + 1
print cntr
if len(Type)==0:
f = open(DIR + image_type + "_"+ str(cntr)+".jpg", 'wb')
else :
f = open(DIR + image_type + "_"+ str(cntr)+"."+Type, 'wb')
f.write(raw_img)
f.close()
except Exception as e:
print "could not load : "+img
print e
Solution simple, pour les fichiers <4 Mo uniquement (sinon, vous obtenez une erreur TLS):
wget --user-agent "Mozilla/5.0" -qO - "$@" |grep video.googleusercontent.com|cut -d'"' -f2|wget --content-disposition -c -i -
comme pour la réponse de shelfish
imagelink=$(wget -e robots=off --user-agent "$useragent" -qO - "$link" | sed 's/\"ou\"/\n\"ou\"/g' | grep '\"ou\"\:\".*\(png\|jpg\|jpeg\).*ow\"' | awk -F'"' '{print $4}' | head -n $count|tail -n1)
fonctionnera avec la recherche d'image google actuelle juin 2016