GNU/Linux >> Belajar Linux >  >> Linux

unduh gambar dari google dengan baris perintah

Kode python untuk mengunduh gambar beresolusi tinggi dari Google. saya telah memposting jawaban asli di sini Python - Unduh Gambar dari pencarian gambar google?

Saat ini mengunduh 100 gambar asli dengan kueri penelusuran

Kode

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

Percobaan pertama

Pertama, Anda perlu mengatur agen pengguna sehingga Google akan mengotorisasi keluaran dari pencarian. Kemudian kita bisa mencari gambar dan memilih yang diinginkan. Untuk mencapai itu kami menyisipkan baris baru yang hilang, wget akan mengembalikan pencarian google pada satu baris, dan memfilter tautannya. Indeks file disimpan dalam variabel 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 

Gambar sekarang akan berada di direktori kerja Anda, Anda dapat men-tweak perintah terakhir dan menentukan nama file keluaran yang diinginkan.

Anda dapat meringkasnya dalam skrip shell:

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

Contoh penggunaan:

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

Sekarang google_image harus berisi gambar google kelima saat mencari 'mengagumkan'. Jika Anda mengalami bug, beri tahu saya, saya akan menanganinya.

Kode yang lebih baik

Masalah dengan kode ini adalah mengembalikan gambar dalam resolusi rendah. Solusi yang lebih baik adalah sebagai berikut:

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

Komentar harus cukup jelas, jika Anda memiliki pertanyaan tentang kode (seperti pipa panjang) saya akan dengan senang hati mengklarifikasi mekanismenya. Perhatikan bahwa saya harus menyetel agen pengguna yang lebih detail di wget, mungkin Anda perlu menyetel agen pengguna yang berbeda tetapi menurut saya itu tidak akan menjadi masalah. Jika Anda mengalami masalah, kunjungi http://whatsmyuseragent.com/ dan berikan hasilnya di useragent variabel.

Saat Anda ingin membuka gambar daripada hanya mengunduh, gunakan -o bendera, contoh di bawah ini. Jika Anda ingin memperluas skrip dan juga menyertakan nama file keluaran khusus, beri tahu saya dan saya akan menambahkannya untuk Anda.

Contoh penggunaan:

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

Ini merupakan tambahan untuk jawaban yang diberikan oleh ShellFish. Sangat menghormati mereka untuk menyelesaikan ini. :)

Google baru-baru ini mengubah kode web mereka untuk halaman hasil gambar yang, sayangnya, telah merusak kode Shellfish. Saya menggunakannya setiap malam dalam tugas cron hingga sekitar 4 hari yang lalu ketika berhenti menerima hasil pencarian. Saat menyelidiki ini, saya menemukan bahwa Google telah menghapus elemen seperti imgurl dan telah beralih lebih banyak ke javascript.

Solusi saya adalah perluasan kode hebat Shellfish tetapi memiliki modifikasi untuk menangani perubahan Google ini dan menyertakan beberapa 'peningkatan' saya sendiri.

Itu melakukan satu pencarian Google, menyimpan hasilnya, mengunduh secara massal sejumlah gambar tertentu, lalu membangunnya menjadi satu gambar galeri menggunakan ImageMagick. Hingga 1.000 gambar dapat diminta.

Skrip bash ini tersedia di https://git.io/googliser

Terima kasih.


Linux
  1. Unduh Kursus Online Stanford Dari Baris Perintah

  2. Menggunakan Google Drive dari Baris Perintah Linux

  3. Kirim email dari baris perintah dengan server smtp eksternal di Linux

  1. Kelola koneksi jaringan dari baris perintah Linux dengan nmcli

  2. Mencetak dari baris perintah dengan LibreOffice, perintah lpr?

  3. Clonezilla dari Baris Perintah

  1. Tip Singkat:mengonversi gambar pada baris perintah dengan ImageMagick

  2. Klik kanan untuk mengunduh subtitle dari pengelola file atau baris perintah dengan OpenSubtitlesDownload.py

  3. Bagaimana cara membuat file dengan ukuran tertentu dari baris perintah?