使用命令行从谷歌下载图像[关闭]

2024-01-08

我想用命令行下载谷歌给我的第n张图像,即像使用命令一样wget

搜索图像[something]我只是去页面https://www.google.cz/search?q=[something]&tbm=isch但是如何获取第 n 个搜索结果的 url,以便我可以使用 wget?


第一次尝试

首先,您需要设置用户代理,以便谷歌将授权搜索输出。然后我们就可以查找图像并选择所需的图像。为了实现这一点,我们插入缺少的换行符,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

Now the 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/ http://whatsmyuseragent.com并提供输出useragent多变的。

当您希望打开图像而不仅仅是下载时,请使用-o标志,示例如下。如果您希望扩展脚本并包含自定义输出文件名,请告诉我,我会为您添加它。

用法示例:

$ chmod +x getimg.sh
$ ./getimg.sh 1 dog
$ gnome-open google_image.jpg
$ ./getimg.sh -o 10 donkey
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用命令行从谷歌下载图像[关闭] 的相关文章

  • 如何在C(Linux utf8终端)中打印“盒子抽屉”Unicode字符?

    我正在尝试显示 方框图范围 2500 257F 中的 Unicode 字符 它应该是标准 utf8 Unicode 标准 版本 6 2 我根本做不到 我首先尝试使用旧的 ASCII 字符 但 Linux 终端以 utf8 显示 并且没有显示
  • 使用脚本检查 git 分支是否领先于另一个分支

    I have branch1 and branch2我想要某种 git branch1 isahead branch2 这将显示如果branch1已承诺branch2没有 也可能指定这些提交 我无法检查差异原因branch2 is在之前br
  • 在ubuntu中打开spyder

    我想在ubuntu中打开spyder Python IDE 通常我会在 shell 中编写 spyder 它会打开spyder IDE 现在 当我在shell中编写spyder时 它只是换行 什么也没有发生 类似于按 enter 我如何找回
  • bash 将输出重定向到文件,但结果不完整

    重定向命令输出的问题已经被问过很多次了 但是我有一个奇怪的行为 我使用的是 bash shell debian 版本 4 3 30 1 release 并尝试将输出重定向到文件 但并非所有内容都记录在文件中 我尝试运行的 bin 文件是 l
  • 更新Linux中的包含路径

    我的 my path to file 文件夹中有几个头文件 我知道如何将这些文件包含在新的 C 程序中 但每次我都需要在包含它之前输入头文件的完整路径 我可以在linux中设置一些路径变量 以便它自动查找头文件吗 您可以创建一个 makef
  • 有哪些基于对象的 shell?

    我打算写一个面向对象的shell 基于Python 我已经有很多想法了 但在实现它之前 我想通过一些现有的 shell 来激发我的灵感 我所说的面向对象的基本意思是 参数不仅仅是字符串数组 而且是对象数组 返回值也是一个对象 不仅有 std
  • system 和 shell_exec 之间的区别

    有什么区别shell exec and systemPHP 中的方法 两者都采用单个命令行参数并在 PHP 中运行 使用其中一种比另一种更好吗 请参阅此处的解释 http chipmunkninja com Program Executio
  • 为什么 OS X 和 Linux 之间的 UTF-8 文本排序顺序不同?

    我有一个包含 UTF 8 编码文本行的文本文件 mac os x cat unsorted txt foo foo 津 如果它有助于重现问题 这里是文件中确切字节的校验和和转储 以及如何自己生成文件 在 Linux 上 使用base64 d
  • Docker忽略limits.conf(试图解决“打开文件太多”错误)

    我正在运行一个 Web 服务器 该服务器正在处理数千个并发 Web 套接字连接 为了实现这一点 在 Debian linux 我的基本镜像是 google debian wheezy 在 GCE 上运行 上 打开文件的默认数量设置为 100
  • “git add”返回“致命:外部存储库”错误

    我刚刚进入 git 的奇妙世界 我必须提交我对程序所做的一系列更改 位于名为的目录中 var www myapp 我创建了一个新目录 home mylogin gitclone 从这个目录中 我做了一个git clone针对公共回购 我能够
  • /sys/device/ 和 dmidecode 报告的不同 CPU 缓存大小

    我正在尝试获取系统中不同缓存级别的大小 我尝试了两种技术 a 使用 sys device 中的信息 这是输出 cat sys devices system cpu cpu0 cache index1 size 32K cat sys dev
  • VBA Shell 并等待退出代码

    我正在打包一个办公应用程序 VBA 它调用 C 控制台应用程序来执行应用程序 大型模拟程序 的一些繁重工作 我希望能够让 VBA 应用程序等待控制台应用程序完成并从控制台应用程序检索退出代码 我已经能够做到前者 但尚未能够从应用程序中检索退
  • 类似 jq 中的 sql join

    我有以下 json id 1 type folder title folder 1 id 2 type folder title folder 2 id 3 type item title item 1 folder 1 id 4 type
  • 使用 shell=True 将 PATH 设置为 bitbake 的“source”在 Python 中没有效果

    下面是shell脚本中的代码 source proj common tools repo etc profile d repo sh repo project init branch repo project sync source pok
  • 如何在不使用 IDE 的情况下在 Linux 上运行 Java 项目

    我是 Java 新手 基本上 我开发了一个java项目 其中包含Eclipse中的多个Java包 该项目在我安装了 redhat Linux 的桌面上运行正常 然而 我需要在一个更强大的没有安装X11的Linux服务器 redhat ent
  • 如何才能将 TCP 连接返回到同一端口?

    机器是 RHEL 5 3 内核 2 6 18 有时我在 netstat 中注意到我的应用程序有连接 建立了 TCP 连接本地地址 and 国外地址是一样的 其他人也报告了同样的问题 症状与链接中描述的相同 客户端连接到本地运行的服务器的端口
  • 在 docker 中重定向命令输出

    我想为我的服务器做一些简单的日志记录 它是一个在 Docker 容器中运行的小型 Flask 应用程序 这是 Dockerfile Dockerfile FROM dreen flask MAINTAINER dreen WORKDIR s
  • Tomcat Intellij Idea:远程部署

    RackSpace 云服务器 Ubuntu 12 04 Intellij Idea 11 1 2 Windows 8 Tomcat 7 0 26 JDK 6 在 Intellij Idea 上 当我尝试在远程 Tomcat 7 服务器上运行
  • ioctl 命令的用户权限检查

    我正在实现 char 驱动程序 Linux 并且我的驱动程序中有某些 IOCTL 命令仅需要由 ADMIN 执行 我的问题是如何在 ioctl 命令实现下检查用户权限并限制非特权用户访问 IOCTL 您可以使用bool capable in
  • 找不到包“gdk-pixbuf-2.0”

    我正在尝试在 Amazon Linux 发行版实例上构建 librsvg 我已经通过 yum 安装了大部分依赖项 其中一些在实例上启用的默认 yum 存储库中不可用 因此必须从头开始构建它们 我已经走了很远 但还停留在最后一点 跑步时sud

