it-swarm.com.de

bilder von Google mit der Befehlszeile herunterladen

Ich möchte das n-te Bild herunterladen, das mir google mit der Befehlszeile zur Verfügung stellt, d. H. Wie mit dem Befehl wget.

Um das Bild von [something] zu suchen, gehe ich einfach zur Seite https://www.google.cz/search?q=[something]&tbm=isch, aber wie bekomme ich die URL des n-ten Suchergebnisses, damit ich wget verwenden kann?

12
tom

Erster Versuch

Zuerst müssen Sie den Benutzeragenten festlegen, damit Google die Ausgabe von Suchanfragen 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-Suchen in einer einzigen Zeile zurück und filtert den Link. Der Index der Datei wird in der Variablen 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 jetzt in Ihrem Arbeitsverzeichnis. Sie können den letzten Befehl anpassen und den gewünschten Namen der Ausgabedatei 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

Verwendungsbeispiel:

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

Jetzt sollte der google_image das fünfte google-Bild enthalten, wenn Sie nach 'awesome' suchen. Wenn Sie Fehler entdecken, lassen Sie es mich wissen, ich kümmere mich um sie.

Besserer Code

Das Problem bei diesem Code ist, dass Bilder mit niedriger Auflösung zurückgegeben werden. Eine bessere Lösung lautet 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 (wie zum Beispiel die lange Pipeline), erkläre ich Ihnen gerne die Mechanik. Beachten Sie, dass ich im Wget einen detaillierteren Benutzeragenten einrichten 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 die Variable useragent ein.

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

Verwendungsbeispiel:

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

Dies ist eine Ergänzung zu der Antwort von ShellFish . Viel Respekt vor ihnen, um das herauszufinden. :)

Google hat kürzlich seinen Web-Code für die Ergebnisseite für Bilder geändert, der leider den Code von Shellfish verletzt hat. Ich habe es jeden Abend in einem Cron-Job benutzt, bis vor etwa 4 Tagen, als es keine Suchergebnisse mehr erhielt. Während ich dies untersuchte, stellte ich fest, dass Google Elemente wie imgurl entfernt und viel mehr in Javascript verschoben hat.

Meine Lösung ist eine Erweiterung des großartigen Codes von Shellfish, enthält jedoch Änderungen, um diese Änderungen von Google zu handhaben, und enthält einige meiner eigenen "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 erstellt diese dann mithilfe von ImageMagick in ein einzelnes Galerie-Bild. Bis zu 1.000 Bilder können angefordert werden.

Dieses Bash-Skript steht unter https://git.io/googliser zur Verfügung.

Vielen Dank.

6
teracow

Python-Code zum Herunterladen von Bildern mit hoher Auflösung von Google. Ich hatte die ursprüngliche Antwort hier Python - Bilder von Google herunterladen Bildersuche?

Lädt derzeit 100 Originalbilder bei einer Suchabfrage

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
1
rishabhr0y

Einfache Lösung, nur für Dateien <4 MB (sonst erhalten Sie einen TLS-Fehler):

wget --user-agent "Mozilla/5.0" -qO - "[email protected]" |grep video.googleusercontent.com|cut -d'"' -f2|wget --content-disposition -c -i -
0
drzraf

wie für die Antwort von Shelfish 

imagelink=$(wget -e robots=off --user-agent "$useragent" -qO - "$link" | sed 's/\"ou\"/\n\"ou\"/g' | grep '\"ou\"\:\".*\(png\|jpg\|jpeg\).*ow\"' | awk -F'"' '{print $4}' | head -n $count|tail -n1)

funktioniert mit der aktuellen Google-Bildersuche im Juni 2016

0
Skins I