Dieses Mal habe ich versucht, das Bild von "Suzu Hirose" mithilfe der Bildsuchfunktion von Google zu kratzen. Ich denke, dass Sie einige Bilddaten benötigen, wenn Sie die Bildverarbeitung selbst durchführen. Ich hoffe, Sie werden diesen Artikel als eines der Mittel zum Erfassen von Bildern bezeichnen.
Als ich diesmal ein Bild aus der Bildsuche von Google erhielt, musste ich scrollen, um es zu erhalten. Verwenden Sie Selen zum Scrollen, da dies mit Beautiful Soup nicht möglich ist.
Importieren Sie zunächst alles.
from selenium import webdriver
from time import sleep
from bs4 import BeautifulSoup
import requests
import base64
import os
import re
import shutil
Bei Verwendung von Selen ist ein Chromtreiber erforderlich. Holen Sie es sich mit ChromeDriver --WebDriver für Chrome .
#Öffnen Sie jetzt Google
driver = webdriver.Chrome("C:\\Users\\chromedriver")#Geben Sie den Pfad an, in dem sich der Treiber befindet.
driver.get("https://www.google.com/")
sleep(2)
Gibt den Speicherort der Suchleiste an. Verwenden Sie zu diesem Zeitpunkt die in Selen geöffnete Überprüfungsfunktion von Chrome, um den Standort zu identifizieren. Ich habe mit Chrome überprüft, dass ich es ursprünglich heruntergeladen habe, und es ist ein Fehler aufgetreten, weil ich es basierend darauf ausgeführt habe. Infolgedessen dauerte es ungefähr eine Stunde, um die Fehlerursache herauszufinden. .. .. .. .. ..
search_bar = driver.find_element_by_name("q")
#Geben Sie Schlüsselwörter in die Suchleiste ein
search_bar.send_keys("Hirose Dose")
search_bar.submit()
sleep(2)
Wenn es gut geht, können Sie suchen, indem Sie Hirose Tin in die Suchleiste eingeben.
Gehen Sie dann zur Bildliste.
#Zum Bildbildschirm wechseln
img_btn = driver.find_element_by_xpath('//a[@class="q qs"]')
img_btn.click()
Ich werde zur Bildliste unten wechseln, daher möchte ich die Bilder hier erhalten.
Holen Sie sich zuerst die URL des Bildes. Dieses Mal, wenn ich die URL des Bildes erhalte, benutze ich BeautifulSoup, um das img-Tag zu finden und es von dort abzurufen. Die meisten Bild-URLs werden in der Daten-src des img-Tags gespeichert, aber manchmal gibt es einige, die keine Daten-src haben, also komme ich zu diesem Zeitpunkt von src.
#Scrollen Sie durch den Bildschirm.
try:
#Die Bild-URL wird dabei dupliziert.
all_images = []
#Scrolle 5 mal
for i in range(5):
#Ich scrolle hier auf dem Bildschirm.
driver.execute_script("window.scrollTo(0,document.body.scrollHeight);")
#Ich lade es hier in Beautiful Soup.
soup = BeautifulSoup(driver.page_source , "html.parser")
#all_Bild-URL an Bilder anhängen
for image in soup.find_all("img"):
try:
url = image.get("data-src")
if url is None:
url = image.get("src")
if url is not None:
all_images.append(url)
except:
print("Beim Abrufen der Bild-URL ist ein Fehler aufgetreten.")
print()
sleep(2)
except Exception:
print("Beim Scrollen des Bildschirms ist ein Fehler aufgetreten.")
error_flag = True
Und wie im Code kommentiert, wird die Bild-URL in all_images gespeichert, aber die URL wird hier dupliziert. Daher werden wir Duplikate entfernen, um sie eindeutig zu machen.
all_images = list(dict.fromkeys(all_images))
Bei einigen dieser URLs wurden die Daten zusätzlich zur https-URL in das base64-Format geändert. Daher müssen zum Herunterladen zwei Muster verwendet werden. (1) Download von HTTP (2) Download von base64. Dieses Mal habe ich eine Funktion erstellt, die jedem Muster entspricht.
#Speichern Sie das von http url übergebene Bild.
def img_url_download(url , file_path):
response = requests.get(url , stream = True)
#Speichern unter,
with open(file_path , 'wb') as file:
shutil.copyfileobj(response.raw , file)
#Funktion zum Speichern von base64
#In URL"data:image/jpeg;base64,"Setzen Sie den mit dem entfernten ein.
def base64_download(url , file_path):
img = base64.b64decode(url.encode())
with open(file_path , "wb") as f:
f.write(img)
Speichern Sie das Bild nach dem Definieren der Funktion am Ende im Ordner.
#Legen Sie die Bilddaten in die Datei! !!
#Dateipfad
path = r"C:\Users\suzu_img_files"#Bitte geben Sie den Pfad des Ordners an, um das Bild zu speichern
#base64 ist der erste"data:image/jpeg;base64,"Es gibt, also versuchen Sie es zu entfernen.
base64_string = "data:image/jpeg;base64,"
for index , image_url in enumerate(all_images):
filename = "suzu_" + str(index) + ".jpg "
file_path = os.path.join(path , filename)
#Die if-Anweisung verzweigt sich je nachdem, ob es sich um base64 handelt oder nicht.
if len(re.findall(base64_string , image_url)) > 0:
url = url.replace(base64_string , "")#Das Präfix wurde aus der URL entfernt.
base64_download(url , file_path)
else:
img_url_download(image_url , file_path)
Wenn alles gut geht, wird das Bild wie unten gezeigt gespeichert.
Wie war das? Ist es nicht möglich, den Bereich des Schabens mit Selen zu erweitern? Diesmal war es Herr Suzu Hirose, aber ich denke, es ist gut, mit Menschen, Tieren, Gebäuden usw. zu kratzen, die Sie mögen! Dieses Mal habe ich es auch über den Google-Suchbildschirm implementiert, weil ich auch Selen geübt habe. Wenn Sie jedoch nur ein Bild erhalten möchten, ist es schneller, es mit der ersten URL als URL der Bildliste von Herrn Hirose zu implementieren. nicht wahr,,,
Referenzmaterial
[Einführung in Python] Das Bild von Kanna Hashimoto kratzen. Beispiele für die Funktionen von Python: Laden Sie Bilder herunter. Übungen nach Progate | Datenanalyse mit Python. Schöne Suppe
ChromeDriver - WebDriver for Chrome
Python-basiertes Web-Scraping (BeautifulSoup, Selenium, Requests) >