python中如何不用request来判断一张图片是否可以下载(快速判断一张图片能否下载)

问题提出

在某些场合,可能需要判断一个网页的图片最大能下载到哪一个位置,在采用多线程的方式去下载。
例如一个网页有一堆图片,图片的链接有一定的规律性,例如
http://kd.nsfc.gov.cn/report/19/19331042_1.png
http://kd.nsfc.gov.cn/report/19/19331042_2.png
一般方法是寻找到图片能下载的最大位置,借用request方法来判断图片是否能下载:

image = "http://kd.nsfc.gov.cn/report/19/19331042_{}.png"
max = 0
for i in range(1, 1000):
if request(image.format(i), headers=headers).status == 200:
	max = i   # 修改最大位置

这样做不仅效率低,而且有时候会访问出错,甚至一个网页要花好几秒才能返回状态码。

通过我的观察,我发现:urlretrieve 方法,它能有一个极快的速度来进行判断。
当某个图片的链接无法下载的时候,返回404异常或是其他(根据网站判断)
于是便可写成下列代码:

try:
	#image_url: 图片链接
	#save_file: 保存位置
	max = 0
	for i in range(1, 1000):
		image = "http://kd.nsfc.gov.cn/report/19/19331042_{}.png"
		urlretrieve(image_url.format(i), save_file)  # 如果无法下载,则抛出异常404
except Except as e:
	try:
		if(str(e).index("404")):
			max = index   # 修改max的大小
	except Except as e:
		print(e)

这样做便可大大提高寻找 “最大能下载图片的位置” 的效率。
当然如果结合二分算法,会更快:

# approval_num: 用于构造下载链接的批准号
# local_image: 保存图片的位置
# min, max : 查找的上限下限
def BinarySearchIndex(approval_num, local_image , min, max):
    while True:
        index = min + int((max - min) / 2)        # 中间值
        print(min, index, max)
        try:
            image_url = "http://kd.nsfc.gov.cn/report/{}/{}_{}.png".format(approval_num[0:2], approval_num, index)
            urlretrieve(image_url, local_image)
            if min == index:
                return min
            min = index
        except Exception as e :
            print(e)
            try:
                if (str(e).index("404") > 0):
                    max = index
            except Exception as e:
                print(e)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

C01acat

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

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

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

打赏作者

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

抵扣说明:

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

余额充值