You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 02:20:39