如何避免爬虫因Cookie过期导致登录失效

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
Elasticsearch Serverless检索通用型,资源抵扣包 100CU*H
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
简介: 如何避免爬虫因Cookie过期导致登录失效
  1. Cookie的作用及其过期机制
    1.1 什么是Cookie?
    Cookie是服务器发送到用户浏览器并保存在本地的一小段数据,用于维持用户会话状态。爬虫在模拟登录后,通常需要携带Cookie访问后续页面。
    1.2 Cookie为什么会过期?
    ● 会话Cookie(Session Cookie):浏览器关闭后失效。
    ● 持久Cookie(Persistent Cookie):设置Expires或Max-Age属性,超时后失效。
    ● 服务器主动失效:如用户修改密码、长时间未操作等。
    如果爬虫未正确处理Cookie过期问题,会导致:
    ● 请求返回401/403状态码
    ● 被重定向到登录页面
    ● 触发网站反爬机制(如封禁IP)
  2. 检测Cookie是否过期的策略
    2.1 直接检测HTTP响应
    ● 检查返回状态码(如302重定向到登录页)。
    ● 检查响应内容是否包含登录提示(如"请先登录")。
    import requests

def check_cookie_valid(session):
test_url = "https://example.com/user/profile" # 需要登录才能访问的页面
response = session.get(test_url)

if response.status_code == 200 and "个人中心" in response.text:
    return True  # Cookie有效
else:
    return False  # Cookie失效

2.2 检查Cookie的Expires属性
如果服务器返回的Cookie带有Expires字段,可以解析并判断是否已过期。
from datetime import datetime

def is_cookie_expired(cookie):
if "expires" in cookie:
expires_time = datetime.strptime(cookie["expires"], "%a, %d-%b-%Y %H:%M:%S GMT")
return expires_time < datetime.now()
return False # 无过期时间或会话Cookie

  1. 自动刷新Cookie的解决方案
    3.1 重新登录获取新Cookie
    当检测到Cookie失效时,自动调用登录接口更新Cookie。
    def login(username, password):
    login_url = "https://example.com/login"
    session = requests.Session()
    payload = {"username": username, "password": password}
    response = session.post(login_url, data=payload)

    if "登录成功" in response.text:

     return session  # 返回带新Cookie的Session
    

    else:

     raise Exception("登录失败")
    

    3.2 使用Session对象持久化Cookie
    requests.Session()可自动管理Cookie,但需结合存储机制(如文件、数据库)实现长期有效。
    import pickle

def save_session(session, filename="session.pkl"):
with open(filename, "wb") as f:
pickle.dump(session.cookies, f)

def load_session(filename="session.pkl"):
session = requests.Session()
try:
with open(filename, "rb") as f:
session.cookies.update(pickle.load(f))
except FileNotFoundError:
pass # 首次运行无缓存
return session
3.3 结合Redis缓存Cookie(分布式爬虫适用)
import redis
import pickle

redis_client = redis.StrictRedis(host="localhost", port=6379, db=0)

def save_session_to_redis(session, key="example_cookie"):
redis_client.set(key, pickle.dumps(session.cookies))

def load_session_from_redis(key="example_cookie"):
session = requests.Session()
cookie_data = redis_client.get(key)
if cookie_data:
session.cookies.update(pickle.loads(cookie_data))
return session

  1. 进阶优化方案
    4.1 使用Selenium处理动态Cookie
    某些网站采用JavaScript动态生成Cookie,可使用selenium模拟浏览器登录。
    from selenium import webdriver
    from selenium.webdriver.common.by import By

def selenium_login(username, password):
driver = webdriver.Chrome()
driver.get("https://example.com/login")
driver.find_element(By.NAME, "username").send_keys(username)
driver.find_element(By.NAME, "password").send_keys(password)
driver.find_element(By.XPATH, "//button[@type='submit']").click()

# 获取Cookie并转为requests可用的格式
cookies = driver.get_cookies()
session = requests.Session()
for cookie in cookies:
    session.cookies.set(cookie["name"], cookie["value"])

driver.quit()
return session

4.2 结合代理IP和User-Agent轮换
避免因频繁登录触发反爬。
import requests
from requests.auth import HTTPProxyAuth

爬虫配置

LOGIN_URL = "https://example.com/login" # 登录页面的 URL
DATA_URL = "https://example.com/data" # 需要爬取数据的 URL
USERNAME = "your_username" # 用户名
PASSWORD = "your_password" # 密码

代理配置

proxyHost = "www.16yun.cn"
proxyPort = "5445"
proxyUser = "16QMSOML"
proxyPass = "280651"

构造代理地址

