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
相关产品推荐
相关产品推荐

