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

如何用Python Requests保留会话Cookie检测HTML页面更新(含重定向场景)

嘿,这个场景我太熟了!要监控带会话的页面更新,核心就是复用同一个会话实例,同时用高效的方式对比内容变化。我给你梳理下具体方案和代码:

核心思路

  1. 用requests.Session()维护会话:它会自动保存和携带Cookie、会话信息,完全符合你“保留当前会话”的需求,不用手动处理Cookie的传递。
  2. 用哈希值对比内容:直接对比HTML文本太占资源,计算页面内容的哈希值(比如MD5),通过对比哈希值判断是否更新,高效又准确。
  3. 自动跟踪重定向: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:21:26