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.
Ich möchte das auf diese Weise angezeigte Bild speichern.
Das Bild wird wie im Titel angegeben auf Leinwand gezeichnet.
Nachdem ich die Seite recherchiert hatte, stellte ich fest, dass ich das Bild durch Klicken mit der rechten Maustaste speichern konnte.
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!
Das Ergebnis der Bildspeicherung, mit dem Sie auf diese Weise vertraut sind.
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.
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!
Dank meiner Sucht (?) Habe ich etwas über ActionChains, PyAutoGUI und base64 gelernt. Automatisierung macht Spaß.
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