GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Laden Sie Bilder von Google mit der Befehlszeile herunter

Python-Code zum Herunterladen hochauflösender Bilder von Google. Ich hatte die ursprüngliche Antwort hier gepostet Python - Bilder von der Google-Bildsuche herunterladen?

Lädt derzeit 100 Originalbilder bei einer Suchanfrage herunter

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

Erster Versuch

Zuerst müssen Sie den Benutzeragenten so einstellen, dass Google die Ausgabe von Suchen autorisiert. Dann können wir nach Bildern suchen und das gewünschte auswählen. Um dies zu erreichen, fügen wir fehlende Zeilenumbrüche ein, wget gibt Google-Suchanfragen in einer einzigen Zeile zurück und filtert den Link. Der Index der Datei wird in der Variable count gespeichert .

$ 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 

Das Bild befindet sich nun in Ihrem Arbeitsverzeichnis, Sie können den letzten Befehl anpassen und einen gewünschten Ausgabedateinamen angeben.

Sie können es in einem Shell-Skript zusammenfassen:

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

Beispielverwendung:

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

Jetzt die google_image sollte das fünfte Google-Bild enthalten, wenn nach „awesome“ gesucht wird. Wenn Sie auf Fehler stoßen, lassen Sie es mich wissen, ich kümmere mich darum.

Besserer Code

Das Problem bei diesem Code ist, dass er Bilder in niedriger Auflösung zurückgibt. Eine bessere Lösung ist wie folgt:

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

Die Kommentare sollten selbsterklärend sein, wenn Sie Fragen zum Code haben (z. B. zur langen Pipeline), werde ich gerne die Mechanik klären. Beachten Sie, dass ich einen detaillierteren Benutzeragenten auf dem wget festlegen musste. Es kann vorkommen, dass Sie einen anderen Benutzeragenten festlegen müssen, aber ich denke nicht, dass dies ein Problem sein wird. Wenn Sie ein Problem haben, besuchen Sie http://whatsmyuseragent.com/ und geben Sie die Ausgabe in useragent ein Variable.

Wenn Sie das Bild öffnen möchten, anstatt es nur herunterzuladen, verwenden Sie den -o Flagge, Beispiel unten. Wenn Sie das Skript erweitern und auch einen benutzerdefinierten Ausgabedateinamen hinzufügen möchten, lassen Sie es mich einfach wissen und ich füge es für Sie hinzu.

Beispielverwendung:

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

Dies ist eine Ergänzung zu der Antwort von ShellFish. Großen Respekt an sie, dass sie das ausgearbeitet haben. :)

Google hat kürzlich seinen Webcode für die Bildergebnisseite geändert, der leider den Code von Shellfish beschädigt hat. Ich habe es jede Nacht in einem Cron-Job verwendet, bis es vor etwa 4 Tagen keine Suchergebnisse mehr erhielt. Bei meiner Untersuchung habe ich festgestellt, dass Google Elemente wie imgurl entfernt und viel mehr auf Javascript umgestellt hat.

Meine Lösung ist eine Erweiterung des großartigen Codes von Shellfish, enthält jedoch Modifikationen, um diese Google-Änderungen zu handhaben, und enthält einige eigene "Verbesserungen".

Es führt eine einzelne Google-Suche durch, speichert die Ergebnisse, lädt eine bestimmte Anzahl von Bildern in großen Mengen herunter und baut diese dann mit ImageMagick zu einem einzigen Galeriebild zusammen. Es können bis zu 1.000 Bilder angefordert werden.

Dieses Bash-Skript ist unter https://git.io/googliser

verfügbar

Danke.


Linux
  1. Verwalten Sie Netzwerkverbindungen über die Linux-Befehlszeile mit nmcli

  2. Verwenden von Google Drive über die Linux-Befehlszeile

  3. Senden Sie E-Mails von der Befehlszeile mit einem externen SMTP-Server unter Linux

  4. Wie kann ich eine Datei mit einer bestimmten Größe von einer Befehlszeile aus erstellen?

  5. Clonezilla von der Befehlszeile

Erstellen Sie temporäre E-Mails über die Befehlszeile mit Tmpmail

So senden Sie eine E-Mail mit Dateianhang von der Befehlszeile aus

So installieren Sie den Google Chrome-Browser unter Ubuntu 20.04 über die Befehlszeile

Googler – Führen Sie Google-Suchen über die Befehlszeile aus

Arbeiten mit Docker-Images über die Befehlszeile

Arbeiten mit Docker-Containern über die Befehlszeile