[PYTHON] Obtenez des images Google Recherche d'images dans leur taille d'origine

Il existe déjà plusieurs articles sur la façon de gratter des images dans la recherche d'images, mais il y avait peu d'articles qui pouvaient être utilisés tels quels, probablement parce que des changements mineurs aux spécifications étaient fréquents, j'ai donc écrit un article indiquant les cas où il y a une possibilité de changement. Je vais. Peut-être que tout ce que vous avez à faire lorsque cela ne fonctionne pas est d'utiliser les outils de développement de votre navigateur pour découvrir les noms de classe et d'identifiant dont vous avez besoin, mais c'est évident pour ceux qui savent, mais si vous ne savez pas ce qui ne va pas Cela prend du temps.

Environnement d'exécution

macOS Mojave 10.14.5 Python 3.7.2 Chrome 80.0 date 2020-04-01

Préparation des modules nécessaires au grattage

pip install selenium

Vérifiez si le Webdriver peut être utilisé

Démarrer → recherche Google → essayer de terminer

from selenium import webdriver

#Spécifiez le chemin du pilote Web téléchargé
DRIVER_PATH = '/User/hoge/1bin/chromedriver'
#Lancer le navigateur Web
wd = webdriver.Chrome(executable_path=DRIVER_PATH)
#Accéder à google
wd.get('https://google.com')
#Sélectionnez un champ de recherche.Il existe plusieurs façons de choisir
search_box = wd.find_element_by_name('q') 
# search_box = wd.find_element_by_css_selector('input.gLFyf')
# search_box = wd.find_element_by_class_name('gLFyf')

#Rechercher Qiita
search_box.send_keys('Qiita')
search_box.submit() 
time.sleep(5) 
#Quittez le navigateur Web
wd.quit()

Recherchez des images et obtenez l'URL de l'image

Obtenez l'URL de l'image miniature

Tout d'abord, obtenez l'URL de la vignette du résultat de la recherche.

#Temps d'attente après l'opération, par exemple en cliquant(Secondes)
sleep_between_interactions = 2
#Nombre de téléchargements
download_num = 3
#Rechercher un mot
query = "cat"
#URL pour la recherche d'images
search_url = "https://www.google.com/search?safe=off&site=&tbm=isch&source=hp&q={q}&oq={q}&gs_l=img"

wd = webdriver.Chrome(executable_path=DRIVER_PATH)
wd.get(search_url.format(q=query))
#Obtenez le lien de l'image miniature(S'il y a de la mousse ici, vérifiez le sélecteur et changez-le)
thumbnail_results = wd.find_elements_by_css_selector("img.rg_i")

Cliquez sur l'image miniature pour obtenir l'URL de l'image d'origine

Cliquez sur l'URL de la vignette acquise avec le webdriver pour afficher l'image et acquérir l'URL de l'image d'origine. De plus, étant donné que le nom de classe spécifié lors de l'acquisition de l'URL de l'image d'origine est susceptible de changer, utilisez les outils de développement appropriés pour le vérifier et le modifier.

image_urls = set()
for img in thumbnail_results[:download_num]:
    try:
        img.click()
        time.sleep(sleep_between_interactions)
    except Exception:
        continue
    #Comme vous ne pouvez pas obtenir l'URL d'un seul coup, affinez-vous après avoir fait des candidats(S'il vous plaît dites-moi s'il y a un moyen)
    # 'n3VNCb'Est susceptible de changer, regardez donc l'élément de l'image sur laquelle vous avez cliqué et modifiez-le en conséquence.
    url_candidates = wd.find_elements_by_class_name('n3VNCb')
    for candidate in url_candidates:
        url = candidate.get_attribute('src')
        if url and 'https' in url:
            image_urls.add(url)
#Si vous n'attendez pas un moment, cela ne se terminera pas normalement, alors ajoutez 3 secondes
time.sleep(sleep_between_interactions+3)
wd.quit()

Obtenir une image à partir d'une URL d'image

Tout ce que vous avez à faire est de télécharger l'image à partir de l'URL et vous n'avez pas besoin d'un pilote Web.

import os
from PIL import Image
import hashlib

image_save_folder_path = 'data'
for url in image_urls:
    try:
        image_content = requests.get(url).content
    except Exception as e:
        print(f"ERROR - Could not download {url} - {e}")

    try:
        image_file = io.BytesIO(image_content)
        image = Image.open(image_file).convert('RGB')
        file_path = os.path.join(image_save_folder_path,hashlib.sha1(image_content).hexdigest()[:10] + '.jpg')
        with open(file_path, 'wb') as f:
            image.save(f, "JPEG", quality=90)
        print(f"SUCCESS - saved {url} - as {file_path}")
    except Exception as e:
        print(f"ERROR - Could not save {url} - {e}")

Comment trouver un élément lors de l'obtention du lien d'image

Pour la fenêtre de recherche Google, search_box = wd.find_element_by_name ('q') Pour l'image d'origine du résultat de la recherche d'image, wd.find_elements_by_class_name ('n3VNCb') Ceux-ci peuvent être confirmés à l'aide des outils de développement du navigateur.

