在写Python爬虫时,经常会有下载文件的需求,比如我们可以通过以下代码下载图片或者视频

import requests

def request_chunk_download_image(image_url, image_path):
    res = requests.get(image_url)
    with open(image_path, 'wb') as f:
        for chunk in res.iter_content(chunk_size=1024):
            f.write(chunk)

if __name__ == '__main__':
    image_url = 'https://img-blog.csdnimg.cn/20200924162143340.jpg'
    image_path = './image.jpg'
    request_chunk_download_image(image_url, image_path)

但是上述代码有一个问题,如果下载一个图片出现错误或者异常,就会导致整个程序退出,然后导致对这个网站的爬取出现问题,可能这个问题时由于短暂的网络原因所导致的,所以我们可以对上述代码进行一个鲁棒性的修改,就是无论如何我们都必须保证程序不会因为异常所退出,然后保证图片或者视频在下载出错的时候可以重新下载,直到下载完成,修改后的代码如下。

import requests

def request_chunk_download_image(image_url, image_path):
    try:
        res = requests.get(image_url)
        with open(image_path, 'wb') as f:
            for chunk in res.iter_content(chunk_size=1024):
                f.write(chunk)
    except requests.exceptions.ConnectionError:
        print(f"下载{image_url}失败,尝试重新下载")
        request_chunk_download_image(image_url, image_path)
    except requests.exceptions.Timeout:
        print(f"下载{image_url}失败,尝试重新下载")
        request_chunk_download_image(image_url, image_path)


if __name__ == '__main__':
    image_url = 'https://img-blog.csdnimg.cn/20200924162143340.jpg'
    image_path = './image.jpg'
    request_chunk_download_image(image_url, image_path)

其实就是通过一个简单的try...catch语句块捕捉下载异常,当出现网络连接问题或者超时的时候就会重新执行函数,直到下载文件完成。