Загружать изображения из Google с помощью командной строки

Я хочу загрузить n-е изображение, которое google дает мне с командной строкой, например с командой wget

Для поиска изображения [something] Я просто перехожу на страницу https://www.google.cz/search?q=[something]&tbm=isch, но как получить URL-адрес n-го результата поиска, чтобы я мог использовать wget?

Ответ 1

Первая попытка

Сначала вам нужно установить агент пользователя, чтобы Google разрешил вывод результатов поиска. Затем мы можем искать изображения и выбирать желаемый. Для этого мы вставим отсутствующие символы новой строки, wget вернет поисковые запросы Google в одной строке и отфильтрует ссылку. Индекс файла сохраняется в переменной 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 

Теперь изображение будет в вашем рабочем каталоге, вы можете настроить последнюю команду и указать желаемое имя выходного файла.

Вы можете суммировать его в оболочке script:

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

Пример использования:

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

Теперь google_image должен содержать пятый образ google при поиске "awesome". Если у вас возникнут какие-либо ошибки, сообщите мне, я позабочусь о них.

Улучшенный код

Проблема с этим кодом заключается в том, что он возвращает изображения с низким разрешением. Лучшее решение выглядит следующим образом:

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

Комментарии должны быть самоочевидными, если у вас есть какие-либо вопросы о коде (например, длинный конвейер), я буду рад прояснить механику. Обратите внимание, что мне нужно было установить более подробный пользовательский агент в wget, может случиться так, что вам нужно установить другой агент пользователя, но я не думаю, что это будет проблемой. Если у вас возникли проблемы, посетите http://whatsmyuseragent.com/ и поставьте вывод в переменной useragent.

Если вы хотите открыть изображение вместо загрузки, используйте флаг -o, пример ниже. Если вы хотите расширить script, а также указать имя пользовательского выходного файла, просто дайте мне знать, и я добавлю его для вас.

Пример использования:

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

Ответ 2

Это дополнение к ответу, предоставленному ShellFish. Большое уважение к ним за решение этого. :)

Google недавно изменил свой веб-код для страницы результатов по изображениям, который, к сожалению, нарушил код Shellfish. Я использовал его каждую ночь в работе cron вплоть до 4 дней назад, когда он прекратил получать результаты поиска. Исследуя это, я обнаружил, что Google удалил такие элементы, как imgurl, и сделал гораздо больше в javascript.

Мое решение - это расширение отличного кода Shellfish, но оно имеет модификации для обработки этих изменений Google и включает в себя некоторые мои "улучшения".

Он выполняет один поиск Google, сохраняет результаты, загружает определенное количество изображений, а затем объединяет их в одно изображение галереи с помощью ImageMagick. Можно запросить до 1000 изображений.

Этот скрипт bash доступен по адресу https://git.io/googliser.

Спасибо.

Ответ 3

Код Python для загрузки изображений с высоким разрешением из Google. Я опубликовал оригинальный ответ здесь Python - Загрузить изображения из Google Поиск изображений?

В настоящее время загружает 100 оригинальных изображений с помощью поискового запроса

код

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

Ответ 4

как для полкового ответа

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)

будет работать с текущим поиском изображений google june 2016

Ответ 5

Простое решение для файлов < Только 4 МБ (иначе вы получите ошибку TLS):

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