我想下载第n个图像,谷歌给我的命令行,就像命令wget
要搜索[某事]的图像,我只需转到页面https://www.google.cz/search?q=[something]\u0026amp;tbm=isch,但如何获取第n个搜索结果的网址,以便我可以使用wget的?
解决方法
第一次尝试
首先,您需要设置用户代理,所以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
该图像现在将在您的工作目录中,您可以调整最后一个命令并指定所需的输出文件名.
您可以在shell脚本中对其进行总结:
#! /bin/bash count=${1} 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="\([^"]*\)".*/\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’.如果您遇到任何错误,请告诉我,我会照顾他们.
更好的代码
该代码的问题是它以低分辨率返回图片.一个更好的解决方案如下:
#! /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="$@" [ -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