GNU/Linux >> Tutoriels Linux >  >> Linux

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

Code Python pour télécharger des images haute résolution de Google. j'avais posté la réponse originale ici Python - Télécharger des images à partir de la recherche d'images Google ?

Télécharge actuellement 100 images originales en fonction d'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

Première tentative

Vous devez d'abord définir l'agent utilisateur afin que Google autorise la sortie des recherches. Ensuite, nous pouvons rechercher des images et sélectionner celle souhaitée. Pour ce faire, nous insérons 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 un nom de fichier de sortie souhaité.

Vous pouvez le résumer dans un script shell :

#! /bin/bash
count=${1}
shift
query="[email protected]"
[ -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 doit contenir la cinquième image Google lors de la recherche de "génial". Si vous rencontrez des bugs, faites-le moi savoir, je m'en occuperai.

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="[email protected]"
[ -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 serai heureux de clarifier les mécanismes. Notez que j'ai dû définir un agent utilisateur plus détaillé sur le wget, il se peut que vous ayez besoin de définir un agent utilisateur différent, mais je ne pense pas que ce sera un problème. Si vous avez un problème, visitez http://whatsmyuseragent.com/ et fournissez la sortie dans le useragent variables.

Lorsque vous souhaitez ouvrir l'image au lieu de la télécharger uniquement, utilisez le -o drapeau, 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 complément à la réponse fournie par ShellFish. Un grand respect à eux pour avoir travaillé cela. :)

Google a récemment modifié son code Web pour la page de résultats d'images qui, malheureusement, a cassé le code de Shellfish. Je l'utilisais tous les soirs dans un travail cron jusqu'à il y a environ 4 jours, lorsqu'il a cessé de recevoir les résultats de la recherche. En enquêtant là-dessus, j'ai découvert que Google avait supprimé des éléments comme imgurl et s'était beaucoup plus déplacé vers javascript.

Ma solution est une extension de l'excellent code de Shellfish, mais comporte des modifications pour gérer ces modifications de Google et inclut certaines "améliorations" de ma part.

Il effectue une seule recherche Google, enregistre les résultats, télécharge en masse un nombre spécifié d'images, puis les intègre dans 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

Merci.


Linux
  1. Gérer les connexions réseau à partir de la ligne de commande Linux avec nmcli

  2. Utilisation de Google Drive à partir de la ligne de commande Linux

  3. Astuce :convertissez des images en ligne de commande avec ImageMagick

  4. Faites un clic droit pour télécharger les sous-titres à partir du gestionnaire de fichiers ou de la ligne de commande avec OpenSubtitlesDownload.py

  5. Clonezilla depuis la ligne de commande

Créer des e-mails temporaires à partir de la ligne de commande avec Tmpmail

Comment envoyer un e-mail avec une pièce jointe à partir de la ligne de commande

Comment installer le navigateur Google Chrome sur Ubuntu 20.04 à partir de la ligne de commande

Googler - Exécutez des recherches Google à partir de la ligne de commande

Travailler avec des images Docker à partir de la ligne de commande

Utilisation des conteneurs Docker à partir de la ligne de commande