Cette fois, j'ai essayé de gratter l'image de "Suzu Hirose" en utilisant la fonction de recherche d'images de Google. Je pense que vous aurez besoin de certaines données d'image lorsque vous effectuez vous-même le traitement d'image. J'espère que vous vous référerez à cet article comme l'un des moyens d'acquérir des images.
Cette fois, quand j'ai eu une image de la recherche d'images de Google, j'ai dû faire défiler pour l'obtenir. Utilisez du sélénium pour faire défiler car cela ne peut pas être fait avec Beautiful Soup.
Tout d'abord, importez tout.
from selenium import webdriver
from time import sleep
from bs4 import BeautifulSoup
import requests
import base64
import os
import re
import shutil
Un pilote chrome est requis lors de l'utilisation du sélénium. Obtenez-le avec ChromeDriver --WebDriver pour Chrome .
#Maintenant, ouvrez Google
driver = webdriver.Chrome("C:\\Users\\chromedriver")#Spécifiez le chemin où se trouve le pilote.
driver.get("https://www.google.com/")
sleep(2)
Spécifie l'emplacement de la barre de recherche. À ce stade, utilisez la fonction de vérification de Chrome ouvert dans le sélénium pour identifier l'emplacement. Je l'ai vérifié avec Chrome que j'avais téléchargé à l'origine, et j'ai eu une erreur parce que je le faisais sur cette base. En conséquence, il a fallu environ une heure pour découvrir la cause de l'erreur. .. .. .. .. ..
search_bar = driver.find_element_by_name("q")
#Saisissez des mots clés dans la barre de recherche
search_bar.send_keys("Étain Hirose")
search_bar.submit()
sleep(2)
Si cela se passe bien, vous pouvez effectuer une recherche en tapant Hirose Tin dans la barre de recherche.
Passez ensuite à la liste d'images.
#Passer à l'écran d'image
img_btn = driver.find_element_by_xpath('//a[@class="q qs"]')
img_btn.click()
Je vais passer à la liste d'images ci-dessous, donc j'aimerais obtenir les images ici.
Tout d'abord, récupérez l'URL de l'image. Cette fois, lorsque j'obtiens l'URL de l'image, j'utilise BeautifulSoup pour trouver la balise img et l'obtenir à partir de là. La plupart des URL d'image sont stockées dans le data-src de la balise img, mais parfois il y en a qui n'ont pas de data-src, donc à ce moment-là je reçois de src.
#Faites défiler l'écran.
try:
#L'URL de l'image y est dupliquée.
all_images = []
#Faites défiler 5 fois
for i in range(5):
#Je fais défiler l'écran ici.
driver.execute_script("window.scrollTo(0,document.body.scrollHeight);")
#Je le charge dans Beautiful Soup ici.
soup = BeautifulSoup(driver.page_source , "html.parser")
#all_Ajouter l'URL de l'image aux images
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("Une erreur s'est produite lors de l'obtention de l'URL de l'image.")
print()
sleep(2)
except Exception:
print("Une erreur s'est produite lors du défilement de l'écran.")
error_flag = True
Et comme indiqué dans le code, l'URL de l'image est stockée dans all_images, mais l'URL est dupliquée ici. Par conséquent, nous supprimerons les doublons pour les rendre uniques.
all_images = list(dict.fromkeys(all_images))
Certaines de ces URL ont vu leurs données modifiées au format base64 en plus de l'URL https. Par conséquent, il est nécessaire d'utiliser deux modèles pour télécharger. (1) Téléchargement depuis HTTP (2) Téléchargement depuis base64. Cette fois, j'ai créé une fonction pour correspondre à chaque motif.
#Enregistrez l'image transmise par URL http.
def img_url_download(url , file_path):
response = requests.get(url , stream = True)
#Enregistrer dans un fichier,
with open(file_path , 'wb') as file:
shutil.copyfileobj(response.raw , file)
#Fonction pour enregistrer base64
#Dans l'url"data:image/jpeg;base64,"Mettez dans celui avec le retiré.
def base64_download(url , file_path):
img = base64.b64decode(url.encode())
with open(file_path , "wb") as f:
f.write(img)
Après avoir défini la fonction, enregistrez l'image dans le dossier à la fin.
#Mettez les données d'image dans le fichier! !!
#Chemin du fichier
path = r"C:\Users\suzu_img_files"#Veuillez spécifier le chemin du dossier pour enregistrer l'image
#base64 est le premier"data:image/jpeg;base64,"Il y en a, alors essayez de le supprimer.
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)
#L'instruction if se branche selon qu'elle est en base64 ou non.
if len(re.findall(base64_string , image_url)) > 0:
url = url.replace(base64_string , "")#Suppression du préfixe de l'url.
base64_download(url , file_path)
else:
img_url_download(image_url , file_path)
Si tout se passe bien, l'image sera enregistrée comme indiqué ci-dessous.
Comment était-ce? N'est-il pas possible d'élargir la gamme de grattage en utilisant du sélénium? Cette fois, c'était M. Suzu Hirose, mais je pense que c'est bien de gratter avec les gens, les animaux, les bâtiments, etc. que vous aimez! De plus, cette fois, je l'ai implémenté à partir de l'écran de recherche de Google car j'ai aussi pratiqué le sélénium, mais si vous voulez juste obtenir une image, il est plus rapide de l'implémenter avec la première URL comme URL de la liste d'images de M. Hirose. n'est-ce pas,,,
Matériel de référence
[Introduction à Python] Grattage de l'image de Kanna Hashimoto. Exemples de ce que Python peut faire: Télécharger des images. Exercices après Progate | Analyse des données avec Python. Belle soupe
ChromeDriver - WebDriver for Chrome
Scrapage Web basé sur Python (BeautifulSoup, Selenium, Requests) >
Recommended Posts