6

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.

3
  • site is protected by a login page, so can't just save the URL contents using requests... Why do you think that requests doesn't support Authentication? Commented Mar 28, 2018 at 9:28
  • 1
    I had this situation before, what I did I'll just copy the webdriver session to requests, then download the image with it. How to transfer it: stackoverflow.com/questions/32639014/… Of course, it depends how secure/complex the website that you're dealing with Commented Mar 28, 2018 at 13:31
  • @AldoSuwandi that link was exactly what I was looking for. Thanks! I'll post the code I used as my answer. Commented Mar 28, 2018 at 18:10

1 Answer 1

11

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.

Sign up to request clarification or add additional context in comments.

1 Comment

thanks this worked well and you don't even need selenium

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.