python图片批量下载多线程+超时重试

背景
    上篇python入门实战:爬取图片到本地介绍过如何将图片下载到本地,但是实际处理过程中会遇到性能问题:分页数过多下载时间过程、部分页面连接超时无法访问下载失败。本文从实战的角度解释一下如何处理这两个问题。
    下载时间过长问题,处理方式是使用多线程,首先回顾一下上篇文章文件下载处理过程,总结来说只有两个步骤:1.获取指定网页的所有图片地址,2.根据图片地址循环访问下载到本地。使用多线程处理任务最简单的办法就是一个线程处理一页的下载任务,就是获取一页的图片地址,下载该页面的所有图片。需要下载多少页就创建多少个线程。
    连接超时无法访问问题,这个问题处理方式就是请求重试,就是针对连接超时的请求重新发送指定次数的请求。关于重试,可以看下自定义请求重试方式和request中封装的请求重试方法。 Python基础入门3.6 request模块之请求重试两者的区别已经介绍的很清楚了。思路梳理完毕之后下面就是具体的实现。

代码实现

import threading  # 线程
import time
import requests
import bs4
import os
from requests.adapters import HTTPAdapter  # 添加重试机制


def getImgUrlList(webSiteUrl,local_path):
    print(f"下载地址:{webSiteUrl}")
    try:
        session = requests.Session()
        session.mount('http://', HTTPAdapter(max_retries=3))
        session.mount('https://', HTTPAdapter(max_retries=3))
        response = session.get(webSiteUrl, timeout=5)
    except requests.exceptions.Timeout:
        print(f"{webSiteUrl}请求超时!")
        raise BaseException(f"{webSiteUrl}请求超时!")
    website_content = response.content
    soup = bs4.BeautifulSoup(website_content, "html.parser")
    img_url_list = soup.find_all("div", class_="pic")
    for imgUrl in img_url_list:
        style_info = imgUrl["style"]
        img = style_info[style_info.find("(") + 1:style_info.find(")")]
        down_load_img(img,local_path)
def down_load_img(img_url,local_path):
    img_name = os.path.basename(img_url[img_url.rfind("/")+1:len(img_url)])
    with open(f"{local_path}\{img_name}","wb") as imgFile:
        res = requests.get(img_url)
        if res.status_code == 200:
            resp = imgFile.write(res.content)
            if resp is not None:
                print(f"{img_name}下载成功!")
            else:
                print(f"{img_name}下载失败!")
        else:
            print(f"{img_name}请求失败,下载失败!")


if __name__ == '__main__':
  	# 下载本地地址
    local_path="D:\mvImg"
    # 下载4页,创建4个线程
    for i in range(4):
        thread = threading.Thread(target=getImgUrlList,args=(f'https://pic.netbian.top/index_{i+1}.html',local_path))
        thread.start()

说明
    如果还是出现某一页连接超时的情况可以调整重试次数以及超时连接时间.具体设置需要根据对应网页调试进行配置.本文设置的是重试次数3,超时连接为5秒.可根据实际情况进行调整.

你可能感兴趣的:(python,windows,开发语言)