国内外优秀网站,问答网站怎么做营销,网页源代码是什么,cms系统主要做什么背景 上篇python入门实战:爬取图片到本地介绍过如何将图片下载到本地,但是实际处理过程中会遇到性能问题:分页数过多下载时间过程、部分页面连接超时无法访问下载失败。本文从实战的角度解释一下如何处理这两个问题。 下载时间过长问题#xff0c;处理方式是使用多线程…背景 上篇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_retries3))session.mount(https://, HTTPAdapter(max_retries3))response session.get(webSiteUrl, timeout5)except requests.exceptions.Timeout:print(f{webSiteUrl}请求超时!)raise BaseException(f{webSiteUrl}请求超时!)website_content response.contentsoup 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_pathD:\mvImg# 下载4页创建4个线程for i in range(4):thread threading.Thread(targetgetImgUrlList,args(fhttps://pic.netbian.top/index_{i1}.html,local_path))thread.start()说明 如果还是出现某一页连接超时的情况可以调整重试次数以及超时连接时间.具体设置需要根据对应网页调试进行配置.本文设置的是重试次数3,超时连接为5秒.可根据实际情况进行调整.