web-dev-qa-db-fra.com

télécharger des images de google avec la ligne de commande

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?

12
tom

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
19
ShellFish

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.

6
teracow

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
1
rishabhr0y

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 -
0
drzraf

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

0
Skins I