Télécharger les 1000 premières images de google image

a marqué ce sujet comme résolu.

Bonsoir,

J’aimerais faire un script en python qui télécharge les 1000 premières image de google image :

  • Je donne un nom de dossier en paramètre
  • Je donne un string correspondant à la recherche sur google image
  • Ma fonction télécharge les 1000 premières images de google image pour le nom de recherche spécifié dans le nom de dossier spécifié

J’ai testé plusieurs solutions pour résoudre ce problème mais aucune ne fonctionnent. Par exemple j’ai tenté l’utilisation du module google_images_download mais celui est devenu obsolète.

Je me suis dis que l’utilisation de BeautifulSoup est peut-être la solution mais je vois difficilement comment procéder. Je récupère toutes les img de la page dans une liste, j’accède à leur src, puis je save l’image ? Malheureusement lorsque je fais cela ça ne marche pas :

import os
import csv
import requests
from bs4 import BeautifulSoup
from PIL import Image 




requete = requests.get("https://www.google.com/search?q=test&tbm=isch&ved=2ahUKEwixraH7sKHwAhUigXMKHfAWDVoQ2-cCegQIABAA&oq=test&gs_lcp=CgNpbWcQAzIHCAAQsQMQQzIECAAQQzIECAAQQzIECAAQQzIFCAAQsQMyBQgAELEDMgQIABBDMgUIABCxAzIECAAQQzIECAAQQzoECCMQJzoCCAA6CAgAELEDEIMBUO0GWO0IYKALaABwAHgAgAFHiAGCApIBATSYAQCgAQGqAQtnd3Mtd2l6LWltZ8ABAQ&sclient=img&ei=YpCJYLH0M6KCzgPwrbTQBQ&bih=821&biw=1440")
page = requete.content
soup = BeautifulSoup(page)

img = soup.find_all("img")

for i in img:
    url = "https:/"+i['src']
    im1 = Image.open(requests.get(url, stream=True).raw)
    im1.save(i['src'] +".jpg")

J’ai ce type d’erreurs :

requests.exceptions.ConnectionError: HTTPConnectionPool(host='images', port=80): Max retries exceeded with url: /branding/searchlogo/1x/googlelogo_desk_heirloom_color_150x55dp.gif (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7fb097509eb0>: Failed to establish a new connection: [Errno 8] nodename nor servname provided, or not known'))

Avez-vous des idées de solution à mon problème ?

Merci beaucoup et bonne soirée !

Bonjour,

L’erreur que tu donnes indique que la page de Google Image contient des balises de la forme :

<img src="/chemin/absolu/sans/nom/dhote/image.png">

Ce type de chemin semi-relatif permet de ne pas spécifier le nom d’hôte dans l’attribut src des images, mais complique la récupération par ton script.

Pour circonvenir à ceci, une manière serait d’attraper les exceptions de type requests.exceptions.ConnectionError dans ta boucle de récupération des images, et de les ignorer purement et simplement (ou alors en donnant juste un message d’avertissement).

+1 à la solution précédente, en ajoutant que l’on peut aussi, dans de tels cas (ou préventivement, si l’URL commence par un /), le nom de domaine de Google (https://www.google.com), ce qui fera des URLs résolvables :) .

Et dans tous les cas, attraper les potentielles erreurs pour afficher que l’URL n’a pas été trouvée / a échoué / whatever, mais tout de même continuer le reste, ce qui permet de récupérer tout ce qu’est possible en laissant de côté les erreurs (mieux que rien).

J’ignore ton niveau d’aisance en Python, mais si tu ne connais pas, renseignes-toi sur les exceptions et try/except.

+0 -0

Merci beaucoup pour vos réponses ça marche beaucoup mieux !

J’ai néanmoins une petite question qui persiste. Supposons que je veuille récupérer les images de sites web dynamiques comme par exemple : https://www.shutterstock.com/fr/search/galerie. Comment est ce que je peux faire ?

Le problème c’est que le code source du site n’est pas le même que quand j’inspecte l’élément. Du coup le problème c’est que quand je fais une requete .get pour prendre la page je prends le code source (le hard code) et pas celui après chargement. Il m’est alors impossible de traiter la page pour analyser les balises img puisque BeautifulSoup me dit tout simplement qu’il n’y en a pas…

Existe-il une solution pour toujours utiliser BeautifulSoup sur ce genre de sites "dynamiques" ?

Merci :D

+0 -0

Alors, c’est plus compliqué (mais tout de même possible) car il faut dans ce cas avoir un vrai navigateur. Télécharger la page ne suffit plus, il faut la faire tourner, faire tourner le JS, etc.

Il existe des solutions pour ça, notamment Selenium, un outil initialement conçu pour faire des tests automatisés en conditions réelles1 mais qu’est concrètement un vrai navigateur contrôlable automatiquement, via une API simple (entre autres disponible en Python).

C’est vraiment puissant, car en plus de juste lire la page tu peux aussi interagir avec (cliquer sur tel ou tel élément, remplir et soumettre tel formulaire, défiler la page, attendre qu’un élément charge, …).


  1. Zeste de Savoir utilise d’ailleurs Selenium pour certains tests automatisés.
+0 -0

Il existe une autre solution : observer d’où viennent les données grâce à ton navigateur et faire la même requête. Tu sais que ton navigateur obtient les URLs des images avant les requêtes en direction de ces images. Pour prendre l’exemple de Shutterstock, on commence par déterminer ce que l’on cherche : le nom de la première image contient "lviv-ukraine". Il y a trois requêtes JSON qui sont faites mais aucune d’elle ne contient le terme recherché. Pareil pour les ressources JS chargées. Cependant, le document HTML contient le mot clé !

Pour automatiser ça, il suffit donc de télécharger le document HTML (avec un User-Agent réaliste, celui de curl est bloqué par exemple) et d’extraire le ld+json qui englobe les données. Le soucis sera au niveau du nombre d’images récupérées, il semble en avoir environ 100 dans la liste.

Effectivement, dans certains cas ça vaut le coup d’investiguer avant voir si on peut pas faire plus simple. Un autre exemple est celui d’Instagram, qui charge tout en JS… mais, toutes les pages contiennent un gros blob JSON avec toutes les données nécessaires (donc pas besoin de Selenium).

Cela dit, et c’est là l’inconvénient de toute ingénierie inversée — il n’est pas dit que le format ne change pas avec le temps (et ça ça touche autant les techniques à la Selenium que celles un peu plus intelligentes).

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte