Download binary data like pictures (jpg, png, etc.)

This post is based on an stackoverflow answer. First of all you should use the requests package instead of using raw urllib{1,2,3}.

If you do not want to download a typical HTML website with

import requests
response = requests.get('http://blog.itkun.de/index.html')
print(response.text)

, but want to download for example an image?

You can also use requests for this, but you have to do a little bit more, since the data being downloaded is binary.

pic = requests.get('http://blog.itkun.de/favicon.png', stream=True)

lets you use a stream instead of getting the text as a string.

if pic.ok:
    with open("favicon.png", "wb") as fobj:
        for chunk in pic:
            fobj.write(chunk)

So the check if the request was ok, is also useful in the case of HTML, therefore I do not count this line ;) You open a file using a contextmanager in binary write mode. The tricky part is that you write the file in chunks, which is possible due to the streaming. But if you are using Python >= 3.4 you can also use the pathlib and save the file directly in binary format:

import pathlib
name.write_bytes(pic.content)

To get the name out of your request (you probably know it beforehand) you can use Python 3.4's pathlib (or os.path as Python < 3.4 user) some properties of you request object:

import pathlib
name = pathlib.Path(pic.request.path_url).name

or for Python < 3.4

from os import path
path.basename(pic.request.path.url)