[PYTHON] [Selen] Wenn Sie die Google-Bildsuche nicht kratzen können, werde ich nur Samne-Bilder crawlen und sammeln.

Einführung

Scraping ist das, worauf Sie sich verlassen, wenn Sie eine große Menge an Bilddaten benötigen, z. B. maschinelles Lernen. Es gibt bereits viele Artikel, die Bilder von verschiedenen Websites wie Google, Yahoo und Bing aufnehmen, aber dieses Mal werde ich über die Google-Bildsuche schreiben.

Viele Programme, die Bilder aus der Google Bildsuche erfassen, wurden eingeführt, aber es gibt immer noch wenige, die Bilder ordnungsgemäß erfassen können, unabhängig davon, ob es viele Spezifikationsänderungen oder Anti-Scraping-Maßnahmen gibt. Wie Sie sehen können, indem Sie die Suchergebnisse der Google-Bildsuche mithilfe von Anfragen und Beautiful Soup durchsuchen, enthalten die Einkommensinformationen nur etwa 20 Bilddaten.

Wenn Sie nicht direkt kratzen können, warum nicht den Browser durch Crawlen durchsuchen?

Vor diesem Hintergrund ist Selen, das Hauptthema, hier. Wenn Sie die Suchergebnisseite mit Selenium ** anzeigen **, wird der Inhalt wie HTML natürlich so umgeschrieben, dass er entsprechend dem angezeigten Inhalt viele Fotodaten enthält (obwohl Ursache und Wirkung umgekehrt sind). Sie können viele Bilder erhalten, indem Sie sie in diesen Zustand bringen und dann erneut kratzen. Google ist jedoch ziemlich hart und in diesem Zustand kann nur das Daumenbild erhalten werden. Wenn Hunderte von Bilddaten in Originalgröße eingebettet sind, handelt es sich um eine große Datenmenge, sodass dies unabhängig von Google selbstverständlich ist.

Sie können von hier aus auf einzelne Bilder klicken und sie einzeln in ihrer Originalgröße speichern. Wenn Sie jedoch zunächst keine große Bildgröße benötigen, können Sie gewinnen, indem Sie die Miniaturansichten so wie sie sind sammeln. Angenommen, Sie sind bereit, Selenium zu verwenden, z. B. das Herunterladen von Chromedriver Lass uns gehen.

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")
#Im Headless-Modus wird es nicht "angezeigt", sodass nur etwa 100 Elemente heruntergeladen werden können.

DRIVER_PATH = "chromedriver.exe" #Lage des 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)

#Scrollen Sie entsprechend nach unten--
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() #Drücken Sie die Taste "Weitere Suchergebnisse anzeigen"
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) #Erstellen Sie einen Ordner mit demselben Namen wie der Suchbegriff und speichern Sie das Ziel
except:pass
#--

i = 0 #Zähler zum Zuweisen von Seriennummern zu Dateinamen

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)}%") #Derjenige, der den Fortschritt des Downloads anzeigt
    file_name = f"{query}/{'_'.join(query.split())}_{str(i).zfill(3)}.jpg " #Dateiname oder Speicherort
    src = src.get_attribute("src")
    if src != None:
#In Bild konvertieren--
        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() #schließe das Fenster
print(f"Download is complete. {i} images are downloaded.")

Ergebnis

Geben Sie nach der Ausführung den Suchbegriff ein und warten Sie eine Weile. Anschließend sollten ca. 400 bis 1.000 Bilder in dem Ordner mit demselben Namen wie der Suchbegriff gespeichert werden. image.png image.png

Zusammenfassung

Das maschinelle Lernen scheint Fortschritte zu machen, da Hunderte bis Tausende von Bildern in etwa 2 Minuten gesammelt werden (obwohl ich selbst noch nie einen Datensatz erstellt habe). Ich habe gerade angefangen, Kratzen und Krabbeln zu studieren, daher würde ich mich freuen, wenn Sie mir Verbesserungen oder schlechte Punkte mitteilen könnten.

Referenzierte Websites usw.

https://tanuhack.com/selenium/

Recommended Posts

[Selen] Wenn Sie die Google-Bildsuche nicht kratzen können, werde ich nur Samne-Bilder crawlen und sammeln.
Speichern Sie das Hundebild aus der Google-Bildsuche
Holen Sie sich Bilder der Google Bildsuche in Originalgröße