Navigateur "..." -> Autres outils-> Outils de développement Les raccourcis sont `` Ctrl Shift J (sur Windows) ʻou cmd + Option + J (sur Mac)

Si vous avez une image que vous souhaitez spécifier, faites un clic droit sur l'image et sélectionnez «Vérifier» pour afficher les éléments correspondant à l'image. S'il s'agit d'une vignette de recherche d'image, les éléments sont les suivants. Les éléments peuvent être copiés en cliquant sur le '...' qui apparaît dans l'état sélectionné.

<img alt="Dogs | The Humane Society of the United States" class="n3VNCb" src="https://www.humanesociety.org/sites/default/files/styles/1240x698/public/2019/02/dog-451643.jpg?h=bf654dbc&amp;itok=MQGvBmuo" data-noaft="1" jsname="HiaYvf" jsaction="load:XAeZkd;" style="width: 450px; height: 253.306px; margin: 0px;">

Puisqu'il dit class = "n3VNCb" Vous pouvez le sélectionner avec wd.find_elements_by_class_name ('n3VNCb').

Résumé du code

Pour copie

import os
import time
from selenium import webdriver
from PIL import Image
import io
import requests
import hashlib

#Temps d'attente après l'opération, par exemple en cliquant(Secondes)
sleep_between_interactions = 2
#Nombre de téléchargements
download_num = 3
#Rechercher un mot
query = "cat"
#URL pour la recherche d'images
search_url = "https://www.google.com/search?safe=off&site=&tbm=isch&source=hp&q={q}&oq={q}&gs_l=img"

#Obtenir l'URL de l'image miniature
wd = webdriver.Chrome(executable_path=DRIVER_PATH)
wd.get(search_url.format(q=query))
#Obtenez le lien de l'image miniature(S'il y a de la mousse ici, vérifiez le sélecteur et changez-le)
thumbnail_results = wd.find_elements_by_css_selector("img.rg_i")

#Cliquez sur la vignette pour obtenir chaque URL d'image
image_urls = set()
for img in thumbnail_results[:download_num]:
    try:
        img.click()
        time.sleep(sleep_between_interactions)
    except Exception:
        continue
    #Comme vous ne pouvez pas obtenir l'URL d'un seul coup, affinez-vous après avoir fait des candidats(S'il vous plaît dites-moi s'il y a un moyen)
    # 'n3VNCb'Est susceptible de changer, regardez donc l'élément de l'image sur laquelle vous avez cliqué et modifiez-le en conséquence.
    url_candidates = wd.find_elements_by_class_name('n3VNCb')
    for candidate in url_candidates:
        url = candidate.get_attribute('src')
        if url and 'https' in url:
            image_urls.add(url)
#Si vous n'attendez pas un moment, cela ne se terminera pas normalement, alors ajoutez 3 secondes
time.sleep(sleep_between_interactions+3)
wd.quit()

#Télécharger l'image
image_save_folder_path = 'data'
for url in image_urls:
    try:
        image_content = requests.get(url).content
    except Exception as e:
        print(f"ERROR - Could not download {url} - {e}")

    try:
        image_file = io.BytesIO(image_content)
        image = Image.open(image_file).convert('RGB')
        file_path = os.path.join(image_save_folder_path,hashlib.sha1(image_content).hexdigest()[:10] + '.jpg')
        with open(file_path, 'wb') as f:
            image.save(f, "JPEG", quality=90)
        print(f"SUCCESS - saved {url} - as {file_path}")
    except Exception as e:
        print(f"ERROR - Could not save {url} - {e}")

Articles référencés

Recommended Posts

Obtenez des images Google Recherche d'images dans leur taille d'origine
[Python] Téléchargez l'image d'origine à partir de la recherche d'images Google
Enregistrer l'image du chien à partir de la recherche d'images Google
Obtenez une image panoramique sur Google Street View
Obtenez l'image de "Suzu Hirose" par recherche d'images Google.
Obtenir la taille du terminal en Python
[Concaténation d'images] Réorganiser les images en mosaïques
Obtenez des images par recherche par mot-clé sur Twitter
Obtenez les données de l'API Google Fit en Python
Collection d'images à l'aide de l'API Google Custom Search
Débarrassez-vous des images DICOM en Python
Enregistrez automatiquement les images de vos personnages préférés à partir de la recherche d'images Google avec Python
Obtenir l'URL de l'image à l'aide de l'API Flickr en Python
Obtenir la liste des objets Google Cloud Storage en Java
Grattage d'images ②-Obtenez des images de bing, yahoo, Flickr
Que faire pour obtenir une feuille de calcul Google en Python
[Selenium] Si vous ne pouvez pas gratter la recherche d'images Google, je vais explorer et collecter uniquement les images Samne.
[Python] Obtenez les nombres dans l'image graphique avec OCR
Obtenir la taille (nombre d'éléments) de Union Find en Python