随机推荐

  • 注册为自定义文件类型的默认应用程序

    注册即可打开自定义类型的文件 假设我有 cool 文件 如果用户尝试打开它 Android 会询问他们是否愿意使用我的应用程序打开它 如何 您可以将以下内容添加到必须打开文件 在我们的例子中为 pdf 的活动内的 AndroidManife
  • 使用 EnableDelayedExpansion 时变量修饰符的正确语法

    我希望能够执行 p 来仅查看文件的路径 但在循环中使用它时我无法获得正确的语法 使用 EnableDelayedExpansion 这是我的代码 echo off set dir1 TMP opt set dir2 c opt set em
  • 自动更新.NET应用程序[重复]

    这个问题在这里已经有答案了 我们正在开发一个非常复杂的系统 该系统由多个 WCF 服务 ASP NET MVC 应用程序 管理工具 Windows 窗体应用程序 组成 其中一些将在多个服务器上运行实例 我们正在为这样的系统寻找一个好的自动更
  • 程序崩溃以及编码中算术运算的一些问题

    stackoverflow 社区大家好 我的代码有一些问题 我目前是一名学生 所以基本上我是一个初学者 使用欧几里得算法 下面显示的代码应该将两个数字相除 直到商达到 0 但它只是在商变为 0 之前的最后一个除法过程中停止 我不知道程序是否
  • 设置应用程序的supervisor环境变量

    我正在从supervisord 运行一个应用程序 我必须为其设置一个环境 大约有30个环境变量需要设置 我尝试过把一切都放在一件大事上 环境 线 这似乎不起作用 我还尝试了多个environment 行 但这似乎也不起作用 我还尝试了在 e
  • 递增数组值 - Arduino

    我正在尝试增加一些数组值 int counter 0 0 0 0 0 0 0 0 如果位置 0 的数字值达到 25 则位置 1 的值加 1 位置 0 重置为 0 依此类推 当索引位置 2 达到 25 时 位置 3 增加 1 并重置它的值 自
  • 在 if 语句中使用函数的返回值

    希望这里有一个简短的问题 可以在 if 语句中使用函数的返回值吗 IE function queryThis request return false if queryThis foo false doThat 我确信非常简单明了 但我遇到
  • 安装错误:INSTALL_FAILED_INSUFFICIENT_STORAGE?运行模拟器期间

    2011 07 22 16 33 02 Today 2011 07 22 16 33 02 Today Android Launch 2011 07 22 16 33 02 Today adb is running normally 201
  • 如何在 Ruby 中正确使用保护子句

    在此示例中使用保护子句的正确方法是什么 def require admin unless current user current user role admin flash error You are not an admin redir
  • Java 将 19 位 Unix 时间戳转换为可读日期

    我正在尝试转换 19 位 Unix 时间戳 例如1558439504711000000 1个半五亿 https en wikipedia org wiki Names of large numbers 转换为可读的日期 时间格式 我的时间戳
  • SqlAlchemy 与 Marshmallow 的关系

    我正在尝试返回 JSON 甚至返回一对多 sqlalchemy 查询的完整字符串 我此时正在使用 Marshmallow 来尝试执行此操作 但它不断返回不完整的数据 我有两个模型定义为 class UserModel db Model ta
  • 将 onclick 添加到子菜单?

    我的菜单有一个 onclick 函数 但我无法弄清楚子菜单的 ID 是什么 以便我可以告诉子菜单当用户单击它时要做什么 我使用下面的代码以编程方式创建了子菜单 因此 如果有人可以向我解释一下我如何知道子菜单中每个项目的 id 是什么 我将不
  • 在 Rails 3 中为 OmniAuth 创建命名路由

    观看 Ryan 精彩的 Railcast 后简单的 OmniAuth http railscasts com episodes 241 simple omniauth 我已经设法在我的应用程序中实现身份验证 一切工作正常 但在我看来 我的链
  • 如何以编程方式关闭 UITextView 中的自动更正弹出窗口?

    我正在自己做一些自定义自动完成的事情insertText 但是如果有可见的自动更正建议 视图就会进入奇怪的状态 如果我使用 textView unmarkText 它会忽略自动更正弹出窗口 但它接受自动更正 这很糟糕 有什么方法可以以编程方
  • 最佳 JDBC 数据源 bean 类

    我看到有些人使用org apache commons dbcp BasicDataSource而其他配置有com mchange v2 c3p0 ComboPooledDataSource Spring有它自己的 org springfra
  • 使用字典中的值替换列中的值

    import pandas as pd df pd DataFrame Data Hey this is 123456 Jonny B Good This is Jonny B Good at 511 233 1137 Wow that i
  • Google Play 服务已过时。需要 7571000 但找到 6774470

    我正在尝试将 google play API 添加到我的 Android 游戏中 并且按照他们网站上的说明进行操作 我在模拟器运行时遇到这个错误 试图解决它 在我的手机上 应用程序崩溃了 在清单中
  • 为什么我的异步函数返回空数组?

    我试图通过将用户的匹配项推入一个数组并返回该数组来获取用户的匹配项 以便我的路由器可以将数据发送到前端 但我的异步函数有一个问题 我只有一个空数组 我尝试设置一些断点 我注意到我的路由器在我的服务将数据推送到数组之前发送数据 这是我的路由器
  • Django 1.4 在开发服务器上提供 MEDIA_URL 和 STATIC_URL 文件

    刚刚升级到 Django 1 4 并且在开发服务器上新的 改进 的静态和媒体文件服务方面遇到了严重问题 我喜欢 Django 但到底为什么他们用 STATIC URL STATIC ROOT STATICFILES DIR 使这些文件的服务
  • 使用命令行从谷歌下载图像[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我想用命令行下载谷歌给我的第n张图像 即像使用命令一样wget 搜索图像 something 我只是去页面https www google