使用命令行从 google 下载图像
download images from google with command line
我想下载 google 通过命令行给我的第 n 个图像,例如使用命令 wget
要搜索 [something]
的图像,我只是转到第 https://www.google.cz/search?q=[something]&tbm=isch
页,但是如何获得第 n 个搜索结果的 url 以便我可以使用 wget?
第一次尝试
首先您需要设置用户代理,这样 google 将授权搜索输出。然后我们可以查找图像和 select 所需的图像。为了完成我们插入缺失的换行符,wget 将 return google 搜索一行,并过滤 link。文件的索引存储在变量 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="\([^"]*\)".*//')
$ wget $imagelink
图像现在将在您的工作目录中,您可以调整最后一个命令并指定所需的输出文件名。
您可以将其总结为shell脚本:
#! /bin/bash
count=
shift
query="$@"
[ -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="\([^"]*\)".*//')
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' 时应该包含第五张 google 图片。如果您遇到任何错误,请告诉我,我会处理的。
更好的代码
此代码的问题在于它 return 的图片分辨率较低。更好的解决方案如下:
#! /bin/bash
# function to create all dirs til file can be made
function mkdirs {
file=""
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=
shift
query="$@"
[ -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=\([^&]*\)\&.*//' | head -n $count | tail -n1)
imagelink="${imagelink%\%*}"
# get file extention (.png, .jpg, .jpeg)
ext=$(echo $imagelink | sed "s/.*\(\.[^\.]*\)$//")
# 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 "" ]; then
dir=""
else
file=""
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 最近更改了图像结果页面的网络代码,不幸的是,该代码破坏了 Shellfish 的代码。我每晚都在 cron 作业中使用它,直到大约 4 天前它停止接收搜索结果。在对此进行调查时,我发现 Google 删除了像 imgurl 这样的元素,并将更多元素转移到了 javascript.
我的解决方案是对 Shellfish 的优秀代码的扩展,但进行了修改以处理这些 Google 更改并包括我自己的一些 'enhancements'。
它执行单个 Google 搜索,保存结果,批量下载指定数量的图像,然后使用 ImageMagick 将它们构建到单个图库图像中。最多可请求 1,000 张图像。
此 bash 脚本可在 https://git.io/googliser
谢谢。
至于shelfish的回答
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 }' | head -n $count|tail -n1)
将在 2016 年 6 月使用当前 google 图片搜索
Python 从 Google 下载高分辨率图像的代码。我在这里发布了原始答案 Python - Download Images from google Image search?
当前根据搜索查询下载 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 MB 的文件(否则会出现 TLS 错误):
wget --user-agent "Mozilla/5.0" -qO - "$@" |grep video.googleusercontent.com|cut -d'"' -f2|wget --content-disposition -c -i -
我想下载 google 通过命令行给我的第 n 个图像,例如使用命令 wget
要搜索 [something]
的图像,我只是转到第 https://www.google.cz/search?q=[something]&tbm=isch
页,但是如何获得第 n 个搜索结果的 url 以便我可以使用 wget?
第一次尝试
首先您需要设置用户代理,这样 google 将授权搜索输出。然后我们可以查找图像和 select 所需的图像。为了完成我们插入缺失的换行符,wget 将 return google 搜索一行,并过滤 link。文件的索引存储在变量 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="\([^"]*\)".*//')
$ wget $imagelink
图像现在将在您的工作目录中,您可以调整最后一个命令并指定所需的输出文件名。
您可以将其总结为shell脚本:
#! /bin/bash
count=
shift
query="$@"
[ -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="\([^"]*\)".*//')
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' 时应该包含第五张 google 图片。如果您遇到任何错误,请告诉我,我会处理的。
更好的代码
此代码的问题在于它 return 的图片分辨率较低。更好的解决方案如下:
#! /bin/bash
# function to create all dirs til file can be made
function mkdirs {
file=""
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=
shift
query="$@"
[ -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=\([^&]*\)\&.*//' | head -n $count | tail -n1)
imagelink="${imagelink%\%*}"
# get file extention (.png, .jpg, .jpeg)
ext=$(echo $imagelink | sed "s/.*\(\.[^\.]*\)$//")
# 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 "" ]; then
dir=""
else
file=""
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 最近更改了图像结果页面的网络代码,不幸的是,该代码破坏了 Shellfish 的代码。我每晚都在 cron 作业中使用它,直到大约 4 天前它停止接收搜索结果。在对此进行调查时,我发现 Google 删除了像 imgurl 这样的元素,并将更多元素转移到了 javascript.
我的解决方案是对 Shellfish 的优秀代码的扩展,但进行了修改以处理这些 Google 更改并包括我自己的一些 'enhancements'。
它执行单个 Google 搜索,保存结果,批量下载指定数量的图像,然后使用 ImageMagick 将它们构建到单个图库图像中。最多可请求 1,000 张图像。
此 bash 脚本可在 https://git.io/googliser
谢谢。
至于shelfish的回答
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 }' | head -n $count|tail -n1)
将在 2016 年 6 月使用当前 google 图片搜索
Python 从 Google 下载高分辨率图像的代码。我在这里发布了原始答案 Python - Download Images from google Image search?
当前根据搜索查询下载 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 MB 的文件(否则会出现 TLS 错误):
wget --user-agent "Mozilla/5.0" -qO - "$@" |grep video.googleusercontent.com|cut -d'"' -f2|wget --content-disposition -c -i -