GNU/Linux >> Linux Esercitazione >  >> Linux

scarica le immagini da google con la riga di comando

Codice Python per scaricare immagini ad alta risoluzione da Google. avevo postato la risposta originale qui Python - Download Images from google Image search?

Attualmente scarica 100 immagini originali in base a una query di ricerca

Codice

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

Primo tentativo

Per prima cosa devi impostare l'agente utente in modo che Google autorizzi l'output dalle ricerche. Quindi possiamo cercare le immagini e selezionare quella desiderata. Per fare ciò inseriamo le nuove righe mancanti, wget restituirà le ricerche di Google su una singola riga e filtrerà il collegamento. L'indice del file è memorizzato nella variabile 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'immagine sarà ora nella tua directory di lavoro, puoi modificare l'ultimo comando e specificare il nome del file di output desiderato.

Puoi riassumerlo in uno script di 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

Esempio di utilizzo:

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

Ora il google_image dovrebbe contenere la quinta immagine di Google quando cerchi "fantastico". Se riscontri bug, fammelo sapere, me ne occuperò io.

Codice migliore

Il problema con questo codice è che restituisce immagini a bassa risoluzione. Una soluzione migliore è la seguente:

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

I commenti dovrebbero essere autoesplicativi, se hai domande sul codice (come la lunga pipeline) sarò felice di chiarire i meccanismi. Nota che ho dovuto impostare uno user agent più dettagliato su wget, può succedere che tu debba impostare uno user agent diverso ma non credo che sarà un problema. Se hai un problema, visita http://whatsmyuseragent.com/ e fornisci l'output nel useragent variabile.

Quando desideri aprire l'immagine anziché solo scaricarla, usa il -o bandiera, esempio sotto. Se desideri estendere lo script e includere anche un nome di file di output personalizzato, fammelo sapere e lo aggiungerò per te.

Esempio di utilizzo:

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

Questa è un'aggiunta alla risposta fornita da ShellFish. Molto rispetto per loro per aver risolto questo problema. :)

Google ha recentemente modificato il proprio codice web per la pagina dei risultati delle immagini che, purtroppo, ha violato il codice di Shellfish. Lo stavo usando ogni notte in un cron job fino a circa 4 giorni fa, quando ha smesso di ricevere i risultati della ricerca. Durante le indagini, ho scoperto che Google ha rimosso elementi come imgurl e si è spostato molto di più su javascript.

La mia soluzione è un'espansione dell'ottimo codice di Shellfish, ma presenta modifiche per gestire queste modifiche di Google e include alcuni "miglioramenti" personali.

Esegue una singola ricerca su Google, salva i risultati, scarica in blocco un numero specificato di immagini, quindi le inserisce in un'unica immagine-galleria utilizzando ImageMagick. È possibile richiedere fino a 1.000 immagini.

Questo script bash è disponibile su https://git.io/googliser

Grazie.


Linux
  1. Gestisci le connessioni di rete dalla riga di comando di Linux con nmcli

  2. Scarica i corsi online di Stanford dalla riga di comando

  3. Utilizzo di Google Drive dalla riga di comando di Linux

  4. Suggerimento rapido:converti le immagini dalla riga di comando con ImageMagick

  5. Fare clic con il pulsante destro del mouse per scaricare i sottotitoli dal file manager o dalla riga di comando con OpenSubtitlesDownload.py

Crea e-mail temporanee dalla riga di comando con Tmpmail

Come inviare un'e-mail con allegato file dalla riga di comando

Come installare il browser Google Chrome su Ubuntu 20.04 dalla riga di comando

Googler:esegui ricerche su Google dalla riga di comando

Utilizzo delle immagini Docker dalla riga di comando

Utilizzo dei contenitori Docker dalla riga di comando