GNU/Linux >> Tutoriales Linux >  >> Linux

descargar imágenes de google con línea de comando

Código Python para descargar imágenes de alta resolución de Google. publiqué la respuesta original aquí Python - ¿Descargar imágenes de la búsqueda de imágenes de Google?

Actualmente descarga 100 imágenes originales con una consulta de búsqueda

Código

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

Primer intento

Primero debe configurar el agente de usuario para que Google autorice la salida de las búsquedas. Luego podemos buscar imágenes y seleccionar la deseada. Para lograr eso, insertamos las líneas nuevas que faltan, wget devolverá las búsquedas de Google en una sola línea y filtrará el enlace. El índice del archivo se almacena en 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 

La imagen ahora estará en su directorio de trabajo, puede modificar el último comando y especificar un nombre de archivo de salida deseado.

Puede resumirlo en un script de 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

Ejemplo de uso:

$ ls
Documents
Downloads
Music
script.sh
$ chmod +x script.sh
$ bash script.sh 5 awesome
$ ls
Documents
Downloads
google_image
Music
script.sh

Ahora el google_image debe contener la quinta imagen de Google al buscar 'impresionante'. Si experimenta algún error, hágamelo saber, me ocuparé de él.

Mejor código

El problema con este código es que devuelve imágenes en baja resolución. Una mejor solución es la siguiente:

#! /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

Los comentarios deben explicarse por sí mismos, si tiene alguna pregunta sobre el código (como la tubería larga), estaré encantado de aclarar la mecánica. Tenga en cuenta que tuve que configurar un agente de usuario más detallado en el wget, puede suceder que necesite configurar un agente de usuario diferente, pero no creo que sea un problema. Si tiene un problema, visite http://whatsmyuseragent.com/ y proporcione el resultado en el useragent variables.

Cuando desee abrir la imagen en lugar de solo descargarla, use el -o bandera, ejemplo a continuación. Si desea extender el script y también incluir un nombre de archivo de salida personalizado, hágamelo saber y lo agregaré por usted.

Ejemplo de uso:

$ chmod +x getimg.sh
$ ./getimg.sh 1 dog
$ gnome-open google_image.jpg
$ ./getimg.sh -o 10 donkey

Esta es una adición a la respuesta proporcionada por ShellFish. Mucho respeto para ellos por resolver esto. :)

Google ha cambiado recientemente su código web para la página de resultados de imágenes que, lamentablemente, ha roto el código de Shellfish. Lo estaba usando todas las noches en un trabajo cron hasta hace unos 4 días cuando dejó de recibir resultados de búsqueda. Mientras investigaba esto, descubrí que Google eliminó elementos como imgurl y cambió mucho más a javascript.

Mi solución es una expansión del excelente código de Shellfish, pero tiene modificaciones para manejar estos cambios de Google e incluye algunas "mejoras" propias.

Realiza una sola búsqueda en Google, guarda los resultados, descarga de forma masiva una cantidad específica de imágenes y luego las construye en una sola imagen de galería usando ImageMagick. Se pueden solicitar hasta 1000 imágenes.

Este script bash está disponible en https://git.io/googliser

Gracias.


Linux
  1. Administre las conexiones de red desde la línea de comandos de Linux con nmcli

  2. Sugerencia rápida:convierta imágenes en la línea de comando con ImageMagick

  3. Haga clic derecho para descargar subtítulos desde el administrador de archivos o la línea de comandos con OpenSubtitlesDownload.py

  4. ¿Cómo puedo crear un archivo con un tamaño específico desde una línea de comando?

  5. Clonezilla desde la línea de comandos

Cree correos electrónicos temporales desde la línea de comandos con Tmpmail

Cómo enviar un correo electrónico con un archivo adjunto desde la línea de comandos

Cómo instalar el navegador Google Chrome en Ubuntu 20.04 desde la línea de comandos

Googler:ejecuta búsquedas en Google desde la línea de comandos

Trabajar con imágenes de Docker desde la línea de comandos

Trabajar con Docker Containers desde la línea de comandos