从谷歌搜索下载前1000个图像

Luk*_*kap 16 regex shell uri image

我做了一些搜索谷歌图片

http://www.google.com/search?hl=en&q=panda&bav=on.2,or.r_gc.r_pw.r_cp.r_qf.,cf.osb&biw=1287&bih=672&um=1&ie=UTF-8&tbm=isch&source=og&sa = N&标签=无线&EI = qW4FUJigJ4jWtAbToInABg

结果是成千上万的照片.我正在寻找一个将下载第一批n图像的shell脚本,例如1000或500.

我怎样才能做到这一点 ?

我想我需要一些高级正则表达式或类似的东西.我尝试了很多东西,但无济于事,有人可以帮我吗?

Sam*_*ins 19

更新3:我修复了脚本以使用phantomjs 2.x.

更新2:我修改了脚本以使用phantomjs.安装起来比较困难,但至少可以再次使用.http://sam.nipl.net/b/google-images http://sam.nipl.net/b/google-images.js

更新1:不幸的是,这不再有效.现在需要Javascript和其他魔法才能找到图像所在的位置.这是雅虎图像搜索脚本的一个版本:http://sam.nipl.net/code/nipl-tools/bin/yimg

原始答案:我为此共同攻击了一些东西.我通常会编写较小的工具并一起使用它们,但是你要求一个shell脚本,而不是三十个.这是故意密集的代码.

http://sam.nipl.net/code/nipl-tools/bin/google-images

到目前为止似乎运作良好.如果您可以改进它,或者建议任何更好的编码技术(假设它是一个shell脚本),请告诉我.

#!/bin/bash
[ $# = 0 ] && { prog=`basename "$0"`;
echo >&2 "usage: $prog query count parallel safe opts timeout tries agent1 agent2
e.g. : $prog ostrich
       $prog nipl 100 20 on isz:l,itp:clipart 5 10"; exit 2; }
query=$1 count=${2:-20} parallel=${3:-10} safe=$4 opts=$5 timeout=${6:-10} tries=${7:-2}
agent1=${8:-Mozilla/5.0} agent2=${9:-Googlebot-Image/1.0}
query_esc=`perl -e 'use URI::Escape; print uri_escape($ARGV[0]);' "$query"`
dir=`echo "$query_esc" | sed 's/%20/-/g'`; mkdir "$dir" || exit 2; cd "$dir"
url="http://www.google.com/search?tbm=isch&safe=$safe&tbs=$opts&q=$query_esc" procs=0
echo >.URL "$url" ; for A; do echo >>.args "$A"; done
htmlsplit() { tr '\n\r \t' ' ' | sed 's/</\n</g; s/>/>\n/g; s/\n *\n/\n/g; s/^ *\n//; s/ $//;'; }
for start in `seq 0 20 $[$count-1]`; do
wget -U"$agent1" -T"$timeout" --tries="$tries" -O- "$url&start=$start" | htmlsplit
done | perl -ne 'use HTML::Entities; /^<a .*?href="(.*?)"/ and print decode_entities($1), "\n";' | grep '/imgres?' |
perl -ne 'use URI::Escape; ($img, $ref) = map { uri_unescape($_) } /imgurl=(.*?)&imgrefurl=(.*?)&/;
$ext = $img; for ($ext) { s,.*[/.],,; s/[^a-z0-9].*//i; $_ ||= "img"; }
$save = sprintf("%04d.$ext", ++$i); print join("\t", $save, $img, $ref), "\n";' |
tee -a .images.tsv |
while IFS=$'\t' read -r save img ref; do
wget -U"$agent2" -T"$timeout" --tries="$tries" --referer="$ref" -O "$save" "$img" || rm "$save" &
procs=$[$procs + 1]; [ $procs = $parallel ] && { wait; procs=0; }
done ; wait
Run Code Online (Sandbox Code Playgroud)

特征:

  • 不到1500字节
  • 解释用法,如果没有args运行
  • 并行下载完整图像
  • 安全搜索选项
  • 图像大小,类型等opts字符串
  • 超时/重试选项
  • 模仿googlebot获取所有图片
  • 数字图像文件
  • 保存元数据

我会在一段时间内发布一个模块化版本,以表明它可以通过一组shell脚本和简单的工具很好地完成.


Pav*_*ath 6

我不认为你可以单独使用正则表达式完成整个任务.这个问题有3个部分 -

1.提取所有图像的链接----->不能用正则表达式完成.您需要使用基于Web的语言.谷歌有API以编程方式执行此操作.看看这里这里.

2.假设您使用某些基于Web的语言成功完成了第一步,您可以使用以下正则表达式使用前瞻提取精确的图像URL

(?<=imgurl=).*?(?=&)
Run Code Online (Sandbox Code Playgroud)

上面的正则表达式说 - imgurl=你遇到&符号之后开始抓住所有东西.请参阅此处的示例,其中我获取了搜索结果的第一个图像的URL并提取了图像URL.

我是如何得到上述正则表达式的?通过检查图像搜索中找到的图像的链接.

3.现在您已获得图像URL,使用一些基于Web的语言/工具来下载图像.

  • 在我看来,这个问题的"正确答案"是使用API​​而忘记尝试处理HTML.我会在答案的这一部分提出更多的重点和指导!;-)刮HTML总是要复杂得多......特别是在'shell-script'中! (2认同)