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.