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

Python requests模块无法提取完整cookie 实现EurekAlert登录爬虫问题

核心原因

你只能获取到PHPSESSID的原因非常明确:你手动从浏览器复制的cookie里,除PHPSESSID是服务端通过Set-Cookie响应头设置的权限类cookie外,剩余的_ga、_gid、__gads、AMCV/AMCVS等前缀的cookie,都是站点加载的谷歌分析、Adobe分析等第三方统计脚本通过JavaScript在浏览器端生成的。requests库不会执行页面内嵌的JS代码,自然无法获取这部分cookie,且绝大多数站点的登录、权限校验逻辑完全不会校验这类统计类cookie,你无法完成登录的核心原因大概率是登录流程没有走全,而非缺失这部分非必要cookie。


方案1:使用无头浏览器自动处理全流程(推荐,开发成本最低)

直接使用Selenium、Playwright这类支持JS执行的浏览器自动化工具,全程模拟用户操作,工具会自动管理所有服务端+前端生成的cookie,不需要你手动处理任何cookie字段,示例代码以Playwright为例:

from playwright.sync_api import sync_playwright
from bs4 import BeautifulSoup

with sync_playwright() as p:
    # 启动浏览器,调试阶段可将headless设为False查看操作过程
    browser = p.chromium.launch(headless=True)
    # 设置和浏览器一致的请求头环境
    context = browser.new_context(
        user_agent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36"
    )
    page = context.new_page()

    # 访问目标站点首页
    page.goto("https://www.eurekalert.org/")
    # 点击登录按钮,自动跳转至统一登录页
    page.get_by_role("link", name="Sign In").click()
    # 填写账号密码提交登录
    page.get_by_label("Email address").fill("你的账号")
    page.get_by_label("Password").fill("你的密码")
    page.get_by_role("button", name="Sign In").click()

    # 登录完成后直接访问权限页面
    page.goto("https://www.eurekalert.org/reporter/home")
    # 解析页面内容
    soup = BeautifulSoup(page.content(), "html.parser")

    # 如有需要可以导出全量cookie给requests使用
    full_cookies = context.cookies()
    print(full_cookies)

    browser.close()

方案2:纯requests实现,跳过非必要cookie

不需要手动拼接任何统计类cookie,只要走全完整的跳转流程,requests的session会自动维护所有必要的权限类cookie,即可完成登录:

import requests
from bs4 import BeautifulSoup

session = requests.session()
# 统一设置全局请求头,不要手动添加cookie字段,session会自动维护有效cookie
session.headers.update({
    "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36",
    "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8",
    "accept-language": "en-GB,en-US;q=0.9,en;q=0.8"
})

# 1. 访问站点首页,获取初始权限cookie
session.get("https://www.eurekalert.org/")

# 2. 访问站点登录跳转入口,获取登录页的动态参数(不要直接请求aaas的登录地址)
login_entry_url = "https://www.eurekalert.org/users/sign-in" # 替换为站点实际的登录跳转入口
login_page_resp = session.get(login_entry_url)
soup = BeautifulSoup(login_page_resp.text, "html.parser")

# 3. 提取登录表单所有动态隐藏字段(如csrf token、session_state等必填参数)
login_form = soup.find("form")
login_data = {}
for hidden_input in login_form.select('input[type="hidden"]'):
    name = hidden_input.get("name")
    value = hidden_input.get("value", "")
    login_data[name] = value

# 4. 补充账号密码参数
login_data.update({
    "username": "你的实际账号", # 替换为登录表单实际的账号字段名
    "password": "你的实际密码" # 替换为登录表单实际的密码字段名
})

# 5. 提交登录请求
login_action = login_form.get("action", login_page_resp.url)
session.post(login_action, data=login_data)

# 6. 直接访问权限页面
target_resp = session.get("https://www.eurekalert.org/reporter/home")
print(target_resp.status_code) # 返回200即为登录成功
soup = BeautifulSoup(target_resp.text, "html.parser")

内容的提问来源于stack exchange,提问作者taga

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 01:54:00