加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

正则表达式 – 从Google搜索下载前1000个图像

发布时间:2020-12-14 06:33:22 所属栏目:百科 来源:网络整理
导读:我做一些搜索到谷歌图像 http://www.google.com/search?hl=enq=pandabav=on.2,cf.osbbiw=1287bih=672um=1ie=UTF-8tbm=ischsource=ogsa=Ntab=wiei=qW4FUJigJ4jWtAbToInABg 结果是成千上万的照片。我正在寻找一个shell脚本,它将下载前n个图像,例如1000或500
我做一些搜索到谷歌图像

http://www.google.com/search?hl=en&q=panda&bav=on.2,cf.osb&biw=1287&bih=672&um=1&ie=UTF-8&tbm=isch&source=og&sa=N&tab=wi&ei=qW4FUJigJ4jWtAbToInABg

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

我该怎么做?

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

更新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 'nr 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

特征:

> 1500字节以下
>解释用法,如果运行没有args
>并行下载完整的图像
>安全搜索选项
>图像大小,类型等选择字符串
> timeout / retries选项
>模拟googlebot抓取所有图像
>数字图像文件
>保存元数据

我会发布一个模块化的版本一段时间,以表明它可以做相当不错的一套shell脚本和简单的工具。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读