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.