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秒.可根据实际情况进行调整.

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卖柴火的小伙子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值