Il existe déjà plusieurs articles sur la façon de gratter des images dans la recherche d'images, mais il y avait peu d'articles qui pouvaient être utilisés tels quels, probablement parce que des changements mineurs aux spécifications étaient fréquents, j'ai donc écrit un article indiquant les cas où il y a une possibilité de changement. Je vais. Peut-être que tout ce que vous avez à faire lorsque cela ne fonctionne pas est d'utiliser les outils de développement de votre navigateur pour découvrir les noms de classe et d'identifiant dont vous avez besoin, mais c'est évident pour ceux qui savent, mais si vous ne savez pas ce qui ne va pas Cela prend du temps.
macOS Mojave 10.14.5 Python 3.7.2 Chrome 80.0 date 2020-04-01
pip install selenium
Démarrer → recherche Google → essayer de terminer
from selenium import webdriver
#Spécifiez le chemin du pilote Web téléchargé
DRIVER_PATH = '/User/hoge/1bin/chromedriver'
#Lancer le navigateur Web
wd = webdriver.Chrome(executable_path=DRIVER_PATH)
#Accéder à google
wd.get('https://google.com')
#Sélectionnez un champ de recherche.Il existe plusieurs façons de choisir
search_box = wd.find_element_by_name('q')
# search_box = wd.find_element_by_css_selector('input.gLFyf')
# search_box = wd.find_element_by_class_name('gLFyf')
#Rechercher Qiita
search_box.send_keys('Qiita')
search_box.submit()
time.sleep(5)
#Quittez le navigateur Web
wd.quit()
Tout d'abord, obtenez l'URL de la vignette du résultat de la recherche.
#Temps d'attente après l'opération, par exemple en cliquant(Secondes)
sleep_between_interactions = 2
#Nombre de téléchargements
download_num = 3
#Rechercher un mot
query = "cat"
#URL pour la recherche d'images
search_url = "https://www.google.com/search?safe=off&site=&tbm=isch&source=hp&q={q}&oq={q}&gs_l=img"
wd = webdriver.Chrome(executable_path=DRIVER_PATH)
wd.get(search_url.format(q=query))
#Obtenez le lien de l'image miniature(S'il y a de la mousse ici, vérifiez le sélecteur et changez-le)
thumbnail_results = wd.find_elements_by_css_selector("img.rg_i")
Cliquez sur l'URL de la vignette acquise avec le webdriver pour afficher l'image et acquérir l'URL de l'image d'origine. De plus, étant donné que le nom de classe spécifié lors de l'acquisition de l'URL de l'image d'origine est susceptible de changer, utilisez les outils de développement appropriés pour le vérifier et le modifier.
image_urls = set()
for img in thumbnail_results[:download_num]:
try:
img.click()
time.sleep(sleep_between_interactions)
except Exception:
continue
#Comme vous ne pouvez pas obtenir l'URL d'un seul coup, affinez-vous après avoir fait des candidats(S'il vous plaît dites-moi s'il y a un moyen)
# 'n3VNCb'Est susceptible de changer, regardez donc l'élément de l'image sur laquelle vous avez cliqué et modifiez-le en conséquence.
url_candidates = wd.find_elements_by_class_name('n3VNCb')
for candidate in url_candidates:
url = candidate.get_attribute('src')
if url and 'https' in url:
image_urls.add(url)
#Si vous n'attendez pas un moment, cela ne se terminera pas normalement, alors ajoutez 3 secondes
time.sleep(sleep_between_interactions+3)
wd.quit()
Tout ce que vous avez à faire est de télécharger l'image à partir de l'URL et vous n'avez pas besoin d'un pilote Web.
import os
from PIL import Image
import hashlib
image_save_folder_path = 'data'
for url in image_urls:
try:
image_content = requests.get(url).content
except Exception as e:
print(f"ERROR - Could not download {url} - {e}")
try:
image_file = io.BytesIO(image_content)
image = Image.open(image_file).convert('RGB')
file_path = os.path.join(image_save_folder_path,hashlib.sha1(image_content).hexdigest()[:10] + '.jpg')
with open(file_path, 'wb') as f:
image.save(f, "JPEG", quality=90)
print(f"SUCCESS - saved {url} - as {file_path}")
except Exception as e:
print(f"ERROR - Could not save {url} - {e}")
Pour la fenêtre de recherche Google, search_box = wd.find_element_by_name ('q')
Pour l'image d'origine du résultat de la recherche d'image, wd.find_elements_by_class_name ('n3VNCb')
Ceux-ci peuvent être confirmés à l'aide des outils de développement du navigateur.
Navigateur "..." -> Autres outils-> Outils de développement
Les raccourcis sont `` Ctrl Shift J (sur Windows)
ʻou
cmd + Option + J (sur Mac)
Si vous avez une image que vous souhaitez spécifier, faites un clic droit sur l'image et sélectionnez «Vérifier» pour afficher les éléments correspondant à l'image. S'il s'agit d'une vignette de recherche d'image, les éléments sont les suivants. Les éléments peuvent être copiés en cliquant sur le '...' qui apparaît dans l'état sélectionné.
<img alt="Dogs | The Humane Society of the United States" class="n3VNCb" src="https://www.humanesociety.org/sites/default/files/styles/1240x698/public/2019/02/dog-451643.jpg?h=bf654dbc&itok=MQGvBmuo" data-noaft="1" jsname="HiaYvf" jsaction="load:XAeZkd;" style="width: 450px; height: 253.306px; margin: 0px;">
Puisqu'il dit class = "n3VNCb" Vous pouvez le sélectionner avec wd.find_elements_by_class_name ('n3VNCb').
Pour copie
import os
import time
from selenium import webdriver
from PIL import Image
import io
import requests
import hashlib
#Temps d'attente après l'opération, par exemple en cliquant(Secondes)
sleep_between_interactions = 2
#Nombre de téléchargements
download_num = 3
#Rechercher un mot
query = "cat"
#URL pour la recherche d'images
search_url = "https://www.google.com/search?safe=off&site=&tbm=isch&source=hp&q={q}&oq={q}&gs_l=img"
#Obtenir l'URL de l'image miniature
wd = webdriver.Chrome(executable_path=DRIVER_PATH)
wd.get(search_url.format(q=query))
#Obtenez le lien de l'image miniature(S'il y a de la mousse ici, vérifiez le sélecteur et changez-le)
thumbnail_results = wd.find_elements_by_css_selector("img.rg_i")
#Cliquez sur la vignette pour obtenir chaque URL d'image
image_urls = set()
for img in thumbnail_results[:download_num]:
try:
img.click()
time.sleep(sleep_between_interactions)
except Exception:
continue
#Comme vous ne pouvez pas obtenir l'URL d'un seul coup, affinez-vous après avoir fait des candidats(S'il vous plaît dites-moi s'il y a un moyen)
# 'n3VNCb'Est susceptible de changer, regardez donc l'élément de l'image sur laquelle vous avez cliqué et modifiez-le en conséquence.
url_candidates = wd.find_elements_by_class_name('n3VNCb')
for candidate in url_candidates:
url = candidate.get_attribute('src')
if url and 'https' in url:
image_urls.add(url)
#Si vous n'attendez pas un moment, cela ne se terminera pas normalement, alors ajoutez 3 secondes
time.sleep(sleep_between_interactions+3)
wd.quit()
#Télécharger l'image
image_save_folder_path = 'data'
for url in image_urls:
try:
image_content = requests.get(url).content
except Exception as e:
print(f"ERROR - Could not download {url} - {e}")
try:
image_file = io.BytesIO(image_content)
image = Image.open(image_file).convert('RGB')
file_path = os.path.join(image_save_folder_path,hashlib.sha1(image_content).hexdigest()[:10] + '.jpg')
with open(file_path, 'wb') as f:
image.save(f, "JPEG", quality=90)
print(f"SUCCESS - saved {url} - as {file_path}")
except Exception as e:
print(f"ERROR - Could not save {url} - {e}")
Recommended Posts