如何用Python Requests保留会话Cookie检测HTML页面更新(含重定向场景)
嘿,这个场景我太熟了!要监控带会话的页面更新,核心就是复用同一个会话实例,同时用高效的方式对比内容变化。我给你梳理下具体方案和代码:
核心思路
- 用
requests.Session()维护会话:它会自动保存和携带Cookie、会话信息,完全符合你“保留当前会话”的需求,不用手动处理Cookie的传递。 - 用哈希值对比内容:直接对比HTML文本太占资源,计算页面内容的哈希值(比如MD5),通过对比哈希值判断是否更新,高效又准确。
- 自动跟踪重定向:requests默认会跟随重定向,刚好适配你说的“页面更新触发重定向但URL不变”的情况,能拿到重定向后的最新内容。
完整代码示例
import requests import hashlib import time # 初始化会话,自动维护Cookie和Session状态 session = requests.Session() url = 'xxx' headers = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36' } # 把请求头绑定到会话,后续所有请求自动携带 session.headers.update(headers) def get_page_content_hash(): """获取当前页面内容的MD5哈希值""" try: # 发送请求,默认自动跟踪重定向 resp = session.get(url) # 确保请求成功,避免错误响应干扰对比 resp.raise_for_status() # 计算哈希值,用utf-8编码处理中文避免乱码 return hashlib.md5(resp.text.encode('utf-8')).hexdigest() except requests.exceptions.RequestException as e: print(f"请求出错: {e}") return None # 获取初始页面的基准哈希 initial_hash = get_page_content_hash() if not initial_hash: print("无法获取初始页面,监控终止") exit() print(f"已获取初始页面,哈希值: {initial_hash}") # 轮询间隔(单位:秒),根据网站更新频率调整,别太频繁避免被封 poll_interval = 30 try: while True: time.sleep(poll_interval) current_hash = get_page_content_hash() if not current_hash: continue if current_hash != initial_hash: print("🎉 页面已更新!") # 这里可以添加自定义操作:比如保存新内容、发邮件通知等 # 更新基准哈希,继续监控后续变化 initial_hash = current_hash else: print("页面未更新,继续监控...") except KeyboardInterrupt: print("\n监控已手动停止")
额外注意事项
- 避免被反爬:不要把轮询间隔设得太短(比如几秒一次),建议根据网站实际更新频率调整,比如5-10分钟一次;也可以在headers里添加更多真实请求头(比如
Referer)模拟正常浏览器行为。 - 过滤动态干扰内容:如果页面有自动变化的元素(比如时间戳、随机脚本参数),可以先通过正则或BeautifulSoup过滤掉这些内容再计算哈希,避免误判。比如:
from bs4 import BeautifulSoup def get_cleaned_content(): resp = session.get(url) soup = BeautifulSoup(resp.text, 'html.parser') # 移除带时间戳的脚本或标签 for script in soup.find_all('script', attrs={'src': lambda x: x and 'timestamp' in x}): script.decompose() return str(soup) - 异常处理:代码里已经加了请求异常捕获,你还可以根据需要添加重试逻辑(比如用
tenacity库),应对临时的网络波动。
内容的提问来源于stack exchange,提问作者J P
相关产品推荐
相关产品推荐

