Python使用requests.get下载SEC的PDF文件随机损坏如何解决?
SEC网站PDF批量下载损坏解决方案
- 添加随机请求延迟
SEC对高频请求限制严格,每次请求之间加入1~3秒的随机等待,模拟人工访问频率,避免触发频次反爬规则。 - 完善请求头配置
仅配置User-Agent不足以模拟正常浏览器请求,需补充Referer、Accept、Accept-Encoding等标准请求头字段,降低被识别为爬虫的概率。 - 增加请求校验与重试机制
原代码未判断请求状态码、未校验返回内容完整性,遇到反爬拦截返回非200状态码时仍直接写入内容,是文件损坏的核心原因之一。需增加状态码判断、返回内容长度校验,请求失败时自动重试2~3次。 - 使用会话保持请求上下文
采用requests.Session()发起请求,自动管理请求Cookie与连接状态,行为更接近真实浏览器访问。
from pathlib import Path import requests import time import random from requests.adapters import HTTPAdapter from urllib3.util.retry import Retry # 配置请求重试规则 retry_strategy = Retry( total=3, backoff_factor=1, status_forcelist=[429, 500, 502, 503, 504, 403] ) adapter = HTTPAdapter(max_retries=retry_strategy) # 初始化会话,配置请求头 session = requests.Session() session.mount("https://", adapter) session.mount("http://", adapter) headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36', 'Referer': 'https://www.sec.gov/', 'Accept': 'application/pdf,*/*;q=0.9', 'Accept-Encoding': 'gzip, deflate, br', 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8', 'Connection': 'keep-alive' } session.headers.update(headers) url_list = [ # 填入对应的7个SEC PDF链接即可 ] n_files = 0 for eachurl in url_list: n_files += 1 # 随机延迟1-3秒 time.sleep(random.uniform(1, 3)) response = session.get(eachurl, timeout=30) # 校验请求成功 if response.status_code == 200: # 校验内容长度,避免下载不全 content_length = int(response.headers.get('Content-Length', 0)) if content_length and len(response.content) != content_length: print(f"文件{n_files}下载不完整,重新尝试") response = session.get(eachurl, timeout=30) filename = Path(f"{n_files}.pdf") filename.write_bytes(response.content) print(f"文件{n_files}下载完成") else: print(f"文件{n_files}下载失败,状态码:{response.status_code}")
内容的提问来源于stack exchange,提问作者Jacob Ho
相关产品推荐
相关产品推荐

