如何使用Python requests复刻curl批量下载多范围参数文件功能?
问题核心原因
你用到的[x-y]范围语法是curl工具原生支持的批量请求扩展能力,Python的requests库不会自动解析这种语法,你原来的写法只会发送1次参数为字符串[66-900]、[7-444]的请求,自然不会得到预期的批量下载结果。
正确实现方案
- 手动遍历两个参数的所有取值范围,循环发起请求
- 每次请求完成后将响应内容写入本地文件,用参数值区分文件名避免覆盖
完整可运行代码示例:
import requests import time # 替换为你从Firefox复制的完整请求头,所有参数都要补全避免被站点拦截 headers = { 'User-Agent': '替换为实际请求头里的UA值', # 其余Accept、Referer等头参数都按curl里的内容补充在这里 } # 替换为实际的PHPSESSID cookies = { 'PHPSESSID': '你的实际phpsessid值', } # 遍历store_id范围:range左闭右开,所以结束值要加1 for store_id in range(66, 901): # 遍历page范围 for page in range(7, 445): params = { 'store_id': store_id, 'page': page } try: response = requests.get( 'http://website.com/shop.php', headers=headers, params=params, cookies=cookies, timeout=30 ) # 校验请求是否成功 response.raise_for_status() # 自定义文件名,避免重复覆盖,可根据自己需求调整命名规则 file_name = f"store_{store_id}_page_{page}.html" # 二进制写入兼容所有文件类型(文本、图片、压缩包等) with open(file_name, 'wb') as f: f.write(response.content) print(f"已保存:{file_name}") # 可选:加0.5-1秒延迟,避免请求太频繁被站点封禁 time.sleep(0.5) except Exception as e: print(f"下载store_id={store_id}, page={page}失败:{str(e)}")
额外注意事项
- 如果下载的是大文件,可以给
requests.get加stream=True参数,逐块写入避免占用过多内存 - 如果需要和curl
-O参数逻辑完全一致,使用服务器返回的原始文件名,可以从响应头Content-Disposition字段提取,新手可以先跑通上述基础版本再做优化 - 后续如果需要提升下载速度,可以再改造成多线程/协程版本
内容的提问来源于stack exchange,提问作者Datenkralle
相关产品推荐
相关产品推荐

