如何用Python保存并加载Requests响应与BeautifulSoup对象?
保存与加载网页请求响应的实用方案
想要避免重复爬取网站、复用之前的请求响应?这里有两种靠谱的实现方式,适配不同的需求场景:
方案1:保存原始HTML内容(推荐首选)
这种方式最通用,不依赖特定库的版本,文件体积小还能直接用文本编辑器查看,完全不用担心兼容性问题。
保存响应内容
先发起一次请求,把响应的原始字节内容保存到本地文件:
import requests def save_raw_html(link, save_file_path): # 发起请求并确保请求成功 response = requests.get(link, timeout=5) response.raise_for_status() # 如果请求失败会抛出异常 # 以二进制模式保存,避免编码乱码问题 with open(save_file_path, 'wb') as f: f.write(response.content) # 调用示例:把目标网页的响应保存到本地 save_raw_html("https://example.com", "saved_page.html")
加载并解析
需要使用时,直接读取文件内容并生成BeautifulSoup对象:
from bs4 import BeautifulSoup def load_and_parse_html(save_file_path): with open(save_file_path, 'rb') as f: raw_content = f.read() # 解析成你需要的BeautifulSoup对象 return BeautifulSoup(raw_content, "html.parser") # 加载后复用你的getValue函数 page = load_and_parse_html("saved_page.html") def getValue(page): target_td = page.find('td', attrs={'class': 'Fz(s) Fw(500) Ta(end)'}) return target_td.text if target_td else "未找到目标元素" print(getValue(page))
方案2:序列化requests.Response与BeautifulSoup对象
如果需要完整保留请求响应的所有信息(比如状态码、响应头、Cookie等),可以用Python的pickle模块直接序列化对象。不过要注意:pickle文件的兼容性较差,不同Python版本或requests/bs4版本可能无法正常加载。
保存对象
import pickle import requests from bs4 import BeautifulSoup def save_response_objects(link, response_pkl_path, soup_pkl_path): response = requests.get(link, timeout=5) response.raise_for_status() # 序列化保存Response对象 with open(response_pkl_path, 'wb') as f: pickle.dump(response, f) # 解析后序列化保存BeautifulSoup对象 soup = BeautifulSoup(response.content, "html.parser") with open(soup_pkl_path, 'wb') as f: pickle.dump(soup, f) # 调用示例 save_response_objects("https://example.com", "response.pkl", "soup.pkl")
加载对象
import pickle def load_response(pkl_path): with open(pkl_path, 'rb') as f: return pickle.load(f) def load_soup(pkl_path): with open(pkl_path, 'rb') as f: return pickle.load(f) # 加载后使用 loaded_response = load_response("response.pkl") loaded_soup = load_soup("soup.pkl") # 复用getValue函数 def getValue(page): target_td = page.find('td', attrs={'class': 'Fz(s) Fw(500) Ta(end)'}) return target_td.text if target_td else "未找到目标元素" print(getValue(loaded_soup))
额外小贴士
- 建议给保存的文件加上时间戳(比如
saved_page_20240520_1430.html),这样可以轻松区分不同时间的网页快照,避免覆盖。 - 如果网站内容更新频繁,可以在加载前检查文件的创建时间,超过阈值就重新爬取更新。
内容的提问来源于stack exchange,提问作者שגיא שלום
相关产品推荐
相关产品推荐

