web-dev-qa-db-ja.com

Selenium pythonで画像をダウンロード

ブラウザからキャプチャ画像を取得したい。この画像のURLを取得しましたが、この画像は更新されるたびに変わります(URLは一定です)。

ブラウザから画像を取得するための解決策はありますか(「画像を名前を付けて保存」ボタンなど)?

一方、私はそれが仕事であるべきだと思う:

  1. ブラウザのスクリーンショットを取得する
  2. 画像の位置を取得
  3. opencvを使用してスクリーンショットからキャプチャをトリミング

動的キャプチャのリンク- link

この問題はスクリーンショットで解決されました。

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)

ありがとう

25
user1941407

完全な例は次のとおりです(ターゲットとしてgoogleのrecaptchaを使用):

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()

更新:

動的に生成される画像の問題は、リクエストするたびに新しい画像が生成されることです。その場合、いくつかのオプションがあります。

  • スクリーンショットを撮る

    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()
    
  • 右クリック+ [名前を付けて保存]をシミュレートします。詳細については、 this thread を参照してください。

お役に立てば幸いです。

33
alecxe

ページ全体からスクリーンショットを保存してから画像を切り取っても構いませんが、「webdriver」の「find」メソッドを使用して保存する画像を見つけ、以下のように「screenshot_as_png」プロパティを記述できます:

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)

スクロールが原因でエラーが発生することもありますが、必要に応じて画像を取得するのが良い方法です。

1
Ramon