Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Download an Image Using Selenium Webdriver in Python

I am trying to download an image from a URL using Selenium Webdriver in Python. The site is protected by a login page, so can't just save the URL contents using requests. I am able to get text from the site after logging in, but I can't figure out how to save an image.

After I log in to the site, I can do browser.save_screenshot(filename + '.png') but that image is not the correct size as the original.

The code that I have now is this:

browser = webdriver.Chrome('../chromedriver')
browser.get('www.example.com/login')
# send username and password, click submit

browser.get('www.example.com/123')
html = browser.page_source
printData(html)

# this url is an image file
browser.get('www.example.com/get_photo.php?id=123')
browser.save_screenshot(filename + '.png')

Ideally I would like to replace the save_screenshot() with something like

with open(filename + '.jpeg', 'w') as img:
    img.write(browser.download_current_image())

or even something like this, interacting with the popup menu

browser.right_click()
browser.down_arrow_key()
browser.return_key()

or simulating a keypress

browser.command_key()
browser.s_key()

This question gives the answers that I want, but not for Python. If there is a way to do any of the things suggested in that question (besides taking a screenshot) in Python, that would be a great solution.

like image 483
beninato Avatar asked Mar 28 '18 09:03

beninato


1 Answers

Here is what I used to download an image from a URL behind a login page by logging in using Selenium Webdriver and then passing the cookies to requests to save the image:

headers = {
"User-Agent":
    "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36"
}
s = requests.session()
s.headers.update(headers)

for cookie in browser.get_cookies():
    c = {cookie['name']: cookie['value']}
    s.cookies.update(c)

r = s.get(imgurl, allow_redirects=True)
open(filename + '.jpeg', 'wb').write(r.content)

Thanks to AldoSuwandi for showing me how to do this in this post. I also used this site to help me figure out how to download an image using requests.

like image 126
beninato Avatar answered Sep 20 '22 10:09

beninato