GNU/Linux >> Znalost Linux >  >> Linux

stáhnout obrázky z google pomocí příkazového řádku

Python kód pro stahování obrázků ve vysokém rozlišení z Google. Původní odpověď jsem zveřejnil zde Python - Stáhnout obrázky z vyhledávání obrázků Google?

Aktuálně stahuje 100 originálních obrázků zadaných vyhledávacím dotazem

Kód

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

První pokus

Nejprve musíte nastavit uživatelského agenta, aby google autorizoval výstup z vyhledávání. Poté můžeme vyhledat obrázky a vybrat požadovaný. Abychom toho dosáhli, vložíme chybějící nové řádky, wget vrátí vyhledávání google na jeden řádek a odfiltruje odkaz. Index souboru je uložen v proměnné 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 

Obrázek bude nyní ve vašem pracovním adresáři, můžete vyladit poslední příkaz a zadat požadovaný název výstupního souboru.

Můžete to shrnout do skriptu shellu:

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

Příklad použití:

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

Nyní google_image by měl obsahovat pátý obrázek google při hledání 'úžasný'. Pokud narazíte na nějaké chyby, dejte mi vědět, postarám se o ně.

Lepší kód

Problém s tímto kódem je, že vrací obrázky v nízkém rozlišení. Lepší řešení je následující:

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

Komentáře by měly být samozřejmé, pokud máte nějaké dotazy ke kódu (jako je dlouhý kanál), rád objasním mechaniku. Všimněte si, že jsem musel na wget nastavit podrobnějšího uživatelského agenta, může se stát, že budete muset nastavit jiného uživatelského agenta, ale nemyslím si, že to bude problém. Pokud máte problém, navštivte http://whatsmyuseragent.com/ a zadejte výstup v useragent proměnná.

Pokud si přejete obrázek otevřít místo pouhého stahování, použijte -o vlajka, příklad níže. Pokud si přejete rozšířit skript a také zahrnout vlastní název výstupního souboru, dejte mi vědět a já jej přidám za vás.

Příklad použití:

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

Toto je doplněk k odpovědi poskytnuté společností ShellFish. Velký respekt jim, že to zvládli. :)

Google nedávno změnil svůj webový kód pro stránku s výsledky obrázků, která bohužel porušila kód Shellfish. Používal jsem ho každou noc v cronu až asi před 4 dny, kdy přestal dostávat výsledky vyhledávání. Při zkoumání toho jsem zjistil, že Google odstranil prvky jako imgurl a mnohem více se přesunul do javascriptu.

Mým řešením je rozšíření skvělého kódu Shellfish, ale obsahuje úpravy pro zpracování těchto změn Google a zahrnuje některá vlastní „vylepšení“.

Provede jediné vyhledávání Google, uloží výsledky, hromadně stáhne zadaný počet obrázků a poté je sestaví do jediného obrázku galerie pomocí ImageMagick. Lze vyžádat až 1 000 obrázků.

Tento bash skript je k dispozici na https://git.io/googliser

Děkuji.


Linux
  1. Používání Disku Google z příkazového řádku systému Linux

  2. Klepnutím pravým tlačítkem stáhnete titulky ze správce souborů nebo příkazového řádku pomocí OpenSubtitlesDownload.py

  3. Tisk z příkazového řádku pomocí LibreOffice, příkazy lpr?

  1. Spravujte síťová připojení z příkazového řádku Linuxu pomocí nmcli

  2. Rychlý tip:převádějte obrázky na příkazovém řádku pomocí ImageMagick

  3. Odesílejte poštu z příkazového řádku s externím serverem smtp v systému Linux

  1. Stáhněte si online kurzy Stanford z příkazového řádku

  2. Jak mohu vytvořit soubor s určitou velikostí z příkazového řádku?

  3. Clonezilla z příkazového řádku