下载从谷歌搜索第一1000张图片(Download first 1000 images from g

2019-06-26 08:00发布

我做了一些搜索,Google图片

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

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

我怎样才能做到这一点 ?

我想我需要一些先进的正则表达式或类似的东西。 我尝试很多事情,但没有用,有人可以帮我吗?

Answer 1:

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

特征:

  • 下1500个字节
  • 说明使用,如果用无参数运行
  • 下载并行完整图像
  • 安全搜索选项
  • 图像大小,类型等选择采用串
  • 超时/重试选项
  • 假冒的Googlebot抓取所有图像
  • 数字图像文件
  • 保存元数据

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



Answer 2:

我不认为你可以实现单独使用正则表达式的整个任务。 有3个环节进行problem-

1 .Extract ----->不能用正则表达式来完成的所有图像的链接。 你需要使用一个基于Web的各种语言的。 谷歌拥有的API编程方式做到这一点。 看看这里和这里 。

2。假设你在与一些基于网络语言的第一步成功了,你可以使用下面的正则表达式,它使用向前看符号提取精确图像URL

(?<=imgurl=).*?(?=&)

上述正则表达式说- 抓住一切后,开始imgurl= ,并直到你遇到&符号 。 在这里看到了一个例子,在这里我把你的搜索结果的第一个图像的URL和提取的图像URL。

我是如何得出上述正则表达式? 通过检查图像搜索中发现的图像的链接。

3。现在,你已经得到了图像的URL,使用一些基于Web的语言/工具下载图像。



Answer 3:

而不是用正则表达式壳这样做,如果你使用的东西,其实可以解析HTML本身,像你可能有一个更容易的时间PHP的DOMDocument类 。

如果您只使用外壳卡住,需要发出声音图像的URL,你可能不完全出于运气。 正则表达式是不恰当的解析HTML ,因为HTML是不是一个正规的语言 。 但您可能仍然能够获得通过,如果你输入的数据是高度可预测的。 (有没有这方面的保证,因为谷歌经常定期更新他们的产品和服务,而无需事先通知。)

这就是说,你在你的问题中提供的URL的输出,每个图片的网址似乎嵌入链接到一个锚/imgres?… 。 如果我们能够分析这些链接,我们或许可以收集我们需要他们。 内的那些链接,图片网址看起来与前面&amp;imgurl= 。 因此,让我们凑这个。

#!/usr/local/bin/bash

# Possibly violate Google's terms of service by lying about our user agent
agent="Mozilla/5.0 (X11; FreeBSD amd64; rv:12.0) Gecko/20100101 Firefox/12.0"

# Search URL
url="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&tab=wi&ei=qW4FUJigJ4jWtAbToInABg"

curl -A "$agent" -s -D- "$url" \
 | awk '{gsub(/<a href=/,"\n")} 1' \
 | awk '
   /imgres/ {
     sub(/" class=rg_l >.*/, "");       # clean things up
     split($0, fields, "\&amp;");       # gather the "GET" fields
     for (n=1; n<=length(fields); n++) {
       split(fields[n], a, "=");        # split name=value pair
       getvars[a[1]]=a[2];              # store in array
     }
     print getvars["imgurl"];           # print the result
   }
 '

我用两个awk命令,因为......嗯,我懒,那是产生线中,我可以很容易地找到“imgres”字符串的最快方法。 人们可以花这个清理它,使它更优雅更多的时间,但收益递减的规律决定了这是据我去与这一个。 :-)

此脚本返回,你可以很容易地下载使用其他shell工具的URL列表。 例如,如果脚本被称为getimages ,则:

./getimages | xargs -n 1 wget

需要注意的是谷歌,当我跑这与你在你的问题中指定的搜索URL似乎递过来只有83结果(不1000)。 这是可能的,这仅仅是第一页,谷歌一般会分发给浏览器“膨胀”的页面(使用JavaScript)之前,当我得到的底部附近。 处理这种情况的正确方法是使用谷歌的搜索API,每帕的回答,并支付谷歌为他们的数据,如果你正在做每天超过100个搜索。



Answer 4:

这么多的工作量? 为什么不使用散装图片下载? 它拥有100张图像的限制。

而需要编码具有Java的图像浏览器的网站。



Answer 5:

而不是试图解析HTML(这是非常坚硬,容易破裂),考虑API的通过强调@Paven在他的回答。

此外,还应考虑使用已经试图做同样的事情的工具。 WGET(WEB-GET)具有类似功能的以下链接(专门为特定的文件类型)蜘蛛。 看到这个答案的一个问题StackOverflow的“我如何使用wget的所有图像下载到一个文件夹” 。

正则表达式是奇妙有用的,但我不认为这是在这种情况下 - 记正则表达式的口头禅:

有些人,当遇到一个问题,认为“我知道,我将使用正则表达式。” 现在他们有两个问题。

- 杰米·萨温斯基



Answer 6:

与帕文Manjunath的反应,如果你想图像的高度和宽度

(?<=imgurl=)(?<imgurl>.*?)(?=&).*?(?<=h=)(?<height>.*?)(?=&).*?(?<=w=)(?<width>.*?)(?=&)

你获得3个正则表达式组imgUrl的高度宽度的信息。



Answer 7:

我发现了一个更简单的方法做这个工具我可以证实,它的工作原理以及这个职位的。

功能请求给开发人员:

  • 获取图像(S)的预览,以确认它是正确的。
  • 允许多个术语顺序(即分批处理)的输入。


Answer 8:

Python脚本:下载全分辨率图像形成谷歌图片搜索目前它下载每次查询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)),"html.parser")


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

我是重新张贴在这里我的解决方案最初的解决方案我就以下问题发表https://stackoverflow.com/a/28487500/2875380



Answer 9:

如何使用这个库? 谷歌图像下载

对于任何人还在寻找一个体面的方式来下载图像的100S,可以使用此命令行参数的代码。



Answer 10:

我用它来下载1000张图像,并将其100%为我工作: atif93 / google_image_downloader

之后你下载它,进入终端,安装硒

$ pip install selenium --user

然后检查你的Python版本

$ python --version

如果运行python 2.7 ,然后向下下载比萨运行1000张图片:

$ python image_download_python2.py 'pizza' '1000'

如果运行python 3 ,然后向下下载比萨运行1000张图片:

$ python image_download_python3.py 'pizza' '1000'

细目:

python image_download_python2.py <query> <number of images>
python image_download_python3.py <query> <number of images>

查询你想找的图片名称和图像的数量是1000在我的例子我上面的查询是比萨饼,我想它的1000张



Answer 11:

还有其他图书馆在github上-这看起来相当不错https://github.com/Achillefs/google-cse

g = GoogleCSE.image_search('Ian Kilminster')
img = g.fetch.results.first.link
file = img.split('/').last
File.open(file,'w') {|f| f.write(open(img).read)} 
`open -a Preview #{file}`


文章来源: Download first 1000 images from google search