Ответ 1
Используйте Google Custom Search для достижения того, чего вы хотите достичь. См. @i08in ответ "Python - Загрузка изображений из Google Поиск изображений?" у него есть отличное описание, script ссылок на образцы и библиотеки.
Удачи!
Этот вопрос задавался много раз раньше, но все ответы, по крайней мере, пару лет и в настоящее время основаны на API ajax.googleapis.com, который больше не поддерживается.
Кто-нибудь знает по-другому? Я пытаюсь загрузить сотню результатов поиска, и в дополнение к API-интерфейсам Python я пробовал множество приложений для настольных компьютеров, браузеров или браузеров для этого, что не удалось.
Спасибо!
Используйте Google Custom Search для достижения того, чего вы хотите достичь. См. @i08in ответ "Python - Загрузка изображений из Google Поиск изображений?" у него есть отличное описание, script ссылок на образцы и библиотеки.
Удачи!
Чтобы загрузить любое количество изображений из поиска изображений Google с помощью Selenium:
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()
Полный код здесь.
Как насчет этого?
https://github.com/hardikvasa/google-images-download
он позволяет загружать сотни изображений и имеет множество фильтров на выбор, чтобы настроить поиск
Если вы хотите загрузить более 100 изображений для каждого ключевого слова, вам необходимо установить "selenium" вместе с "chromedriver".
Если вы установили библиотеку pip или запустили файл setup.py, Selenium автоматически установился бы на вашем компьютере. Вам также понадобится браузер Chrome на вашем компьютере. Для хромедривера:
Загрузите правильный хром-драйвер на основе вашей операционной системы.
На Windows или MAC, если по какой-то причине хромедривер доставляет вам проблемы, загрузите его в текущем каталоге и выполните команду.
В Windows, однако, путь к chromedriver должен быть указан в следующем формате:
C:\\ полный путь\к\chromedriver.exe
В Linux, если у вас возникли проблемы с установкой браузера Google Chrome, обратитесь к этому руководству CentOS, Amazon Linux или Ubuntu.
Для всех операционных систем вам придется использовать аргумент "--chromedriver" или "-cd", чтобы указать путь к chromedriver, который вы скачали на своем компьютере.
Я использовал этот script для загрузки изображений из поиска 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
Немного улучшив ответ Рави Хирани, проще всего сделать следующее:
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)
Источник: https://pypi.org/project/icrawler/
Я пытаюсь эту библиотеку, которая может быть использована как: инструмент командной строки или библиотека 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
Вам нужно использовать API пользовательского поиска. Здесь есть explorer. Я использую urllib2. Вам также необходимо создать ключ API для вашего приложения с консоли разработчика.
Чтобы получить максимальную отдачу от googleimagedownload, используйте pip3 install для его получения, а затем используйте следующую оболочку, чтобы превратить ее в API. В основном вы можете видеть, что я сказал как часть кода, чтобы загрузить 10 больших изображений, отмеченных помеченными для повторного использования (misspelt оригинальными авторами). Если я не передаю аргумент say -k = "yellow pepper", он по умолчанию загрузит 10 красных перечных изображений. Вы можете изменить аргументы по умолчанию в словаре googleImageDownloader, которые я предоставил, что угодно, если они соответствуют google_images_download.py разработчика.
#!/usr/bin/env python3
import sys
import subprocess
import re
def main( arguments ):
googleImageDownloader = {'s':'large', 'l':'10', 'r':'labled-for-reuse', 'k':'red pepper'}
for argvitem in arguments[1:]:
argumentName = re.sub( r'^-(.*)', r'\1', argvitem )
argumentName = re.sub( r'^-(.*)', r'\1', argumentName )
argumentName = re.sub( r'(.*)=(.*)', r'\1', argumentName )
value = re.sub( r'(.*)=(.*)', r'\2', argvitem )
googleImageDownloader[argumentName] = value
callingString = "googleimagesdownload"
for key, value in googleImageDownloader.items():
if " " in value:
value = "\"" + value + "\""
callingString+= " -" + key + " " + value
print( callingString )
statusAndOutputText = subprocess.getstatusoutput( callingString )
print( statusAndOutputText[1] )
if "__main__" == __name__:
main( sys.argv )
Итак, я просто запускаю приведенный выше imagedownload.py, передавая любой аргумент с помощью - или -:
$ python ./imagedownload.py -k="yellow pepper"
чтобы получить следующий результат:
googleimagesdownload -s large -l 10 -k "yellow pepper" -r labeled-for-reuse
Item no.: 1 --> Item name = yellow pepper
Evaluating...
Starting Download...
Completed Image ====> 1. paprika-vegetables-yellow-red-53008.jpe
Completed Image ====> 2. plant-fruit-orange-food-pepper-produce-vegetable-yellow-peppers-bell-pepper-flowering-plant-yellow-pepper-land-plant-bell-peppers-and-chili-peppers-pimiento-habanero-chili-137913.jpg
Completed Image ====> 3. yellow-bell-pepper.jpg
Completed Image ====> 4. yellow_bell_pepper_group_store.jpg
Completed Image ====> 5. plant-fruit-food-produce-vegetable-yellow-peppers-bell-pepper-persimmon-diospyros-flowering-plant-sweet-pepper-yellow-pepper-land-plant-bell-peppers-and-chili-peppers-pimiento-habanero-chili-958689.jpg
Completed Image ====> 6. 2017-06-28-10-23-21.jpg
Completed Image ====> 7. yellow_bell_pepper_2017_a3.jpg
Completed Image ====> 8. 2017-06-26-12-06-35.jpg
Completed Image ====> 9. yellow-bell-pepper-1312593087h9f.jpg
Completed Image ====> 10. plant-fruit-food-pepper-produce-vegetable-macro-yellow-background-vegetables-peppers-bell-pepper-vitamins-flowering-plant-chili-pepper-annex-yellow-pepper-land-plant-bell-peppers-and-chili-peppers-pimiento-habanero-chili-1358020.jpg
Everything downloaded!
Total Errors: 0
Я пробовал много кодов, но ни один из них не работает для меня. Я публикую свой рабочий код здесь. Надеюсь, это поможет другим.
Я использую 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')
Простое решение этой проблемы - установить пакет Python под названием 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)
отрегулируйте предел для контроля количества изображений для загрузки
но некоторые изображения не открываются, так как они могут быть повреждены
измените keywords
String, чтобы получить нужный результат