Google から高解像度の画像をダウンロードするための Python コード。ここに元の回答を投稿しました 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
最初の試み
最初に、ユーザー エージェントを設定して、Google が検索からの出力を承認するようにする必要があります。次に、画像を探して、目的の画像を選択できます。不足している改行を挿入するために、wget は 1 行で 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
画像が作業ディレクトリに配置されます。最後のコマンドを微調整して、目的の出力ファイル名を指定できます。
シェルスクリプトで要約できます:
#! /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
「awesome」を検索するときは、5 番目の Google 画像を含める必要があります。バグが発生した場合はお知らせください。対処します。
より良いコード
このコードの問題は、画像が低解像度で返されることです。より良い解決策は次のとおりです:
#! /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
を使用します フラグ、以下の例。スクリプトを拡張し、カスタム出力ファイル名も含めたい場合は、私に知らせてください。追加します.
使用例:
$ chmod +x getimg.sh
$ ./getimg.sh 1 dog
$ gnome-open google_image.jpg
$ ./getimg.sh -o 10 donkey
これは、ShellFish が提供する回答への追加です。これを解決してくれた彼らに敬意を表します。 :)
Google は最近、画像検索結果ページの Web コードを変更しましたが、残念ながら Shellfish のコードが壊れていました。検索結果の受信を停止した約4日前まで、毎晩cronジョブで使用していました。これを調査したところ、Google が imgurl などの要素を削除し、さらに多くの要素を JavaScript に移行したことがわかりました。
私の解決策は、Shellfish の優れたコードの拡張ですが、これらの Google の変更を処理するための変更があり、独自の「機能強化」が含まれています。
単一の Google 検索を実行し、結果を保存し、指定された数の画像を一括ダウンロードしてから、ImageMagick を使用してこれらを単一のギャラリー画像に構築します。最大 1,000 枚の画像をリクエストできます。
この bash スクリプトは、https://git.io/googliser
で入手できます。ありがとうございます。