web-dev-qa-db-fra.com

Télécharger l'image avec Selenium python

Je veux obtenir l'image captcha du navigateur. J'ai une URL de cette image, mais cette image change à chaque mise à jour (l'URL est constante).

Existe-t-il une solution pour obtenir une image du navigateur (comme le bouton "enregistrer l'image sous")?

D'un autre côté, je pense que ça devrait être du travail:

  1. obtenir une capture d'écran du navigateur
  2. obtenir la position de l'image
  3. recadrer le captcha à partir de la capture d'écran en utilisant opencv

lien du capcha dynamique - lien

Le problème a été résolu par capture d'écran:

browser.save_screenshot('screenshot.png')
img = browser.find_element_by_xpath('//*[@id="cryptogram"]')
loc = img.location

image = cv.LoadImage('screenshot.png', True)
out = cv.CreateImage((150,60), image.depth, 3)
cv.SetImageROI(image, (loc['x'],loc['y'],150,60))
cv.Resize(image, out)
cv.SaveImage('out.jpg', out)

Merci

25
user1941407

Voici un exemple complet (en utilisant recaptcha de google comme cible):

import urllib
from Selenium import webdriver

driver = webdriver.Firefox()
driver.get('http://www.google.com/recaptcha/demo/recaptcha')

# get the image source
img = driver.find_element_by_xpath('//div[@id="recaptcha_image"]/img')
src = img.get_attribute('src')

# download the image
urllib.urlretrieve(src, "captcha.png")

driver.close()

MISE À JOUR:

Le problème avec les images générées dynamiques est qu'il y a une nouvelle image générée à chaque fois que vous la demandez. Dans ce cas, vous avez plusieurs options:

  • prendre une capture d'écran

    from Selenium import webdriver
    
    driver = webdriver.Firefox()
    driver.get('https://moscowsg.megafon.ru/ps/scc/php/cryptographp.php?PHPSESSID=mfc540jkbeme81qjvh5t0v0bnjdr7oc6&ref=114&w=150')
    
    driver.save_screenshot("screenshot.png")
    
    driver.close()
    
  • simuler un clic droit + "Enregistrer sous". Voir ce fil pour plus d'informations.

J'espère que cela pourra aider.

33
alecxe

Vous pouvez enregistrer une capture d'écran de toute la page, puis couper l'image, mais vous pouvez également utiliser la méthode "find" de "webdriver" pour localiser l'image que vous souhaitez enregistrer et écrire la propriété "screenshot_as_png" comme ci-dessous :

from Selenium import webdriver
driver = webdriver.Firefox()
driver.get('https://www.webpagetest.org/')
with open('filename.png', 'wb') as file:
    file.write(driver.find_element_by_xpath('/html/body/div[1]/div[5]/div[2]/table[1]/tbody/tr/td[1]/a/div').screenshot_as_png)

Parfois, il peut y avoir une erreur à cause du défilement, mais selon votre nécessité, c'est un bon moyen d'obtenir l'image.

1
Ramon