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

如何在pandas read_html()中传入账号密码爬取权限保护网页数据?

问题解答

1. 为什么requests.get()返回大量代码而非网页内容?

  • 你用requests.get()传入账号密码字典的方式完全错误:这类依赖表单登录的网站,要求通过POST请求把账号密码提交到专门的登录接口,而非直接附在GET请求参数里。你当前的请求根本没完成登录流程,返回的只是未授权状态下的页面源码(比如登录表单页面、带JS逻辑的未访问权限提示页),所以看起来是一堆代码。
  • 另外,这类网站靠会话Cookie维持登录状态,直接用get请求传参不会保存登录后的Cookie,后续请求始终处于未授权状态。

2. 如何让pandas.read_html()完成带账号密码的爬取?

read_html的storage_options参数仅适用于HTTP基本认证,不支持表单登录场景。正确流程是先通过requests会话完成登录,再获取目标页面内容传给read_html:

步骤说明

  1. 用requests.Session()创建会话对象,它会自动保存并携带Cookie,维持登录状态。
  2. 找到网站的登录接口(你的字段是j_username和j_password,这是Spring Security框架的默认字段,登录接口通常是/j_spring_security_check,需通过浏览器F12网络面板确认实际地址)。
  3. 用会话POST登录接口,提交账号密码表单数据。
  4. 登录成功后,用同一个会话请求目标页面。
  5. 将返回的页面文本传给pd.read_html()解析表格。

示例代码

import pandas as pd
import requests

# 1. 创建会话,自动管理Cookie
session = requests.Session()

# 2. 填写实际登录接口地址(需自行确认)
login_url = 'https://learn.mystrategicforecast.com/j_spring_security_check'
auth_data = {
    'j_username': '你的账号/邮箱',
    'j_password': '你的密码'
}

# 3. 提交登录请求
login_res = session.post(login_url, data=auth_data)
# 可通过状态码或响应内容初步判断登录是否成功
if login_res.status_code == 200:
    print("登录请求发送成功")

# 4. 请求目标页面
target_url = 'https://learn.mystrategicforecast.com/courses/take/insidethenumbers/multimedia/13520859-insidethenumbers-today'
page_res = session.get(target_url)

# 5. 解析页面中的表格
df_list = pd.read_html(page_res.text)
# 页面可能存在多个表格,按需取对应索引的结果
if df_list:
    df = df_list[0]
    print(df)
else:
    print("页面未检测到可解析的表格")

额外注意

  • 若目标页面是JS动态渲染的(比如表格数据靠JS加载),则需要用selenium等工具模拟浏览器加载页面后再获取源码。
  • 请遵守网站使用规则,避免频繁请求导致账号或IP被封禁。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 12:22:15