如何使用requests或urllib.request仅请求下载指定字节数的数据
实现指定字节范围请求的方法
完全可以实现,你可以通过HTTP标准的Range请求头,指定需要获取的字节区间,只要目标服务器支持范围请求,就可以避免下载完整文件。
requests 实现示例
在get方法中传入自定义headers指定字节范围即可,支持范围请求的服务器会返回206状态码:
import requests # 此处示例请求前2048字节(0-2047下标),你可以根据GIF第一帧实际大小调整范围 headers = {"Range": "bytes=0-2047"} r = requests.get("https://cdn.discordapp.com/attachments/712243005519560736/908229068909068318/sample_1.gif", headers=headers) if r.status_code == 206: # 拿到的content就是你指定范围的字节内容,可直接用于解析第一帧 target_bytes = r.content # 如果返回200状态码,说明服务器不支持范围请求,此时返回的是完整文件内容
urllib.request 实现示例
逻辑和requests版本一致,仅调用方式不同:
import urllib.request url = "https://cdn.discordapp.com/attachments/712243005519560736/908229068909068318/sample_1.gif" req = urllib.request.Request(url, headers={"Range": "bytes=0-2047"}) with urllib.request.urlopen(req) as resp: if resp.getcode() == 206: target_bytes = resp.read()
优化提示
如果想要更精准的只下载第一帧字节,可以先请求前10字节解析GIF文件头,获取全局颜色表长度、帧数据偏移量等信息后,计算出第一帧的结束字节位置,再调整Range头的结束数值,完全不会多下载冗余内容。
内容的提问来源于stack exchange,提问作者M.Craig
相关产品推荐
相关产品推荐

