[PYTHON] [Selenium] Si vous ne pouvez pas gratter la recherche d'images Google, je vais explorer et collecter uniquement les images Samne.

introduction

Le grattage est ce sur quoi vous comptez lorsque vous avez besoin d'une grande quantité de données d'image comme l'apprentissage automatique. Il existe déjà de nombreux articles qui reprennent des images de divers sites tels que Google, Yahoo et Bing, mais cette fois j'écrirai sur la recherche d'images Google.

De nombreux programmes qui collectent des images à partir de Google Image Search ont été introduits, mais il y en a encore peu qui peuvent collecter des images correctement, qu'il y ait de nombreuses modifications de spécifications ou des mesures anti-grattage. Comme vous pouvez le voir en grattant les résultats de la recherche d'images Google à l'aide de requêtes et de Beautiful Soup, les informations sur les revenus ne contiennent qu'environ 20 données d'image.

Si vous ne pouvez pas gratter directement, pourquoi ne pas passer par le navigateur en explorant?

Cela dit, le sélénium, le sujet principal, est ici. Lorsque vous ** affichez ** la page de résultats de recherche à l'aide de Selenium, le contenu tel que HTML sera naturellement réécrit pour inclure beaucoup de données photo en fonction du contenu affiché (bien que la cause et l'effet soient inversés). Vous pouvez obtenir beaucoup d'images en l'amenant à cet état, puis en le grattant à nouveau. Cependant, Google est assez difficile, et seule l'image du pouce peut être obtenue dans cet état. Eh bien, si des centaines de données d'image de taille d'origine sont intégrées, ce sera une énorme quantité de données, donc c'est naturel indépendamment de Google.

Vous pouvez cliquer sur des images individuelles à partir d'ici et les enregistrer une par une dans leur taille d'origine, mais si vous n'avez pas besoin d'avoir une grande taille d'image en premier lieu, vous pouvez gagner en collectant les vignettes telles qu'elles sont. En supposant que vous êtes prêt à utiliser Selenium, comme le téléchargement de Chromedriver Allons-y.

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
import os
import time
import requests
import shutil
import base64

options = Options()
options.add_argument("--disable-gpu")
options.add_argument("--disable-extensions")
options.add_argument('--proxy-server="direct://"')
options.add_argument("--proxy-bypass-list=*")
options.add_argument("--start-maximized")
#En mode sans tête, il n'est pas "affiché", donc seulement environ 100 éléments peuvent être téléchargés.

DRIVER_PATH = "chromedriver.exe" #Emplacement de chromedriver
driver = webdriver.Chrome(executable_path=DRIVER_PATH, chrome_options=options)

query = input('Search word? :')
url = ("https://www.google.com/search?hl=jp&q=" + "+".join(query.split()) + "&btnG=Google+Search&tbs=0&safe=off&tbm=isch")
driver.get(url)

#Faites défiler correctement--
for t in range(5):
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight)")
    time.sleep(1.5)
try:driver.find_element_by_class_name("mye4qd").click() #En appuyant sur le bouton "Afficher plus de résultats de recherche"
except:pass
for t in range(5):
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight)")
    time.sleep(1.5)

srcs = driver.find_elements(By.XPATH, '//img[@class="rg_i Q4LuWd"]')
try:os.mkdir(query) #Créer un dossier avec le même nom que le terme de recherche, enregistrer la destination
except:pass
#--

i = 0 #Compteur pour attribuer des numéros de série aux noms de fichiers

print("Downloading...")
for j, src in enumerate(srcs):
    if j % 50 == 0 or j == len(srcs)-1:
        print("|"+ ("■" * (20 * j // (len(srcs)-1)))+ (" -" * (20 - 20 * j // (len(srcs)-1)))+ "|",f"{100*j//(len(srcs)-1)}%") #Celui qui montre la progression du téléchargement
    file_name = f"{query}/{'_'.join(query.split())}_{str(i).zfill(3)}.jpg " #Nom ou emplacement du fichier
    src = src.get_attribute("src")
    if src != None:
#Convertir en image--
        if "base64," in src:
            with open(file_name, "wb") as f:
                f.write(base64.b64decode(src.split(",")[1]))
        else:
            res = requests.get(src, stream=True)
            with open(file_name, "wb") as f:
                shutil.copyfileobj(res.raw, f)
#--
        i += 1

driver.quit() #ferme la fenêtre
print(f"Download is complete. {i} images are downloaded.")

résultat

Après l'exécution, entrez le terme de recherche et attendez un moment, puis environ 400 à 1000 images doivent être enregistrées dans le dossier portant le même nom que le terme de recherche. image.png image.png

Résumé

L'apprentissage automatique semble progresser car des centaines à des milliers d'images sont collectées en environ 2 minutes (même si je n'ai jamais créé de jeu de données moi-même). Je viens de commencer à étudier le grattage et l'exploration, donc j'apprécierais que vous me disiez des améliorations ou des points négatifs.

Sites référencés, etc.

https://tanuhack.com/selenium/

Recommended Posts

[Selenium] Si vous ne pouvez pas gratter la recherche d'images Google, je vais explorer et collecter uniquement les images Samne.
Enregistrer l'image du chien à partir de la recherche d'images Google
Obtenez des images Google Recherche d'images dans leur taille d'origine