[Python] Enregistrez les images dessinées dans le canevas à l'aide de Selenium (ActionChains, PyAutoGUI, base64, etc.)

Lors de la récupération d'une image par grattage, j'ai eu du mal à enregistrer l'image du boîtier dessinée dans le canevas au lieu du format général de balise img.

qiita用_グラフ1.png

Je souhaite enregistrer l'image affichée de cette manière.

L'image est dessinée sur toile comme le titre l'indique.

Faites un clic droit et essayez d'enregistrer

Après avoir recherché la page, j'ai trouvé que je pouvais enregistrer l'image en cliquant avec le bouton droit de la souris.

qiita用_グラフ2.png

Donc, j'ai essayé différentes choses pour réaliser le flux de "clic droit sur l'image → enregistrer" par programmation.

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains

#Paramètres du pilote Chrome
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')
driver = webdriver.Chrome(options=options)
#Temps d'attente pour le dessin d'écran
wait = WebDriverWait(driver, 10)
driver.implicitly_wait(10)
#Accéder à la page
url = 'URL de la page cible'
driver.get(url)
#Attendez que la page se charge
wait.until(EC.presence_of_all_elements_located)
#Emplacement de l'image
xpath = 'XPATH de l'image que vous souhaitez enregistrer'
img = driver.find_element_by_xpath(xpath)
#Déplacez la souris vers l'emplacement de l'image, puis cliquez avec le bouton droit de la souris
actions = ActionChains(driver)
actions.move_to_element(img).context_click(img).perform()
#Entrez la touche «↓» 5 fois
actions.send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).perform()
#Entrez la touche Entrée
actions.send_keys(Keys.ENTER).perform()

Accédez à la page cible avec Selenium ↓ Utilisez ActionChains pour déplacer la souris vers l'emplacement de l'image + clic droit pour afficher le menu contextuel ↓ Utilisez le menu contextuel par saisie au clavier (touche «↓» x 5 fois + appuyez sur la touche Entrée)

J'ai essayé de sauvegarder l'image, mais ... non.

Cela fonctionne bien jusqu'au clic droit, mais je ne peux pas utiliser le menu contextuel.

Lorsque j'ai vérifié le mouvement de traitement, l'écran du navigateur s'est déplacé un peu vers le bas après un clic droit.

Apparemment, je tape dans le navigateur au lieu du menu contextuel ...

J'ai donc essayé une autre méthode.


from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.action_chains import ActionChains
import pyautogui

#Paramètres du pilote Chrome
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')
driver = webdriver.Chrome(options=options)
#Temps d'attente pour le dessin d'écran
wait = WebDriverWait(driver, 10)
driver.implicitly_wait(10)
#Accéder à la page
url = 'URL de la page cible'
driver.get(url)
#Attendez que la page se charge
wait.until(EC.presence_of_all_elements_located)
#Emplacement de l'image
xpath = 'XPATH de l'image que vous souhaitez enregistrer'
img = driver.find_element_by_xpath(xpath)
#Déplacez la souris vers l'emplacement de l'image, puis cliquez avec le bouton droit de la souris
actions = ActionChains(driver)
actions.move_to_element(img).context_click(img).perform()
#Enregistrer l'image
pyautogui.typewrite('v')

Accédez à la page cible avec Selenium ↓ Utilisez ActionChains pour déplacer la souris vers l'emplacement de l'image + clic droit pour afficher le menu contextuel ↓ Entrée au clavier avec PyAutoGUI (entrez "v")

Quand je l'ai changé pour le flux, cela a bien fonctionné!

qiita用_グラフ保存.png

Le résultat de l'enregistrement d'image que vous connaissez de cette manière.

Ça ne marche pas si c'est sans tête

C'est tout pour rendre le pilote Chrome sans tête et écrire le processus de changement de nom de fichier!

J'ai pensé ... je ne pouvais pas le sauver quand je l'ai fait sans tête lol

Apparemment, PyAutoGUI envoie des instructions pour opérer sur la fenêtre active. (C'est écrit comme GUI, donc c'est vrai lol)

Par conséquent, même si vous le déplacez dans un état sans tête, si vous le déplacez pendant une autre opération, l'enregistrement échouera naturellement.

C'est très gênant, donc je veux le garder sans tête.

Je pourrais être sans tête

À la suite de diverses enquêtes, j'ai pu devenir sans tête.

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import base64

#Paramètres du pilote Chrome
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')
options.add_argument('--headless')
driver = webdriver.Chrome(options=options)
#Temps d'attente pour le dessin d'écran
wait = WebDriverWait(driver, 10)
driver.implicitly_wait(10)
#Accéder à la page
url = 'URL de la page cible'
driver.get(url)
#Attendez que la page se charge
wait.until(EC.presence_of_all_elements_located)
#Emplacement de l'image
xpath = 'XPATH de l'image que vous souhaitez enregistrer'
img = driver.find_element_by_xpath(xpath)
#Obtenir le canevas en tant que chaîne Base64
canvas_base64 = driver.execute_script("return arguments[0].toDataURL('image/png').substring(21);", img)
#Décoder
canvas_png = base64.b64decode(canvas_base64)
#nom de fichier
file_name = 'Nom de fichier arbitraire.png'
#Sortie de fichier
with open(file_name, 'wb') as f:
    f.write(canvas_png)

J'ai pu enregistrer le canevas en tant que chaîne de caractères avec Base64 dans le flux de → décodage → sortie de fichier!

finalement

Grâce à ma dépendance (?), J'ai découvert ActionChains, PyAutoGUI et base64. L'automatisation est amusante.

Lien de référence

How to perform right click using Selenium ChromeDriver? Laisser Python faire un travail itératif avec PyAutoGui How to save a canvas as PNG in Selenium?

Recommended Posts

[Python] Enregistrez les images dessinées dans le canevas à l'aide de Selenium (ActionChains, PyAutoGUI, base64, etc.)
Enregistrer des images à l'aide de requêtes python3
Encodage base64 des images en Python 3
Charger des images à partir d'une URL à l'aide de Pillow dans Python 3
Créer un bot de collecte de données en Python à l'aide de Selenium
Collectez les tweets en utilisant tweepy en Python et enregistrez-les dans MongoDB
Grattage au sélénium en Python
[Python] Essayez d'utiliser le canevas de Tkinter
Grattage avec du sélénium en Python
Commencez à Selenium en utilisant python
Traduit à l'aide de googletrans en Python
Utilisation du mode Python dans le traitement
Extraction d'objets dans l'image par correspondance de modèles en utilisant OpenCV avec Python