Source code for downloader.downloader

#! /usr/bin/env python
# -*- coding: utf-8 -*-
#
# Interpreter version: python 2.7
#
# Imports =====================================================================
import requests


# Functions & classes =========================================================
[docs]def head_request(url): """ Send HEAD request to given `url`. Args: url (str): URL of the internet resource. Returns: dict: Dictionary with *headers*. Important headers: ``content-length``\ and ``content-type``. """ resp = requests.head(url) resp.raise_for_status() return dict(resp.headers)
[docs]def download(url): """ Download resource at `url`. Args: url (str): URL of the internet resource. Returns: str: Content of the downloaded resource. """ resp = requests.get(url) resp.raise_for_status() return resp.content
[docs]def progress_download(url, steps, callback): """ Download resource at `url` and call `callback` after each step. The number of steps is defined by `steps` parameter. Args: url (str): URL of the internet resource. steps (int): Number of steps (how many times will be `callback` called). callback (fn reference): Reference to function expecting three arguments: *step* (number of step), *downloaded* (number of downloaded bytes), *content_len* (size of downloaded resource). """ output = bytes() response = requests.get(url, stream=True) response.raise_for_status() # handle lenght of the file total_length = response.headers.get('content-length') if total_length is None: # no content length header return response.content total_length = int(total_length) # download files and compute progress last_step_number = 0 downloaded_len = 0 step_len = int(total_length / steps) for data in response.iter_content(5*1024): downloaded_len += len(data) output += data step_number = int(downloaded_len / step_len) if step_number != last_step_number: callback(step_number, downloaded_len, total_length) last_step_number = step_number return output