如何用Python生成特定字母数字序列以批量下载大英图书馆书籍图片
批量下载大英图书馆书籍扫描页的Python脚本优化
大英图书馆提供大量可下载的高质量书籍扫描件,但官方多页下载工具无法使用。原本编写的Requests脚本仅能下载前9页,因为后续页码采用了特殊的十六进制编码规则,需要生成符合要求的URL序列才能批量下载全部页面(共456页)。
原脚本(仅支持前9页)
import requests base_url = "https://api.bl.uk/image/iiif/ark:/81055/vdc_000000038900.0x0000" for i in range(1, 456): target_url = base_url + str(i) + "/full/2306,/0/default.jpg" r = requests.get(target_url) with open('bl_' + str(i) + '.jpg', 'wb') as f: f.write(r.content) print(target_url)
页码编码规则分析
URL中的页码部分本质是十进制页码转换为5位大写十六进制字符串(前导补零),对应关系完全匹配你描述的规则:
- 第1-9页:十进制1-9 → 5位十六进制
000001-000009 - 第10-15页:十进制10-15 → 5位十六进制
00000A-00000F - 第16-255页:十进制16-255 → 5位十六进制
000010-0000FF - 第256-456页:十进制256-456 → 5位十六进制
000100-0001C8
优化后的完整脚本
import requests import time base_url_prefix = "https://api.bl.uk/image/iiif/ark:/81055/vdc_000000038900.0x" url_suffix = "/full/2306,/0/default.jpg" # 遍历1到456页(range左闭右开,所以结束值设为457) for page_num in range(1, 457): # 将十进制页码转换为5位大写十六进制字符串 hex_page = hex(page_num)[2:].upper().zfill(5) target_url = f"{base_url_prefix}{hex_page}{url_suffix}" try: # 添加1秒延迟,避免请求过于频繁触发反爬限制 time.sleep(1) response = requests.get(target_url, timeout=10) response.raise_for_status() # 主动抛出HTTP错误 # 保存图片,文件名保留十进制页码方便排序查看 with open(f'bl_{page_num}.jpg', 'wb') as f: f.write(response.content) print(f"已下载第{page_num}页: {target_url}") except requests.exceptions.RequestException as e: print(f"下载第{page_num}页失败: {str(e)}")
脚本改进说明
- 自动生成符合规则的5位十六进制页码,完美覆盖全部456页
- 添加请求延迟和超时设置,降低被服务器限制的风险
- 加入异常捕获机制,避免单个页面下载失败导致脚本中断
- 使用f-string拼接字符串,代码更简洁易读
内容的提问来源于stack exchange,提问作者askneyledi
相关产品推荐
相关产品推荐

