如何在 Python 中下载 google 图片搜索结果
How to download google image search results in Python
这个问题之前已经被问过很多次了,但是所有的答案都至少有几年的历史了,目前基于 ajax.googleapis.com API,不再受支持。
有人知道其他方法吗?我正在尝试下载大约一百个搜索结果,除了 Python API 之外,我还尝试了许多桌面、基于浏览器或浏览器插件的程序来执行此操作,但都失败了.
您需要使用自定义搜索API。这里有一个方便的explorer。我使用 urllib2。您还需要从开发人员控制台为您的应用程序创建一个 API 密钥。
将 Google Custom Search 用于您想要实现的目标。
请参阅 @i08in 对 Python - Download Images from google Image search? 的 回答,它有很好的描述、脚本示例和库参考。
我一直在使用这个脚本从 google 搜索下载图像,我一直在使用它们来训练我的分类器
下面的代码可以下载 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="Pictures"
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"
if not os.path.exists(DIR):
os.mkdir(DIR)
DIR = os.path.join(DIR, query.split()[0])
if not os.path.exists(DIR):
os.mkdir(DIR)
###print images
for i , (img , Type) in enumerate( ActualImages):
try:
req = urllib2.Request(img, headers={'User-Agent' : header})
raw_img = urllib2.urlopen(req).read()
cntr = len([i for i in os.listdir(DIR) if image_type in i]) + 1
print cntr
if len(Type)==0:
f = open(os.path.join(DIR , image_type + "_"+ str(cntr)+".jpg"), 'wb')
else :
f = open(os.path.join(DIR , image_type + "_"+ str(cntr)+"."+Type), 'wb')
f.write(raw_img)
f.close()
except Exception as e:
print "could not load : "+img
print e
要使用 Selenium 从 Google 图片搜索中下载任意数量的图片:
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import os
import json
import urllib2
import sys
import time
# adding path to geckodriver to the OS environment variable
# assuming that it is stored at the same path as this script
os.environ["PATH"] += os.pathsep + os.getcwd()
download_path = "dataset/"
def main():
searchtext = sys.argv[1] # the search query
num_requested = int(sys.argv[2]) # number of images to download
number_of_scrolls = num_requested / 400 + 1
# number_of_scrolls * 400 images will be opened in the browser
if not os.path.exists(download_path + searchtext.replace(" ", "_")):
os.makedirs(download_path + searchtext.replace(" ", "_"))
url = "https://www.google.co.in/search?q="+searchtext+"&source=lnms&tbm=isch"
driver = webdriver.Firefox()
driver.get(url)
headers = {}
headers['User-Agent'] = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36"
extensions = {"jpg", "jpeg", "png", "gif"}
img_count = 0
downloaded_img_count = 0
for _ in xrange(number_of_scrolls):
for __ in xrange(10):
# multiple scrolls needed to show all 400 images
driver.execute_script("window.scrollBy(0, 1000000)")
time.sleep(0.2)
# to load next 400 images
time.sleep(0.5)
try:
driver.find_element_by_xpath("//input[@value='Show more results']").click()
except Exception as e:
print "Less images found:", e
break
# imges = driver.find_elements_by_xpath('//div[@class="rg_meta"]') # not working anymore
imges = driver.find_elements_by_xpath('//div[contains(@class,"rg_meta")]')
print "Total images:", len(imges), "\n"
for img in imges:
img_count += 1
img_url = json.loads(img.get_attribute('innerHTML'))["ou"]
img_type = json.loads(img.get_attribute('innerHTML'))["ity"]
print "Downloading image", img_count, ": ", img_url
try:
if img_type not in extensions:
img_type = "jpg"
req = urllib2.Request(img_url, headers=headers)
raw_img = urllib2.urlopen(req).read()
f = open(download_path+searchtext.replace(" ", "_")+"/"+str(downloaded_img_count)+"."+img_type, "wb")
f.write(raw_img)
f.close
downloaded_img_count += 1
except Exception as e:
print "Download failed:", e
finally:
print
if downloaded_img_count >= num_requested:
break
print "Total downloaded: ", downloaded_img_count, "/", img_count
driver.quit()
if __name__ == "__main__":
main()
完整代码为 here。
这个怎么样?
https://github.com/hardikvasa/google-images-download
它允许您下载数百张图片,并有大量过滤器可供选择以自定义您的搜索
如果您想为每个关键字下载超过 100 张图片,那么您需要安装 'selenium' 和 'chromedriver'。
如果您已经通过 pip 安装了库或 运行 setup.py 文件,Selenium 会自动安装在您的机器上。您还需要在计算机上安装 Chrome 浏览器。对于 chrome 驱动程序:
根据您的操作系统下载正确的chrome驱动程序。
在 Windows 或 MAC 如果由于某种原因 chrome 驱动程序给您带来麻烦,请在当前目录下下载它并 运行 命令。
然而,在 windows 上,chrome驱动程序的路径必须按以下格式给出:
C:\complete\path\to\chromedriver.exe
在 Linux 上,如果您在安装 google chrome 浏览器时遇到问题,请参阅此 CentOS 或 Amazon Linux 指南或 Ubuntu 指南
对于所有操作系统,您必须使用“--chromedriver”或“-cd”参数来指定您在计算机中下载的chrome驱动程序的路径。
我尝试了很多代码,但 none 对我有用。我在这里发布我的工作代码。希望它能帮助别人。
我正在使用 Python 3.6 版并使用 icrawler
首先,您需要在您的系统中下载icrawler。
然后 运行 下面的代码。
from icrawler.examples import GoogleImageCrawler
google_crawler = GoogleImageCrawler()
google_crawler.crawl(keyword='krishna', max_num=100)
将 keyword
krishna
替换为您想要的文字。
注意:- 下载的图片需要路径。现在我使用放置脚本的同一目录。您可以通过以下代码设置自定义目录。
google_crawler = GoogleImageCrawler('path_to_your_folder')
对 Ravi Hirani 的回答进行一些改进,最简单的方法是按此进行:
from icrawler.builtin import GoogleImageCrawler
google_crawler = GoogleImageCrawler(storage={'root_dir': 'D:\projects\data core\helmet detection\images'})
google_crawler.crawl(keyword='cat', max_num=100)
我正在尝试 this library 可以同时用作:命令行工具或 python 库。它有很多参数来查找具有不同标准的图像。
这些示例取自其文档,将其用作 python 库:
from google_images_download import google_images_download #importing the library
response = google_images_download.googleimagesdownload() #class instantiation
arguments = {"keywords":"Polar bears,baloons,Beaches","limit":20,"print_urls":True} #creating list of arguments
paths = response.download(arguments) #passing the arguments to the function
print(paths) #printing absolute paths of the downloaded images
或者作为命令行工具,如下:
$ googleimagesdownload --k "car" -sk 'red,blue,white' -l 10
您可以使用 pip install google_images_download
安装它
解决此问题的一个简单方法是安装名为 google_images_download
的 python 包
pip install google_images_download
使用此 python 代码
from google_images_download import google_images_download
response = google_images_download.googleimagesdownload()
keywords = "apple fruit"
arguments = {"keywords":keywords,"limit":20,"print_urls":True}
paths = response.download(arguments)
print(paths)
调整图片下载数量限制
but some images won't open as they might be corrupt
更改 keywords
字符串以获得您需要的输出
确保你先安装了icrawler库,使用。
pip install icrawler
from icrawler.builtin import GoogleImageCrawler
google_Crawler = GoogleImageCrawler(storage = {'root_dir': r'write the name of the directory you want to save to here'})
google_Crawler.crawl(keyword = 'sad human faces', max_num = 800)
这个问题之前已经被问过很多次了,但是所有的答案都至少有几年的历史了,目前基于 ajax.googleapis.com API,不再受支持。
有人知道其他方法吗?我正在尝试下载大约一百个搜索结果,除了 Python API 之外,我还尝试了许多桌面、基于浏览器或浏览器插件的程序来执行此操作,但都失败了.
您需要使用自定义搜索API。这里有一个方便的explorer。我使用 urllib2。您还需要从开发人员控制台为您的应用程序创建一个 API 密钥。
将 Google Custom Search 用于您想要实现的目标。 请参阅 @i08in 对 Python - Download Images from google Image search? 的 回答,它有很好的描述、脚本示例和库参考。
我一直在使用这个脚本从 google 搜索下载图像,我一直在使用它们来训练我的分类器 下面的代码可以下载 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="Pictures"
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"
if not os.path.exists(DIR):
os.mkdir(DIR)
DIR = os.path.join(DIR, query.split()[0])
if not os.path.exists(DIR):
os.mkdir(DIR)
###print images
for i , (img , Type) in enumerate( ActualImages):
try:
req = urllib2.Request(img, headers={'User-Agent' : header})
raw_img = urllib2.urlopen(req).read()
cntr = len([i for i in os.listdir(DIR) if image_type in i]) + 1
print cntr
if len(Type)==0:
f = open(os.path.join(DIR , image_type + "_"+ str(cntr)+".jpg"), 'wb')
else :
f = open(os.path.join(DIR , image_type + "_"+ str(cntr)+"."+Type), 'wb')
f.write(raw_img)
f.close()
except Exception as e:
print "could not load : "+img
print e
要使用 Selenium 从 Google 图片搜索中下载任意数量的图片:
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import os
import json
import urllib2
import sys
import time
# adding path to geckodriver to the OS environment variable
# assuming that it is stored at the same path as this script
os.environ["PATH"] += os.pathsep + os.getcwd()
download_path = "dataset/"
def main():
searchtext = sys.argv[1] # the search query
num_requested = int(sys.argv[2]) # number of images to download
number_of_scrolls = num_requested / 400 + 1
# number_of_scrolls * 400 images will be opened in the browser
if not os.path.exists(download_path + searchtext.replace(" ", "_")):
os.makedirs(download_path + searchtext.replace(" ", "_"))
url = "https://www.google.co.in/search?q="+searchtext+"&source=lnms&tbm=isch"
driver = webdriver.Firefox()
driver.get(url)
headers = {}
headers['User-Agent'] = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36"
extensions = {"jpg", "jpeg", "png", "gif"}
img_count = 0
downloaded_img_count = 0
for _ in xrange(number_of_scrolls):
for __ in xrange(10):
# multiple scrolls needed to show all 400 images
driver.execute_script("window.scrollBy(0, 1000000)")
time.sleep(0.2)
# to load next 400 images
time.sleep(0.5)
try:
driver.find_element_by_xpath("//input[@value='Show more results']").click()
except Exception as e:
print "Less images found:", e
break
# imges = driver.find_elements_by_xpath('//div[@class="rg_meta"]') # not working anymore
imges = driver.find_elements_by_xpath('//div[contains(@class,"rg_meta")]')
print "Total images:", len(imges), "\n"
for img in imges:
img_count += 1
img_url = json.loads(img.get_attribute('innerHTML'))["ou"]
img_type = json.loads(img.get_attribute('innerHTML'))["ity"]
print "Downloading image", img_count, ": ", img_url
try:
if img_type not in extensions:
img_type = "jpg"
req = urllib2.Request(img_url, headers=headers)
raw_img = urllib2.urlopen(req).read()
f = open(download_path+searchtext.replace(" ", "_")+"/"+str(downloaded_img_count)+"."+img_type, "wb")
f.write(raw_img)
f.close
downloaded_img_count += 1
except Exception as e:
print "Download failed:", e
finally:
print
if downloaded_img_count >= num_requested:
break
print "Total downloaded: ", downloaded_img_count, "/", img_count
driver.quit()
if __name__ == "__main__":
main()
完整代码为 here。
这个怎么样?
https://github.com/hardikvasa/google-images-download
它允许您下载数百张图片,并有大量过滤器可供选择以自定义您的搜索
如果您想为每个关键字下载超过 100 张图片,那么您需要安装 'selenium' 和 'chromedriver'。
如果您已经通过 pip 安装了库或 运行 setup.py 文件,Selenium 会自动安装在您的机器上。您还需要在计算机上安装 Chrome 浏览器。对于 chrome 驱动程序:
根据您的操作系统下载正确的chrome驱动程序。
在 Windows 或 MAC 如果由于某种原因 chrome 驱动程序给您带来麻烦,请在当前目录下下载它并 运行 命令。
然而,在 windows 上,chrome驱动程序的路径必须按以下格式给出:
C:\complete\path\to\chromedriver.exe
在 Linux 上,如果您在安装 google chrome 浏览器时遇到问题,请参阅此 CentOS 或 Amazon Linux 指南或 Ubuntu 指南
对于所有操作系统,您必须使用“--chromedriver”或“-cd”参数来指定您在计算机中下载的chrome驱动程序的路径。
我尝试了很多代码,但 none 对我有用。我在这里发布我的工作代码。希望它能帮助别人。
我正在使用 Python 3.6 版并使用 icrawler
首先,您需要在您的系统中下载icrawler。
然后 运行 下面的代码。
from icrawler.examples import GoogleImageCrawler
google_crawler = GoogleImageCrawler()
google_crawler.crawl(keyword='krishna', max_num=100)
将 keyword
krishna
替换为您想要的文字。
注意:- 下载的图片需要路径。现在我使用放置脚本的同一目录。您可以通过以下代码设置自定义目录。
google_crawler = GoogleImageCrawler('path_to_your_folder')
对 Ravi Hirani 的回答进行一些改进,最简单的方法是按此进行:
from icrawler.builtin import GoogleImageCrawler
google_crawler = GoogleImageCrawler(storage={'root_dir': 'D:\projects\data core\helmet detection\images'})
google_crawler.crawl(keyword='cat', max_num=100)
我正在尝试 this library 可以同时用作:命令行工具或 python 库。它有很多参数来查找具有不同标准的图像。
这些示例取自其文档,将其用作 python 库:
from google_images_download import google_images_download #importing the library
response = google_images_download.googleimagesdownload() #class instantiation
arguments = {"keywords":"Polar bears,baloons,Beaches","limit":20,"print_urls":True} #creating list of arguments
paths = response.download(arguments) #passing the arguments to the function
print(paths) #printing absolute paths of the downloaded images
或者作为命令行工具,如下:
$ googleimagesdownload --k "car" -sk 'red,blue,white' -l 10
您可以使用 pip install google_images_download
解决此问题的一个简单方法是安装名为 google_images_download
pip install google_images_download
使用此 python 代码
from google_images_download import google_images_download
response = google_images_download.googleimagesdownload()
keywords = "apple fruit"
arguments = {"keywords":keywords,"limit":20,"print_urls":True}
paths = response.download(arguments)
print(paths)
调整图片下载数量限制
but some images won't open as they might be corrupt
更改 keywords
字符串以获得您需要的输出
确保你先安装了icrawler库,使用。
pip install icrawler
from icrawler.builtin import GoogleImageCrawler
google_Crawler = GoogleImageCrawler(storage = {'root_dir': r'write the name of the directory you want to save to here'})
google_Crawler.crawl(keyword = 'sad human faces', max_num = 800)