proxies = {
"http": f"http://{proxyUser}:{proxyPass}@{proxyHost}:{proxyPort}",
"https": f"http://{proxyUser}:{proxyPass}@{proxyHost}:{proxyPort}",
}

请求头

headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3",
}

登录函数

def login():
session = requests.Session()
login_data = {
"username": USERNAME,
"password": PASSWORD
}
response = session.post(LOGIN_URL, data=login_data, headers=headers, proxies=proxies, auth=HTTPProxyAuth(proxyUser, proxyPass))
if response.status_code == 200:
print("登录成功,获取到新的 Cookie")
return session
else:
print("登录失败")
return None

检测 Cookie 是否过期

def check_cookie(session):
response = session.get(DATA_URL, headers=headers, proxies=proxies)
if response.status_code == 401 or response.status_code == 403:
print("Cookie 过期,需要重新登录")
return False
elif "登录已失效" in response.text:
print("Cookie 过期,需要重新登录")
return False
else:
print("Cookie 仍然有效")
return True

主爬虫逻辑

def main():
session = login() # 首次登录获取 Cookie
if session is None:
print("无法登录,爬虫终止")
return

while True:
    if check_cookie(session):  # 检测 Cookie 是否过期
        # 如果 Cookie 有效,继续爬取数据
        response = session.get(DATA_URL, headers=headers, proxies=proxies)
        if response.status_code == 200:
            print("成功获取数据")
            # 处理数据
            print(response.text)
        else:
            print("数据获取失败")
    else:
        # 如果 Cookie 过期,重新登录
        session = login()
        if session is None:
            print("重新登录失败,爬虫终止")
            break

if name == "main":
main()

  1. 结论
    ● Cookie过期检测:通过状态码、页面内容或Expires字段判断。
    ● 自动刷新Cookie:重新登录或使用Session持久化存储。
    ● 分布式爬虫:可采用Redis共享Cookie,避免重复登录。
    ● 动态网站:结合selenium获取动态生成的Cookie。
    通过合理管理Cookie,爬虫可以长期稳定运行,避免因登录失效导致的数据抓取中断。
相关文章
|
9天前
|
数据采集 Web App开发 前端开发
Python+Selenium爬虫:豆瓣登录反反爬策略解析
Python+Selenium爬虫:豆瓣登录反反爬策略解析
|
7月前
|
数据采集 JavaScript 前端开发
使用Panther进行爬虫时,如何优雅地处理登录和Cookies?
使用Panther进行爬虫时,如何优雅地处理登录和Cookies?
|
9月前
|
数据安全/隐私保护
在某网站的登录页面登录时如果选择“记住用户名”,登录成功后会跳转到一个中间层(页面代码将登录的用户名和密码存在cookie),中间页面中存在一个超链接,单击超链接可以链接到第三个页面查看信息。若选择“
该博客文章通过示例代码和运行结果截图,展示了网站登录过程中如何通过中间层页面使用cookies技术实现“记住用户名”功能,并在点击超链接后查看保存的用户名和密码信息。
在某网站的登录页面登录时如果选择“记住用户名”,登录成功后会跳转到一个中间层(页面代码将登录的用户名和密码存在cookie),中间页面中存在一个超链接,单击超链接可以链接到第三个页面查看信息。若选择“
|
8月前
|
数据采集 编解码
jupyter-notebook编写爬虫代码的时候cookie值自动转码的问题
jupyter-notebook编写爬虫代码的时候cookie值自动转码的问题
84 0
|
9月前
|
数据安全/隐私保护
|
9月前
|
Java 应用服务中间件 nginx
【Azure 环境】Azure应用程序网关设置set_Cookie=key=value; SameSite=Strict; HTTPOnly,AzureAD登录使用cookie时使用不了的案例记录
【Azure 环境】Azure应用程序网关设置set_Cookie=key=value; SameSite=Strict; HTTPOnly,AzureAD登录使用cookie时使用不了的案例记录
|
11月前
|
安全 Java Maven
如何使用jsoup实现网站登录,cookie保存,查询信息
【6月更文挑战第11天】如何使用jsoup实现网站登录,cookie保存,查询信息
393 1
|
11月前
|
安全 Java Maven
使用jsoup实现网站登录,cookie保存,查询信息
【6月更文挑战第7天】使用jsoup实现网站登录,cookie保存,查询信息
144 0
|
数据采集 存储 安全
登录态数据抓取:Python爬虫携带Cookie与Session的应用技巧
登录态数据抓取:Python爬虫携带Cookie与Session的应用技巧
|
5月前
|
存储 前端开发 Java
【SpringMVC】——Cookie和Session机制
获取URL中参数@PathVarible,上传文件@RequestPart,HttpServerlet(getCookies()方法,getAttribute方法,setAttribute方法,)HttpSession(getAttribute方法),@SessionAttribute
129 11