[Python] Speichern Sie Bilder, die mit Selenium auf Leinwand gezeichnet wurden (ActionChains, PyAutoGUI, base64 usw.).

Beim Abrufen eines Bildes durch Scraping hatte ich Mühe, das Bild des in Leinwand gezeichneten Gehäuses anstelle des allgemeinen img-Tag-Formats zu speichern.

qiita用_グラフ1.png

Ich möchte das auf diese Weise angezeigte Bild speichern.

Das Bild wird wie im Titel angegeben auf Leinwand gezeichnet.

Klicken Sie mit der rechten Maustaste und versuchen Sie zu speichern

Nachdem ich die Seite recherchiert hatte, stellte ich fest, dass ich das Bild durch Klicken mit der rechten Maustaste speichern konnte.

qiita用_グラフ2.png

Also habe ich verschiedene Dinge versucht, um den Ablauf von "Rechtsklick auf das Bild → Speichern" programmgesteuert zu realisieren.

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

#Chrome-Treibereinstellungen
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)
#Wartezeit für das Zeichnen des Bildschirms
wait = WebDriverWait(driver, 10)
driver.implicitly_wait(10)
#Zugriffsseite
url = 'URL der Zielseite'
driver.get(url)
#Warten Sie, bis die Seite geladen ist
wait.until(EC.presence_of_all_elements_located)
#Bildposition
xpath = 'XPATH des Bildes, das Sie speichern möchten'
img = driver.find_element_by_xpath(xpath)
#Bewegen Sie die Maus an die Position des Bildes und klicken Sie mit der rechten Maustaste
actions = ActionChains(driver)
actions.move_to_element(img).context_click(img).perform()
#Geben Sie die Taste "↓" fünfmal ein
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()
#Eingabetaste
actions.send_keys(Keys.ENTER).perform()

Greifen Sie mit Selen auf die Zielseite zu ↓ Verwenden Sie ActionChains, um die Maus an die Position des Bildes zu bewegen, und klicken Sie mit der rechten Maustaste, um das Kontextmenü anzuzeigen ↓ Bedienen Sie das Kontextmenü über die Tastatureingabe (Taste "↓" x 5 Mal + Drücken Sie die Eingabetaste).

Ich habe versucht, das Bild zu speichern, aber ... nein.

Es funktioniert einwandfrei, bis Sie mit der rechten Maustaste klicken, aber ich kann das Kontextmenü nicht bedienen.

Als ich die Verarbeitungsbewegung überprüfte, bewegte sich der Browserbildschirm nach dem Klicken mit der rechten Maustaste etwas nach unten.

Anscheinend tippe ich im Browser statt im Kontextmenü ...

Also habe ich eine andere Methode ausprobiert.


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

#Chrome-Treibereinstellungen
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)
#Wartezeit für das Zeichnen des Bildschirms
wait = WebDriverWait(driver, 10)
driver.implicitly_wait(10)
#Zugriffsseite
url = 'URL der Zielseite'
driver.get(url)
#Warten Sie, bis die Seite geladen ist
wait.until(EC.presence_of_all_elements_located)
#Bildposition
xpath = 'XPATH des Bildes, das Sie speichern möchten'
img = driver.find_element_by_xpath(xpath)
#Bewegen Sie die Maus an die Position des Bildes und klicken Sie mit der rechten Maustaste
actions = ActionChains(driver)
actions.move_to_element(img).context_click(img).perform()
#Bild speichern
pyautogui.typewrite('v')

Greifen Sie mit Selen auf die Zielseite zu ↓ Verwenden Sie ActionChains, um die Maus an die Position des Bildes zu bewegen, und klicken Sie mit der rechten Maustaste, um das Kontextmenü anzuzeigen ↓ Tastatureingabe mit PyAutoGUI (geben Sie "v" ein)

Als ich es in den Flow geändert habe, hat das gut funktioniert!

qiita用_グラフ保存.png

Das Ergebnis der Bildspeicherung, mit dem Sie auf diese Weise vertraut sind.

Es funktioniert nicht, wenn es kopflos ist

Das ist es, um den Chrome-Treiber kopflos zu machen und den Prozess zum Umbenennen von Dateien zu schreiben!

Ich dachte ... ich konnte es nicht retten, als ich es kopflos machte lol

Anscheinend sendet PyAutoGUI Anweisungen, um das aktive Fenster zu bearbeiten. (Es ist als GUI geschrieben, also stimmt das lol)

Selbst wenn Sie es in einem nicht kopflosen Zustand verschieben, schlägt das Speichern natürlich fehl, wenn Sie es während eines anderen Vorgangs verschieben.

Das ist sehr unpraktisch, deshalb möchte ich es kopflos speichern.

Ich könnte kopflos sein

Durch verschiedene Untersuchungen konnte ich kopflos werden.

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

#Chrome-Treibereinstellungen
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)
#Wartezeit für das Zeichnen des Bildschirms
wait = WebDriverWait(driver, 10)
driver.implicitly_wait(10)
#Zugriffsseite
url = 'URL der Zielseite'
driver.get(url)
#Warten Sie, bis die Seite geladen ist
wait.until(EC.presence_of_all_elements_located)
#Bildposition
xpath = 'XPATH des Bildes, das Sie speichern möchten'
img = driver.find_element_by_xpath(xpath)
#Holen Sie sich Canvas als Base64-String
canvas_base64 = driver.execute_script("return arguments[0].toDataURL('image/png').substring(21);", img)
#Dekodieren
canvas_png = base64.b64decode(canvas_base64)
#Dateiname
file_name = 'Beliebiger Dateiname.png'
#Dateiausgabe
with open(file_name, 'wb') as f:
    f.write(canvas_png)

Ich konnte die Zeichenfläche als Zeichenfolge mit Base64 im Ablauf von → Dekodierung → Dateiausgabe speichern!

Schließlich

Dank meiner Sucht (?) Habe ich etwas über ActionChains, PyAutoGUI und base64 gelernt. Automatisierung macht Spaß.

Referenzlink

How to perform right click using Selenium ChromeDriver? Lassen Sie Python iterativ mit PyAutoGui arbeiten How to save a canvas as PNG in Selenium?

Recommended Posts

[Python] Speichern Sie Bilder, die mit Selenium auf Leinwand gezeichnet wurden (ActionChains, PyAutoGUI, base64 usw.).
Speichern Sie Bilder mit Python3-Anforderungen
Base64-Codierung von Bildern in Python 3
Laden Sie Bilder von der URL mit Pillow in Python 3
Erstellen Sie mit Selenium einen Datenerfassungsbot in Python
Sammeln Sie Tweets mit tweepy in Python und speichern Sie sie in MongoDB
Schaben mit Selen in Python
[Python] Versuchen Sie, Tkinters Leinwand zu verwenden
Scraping mit Selen in Python
Starten Sie mit Python zu Selen
Übersetzt mit Googletrans in Python
Verwenden des Python-Modus in der Verarbeitung
Objektextraktion im Bild durch Mustervergleich mit OpenCV mit Python