Download and write ~100k images
Some minor improvements:


I would switch to a NamedTuple instead of a separate class:

from collections import namedtuple

Image = namedtuple('Image', ('master_id', 'url'))

Or, if you are going to stay with classes, consider adding __slots__ - may help performance-wise - though this part is not likely to be your bottleneck, but rather can be a quick and easy win
you can also improve your extract_data function:

def extract_data(data):
    """Extract data"""
    return [Image(*url) for _, url in data.iterrows()] 

I would also try asyncio from Python 3.x. Here is also a relevant snippet.