如何在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:
步骤说明
- 用
requests.Session()创建会话对象,它会自动保存并携带Cookie,维持登录状态。 - 找到网站的登录接口(你的字段是
j_username和j_password,这是Spring Security框架的默认字段,登录接口通常是/j_spring_security_check,需通过浏览器F12网络面板确认实际地址)。 - 用会话POST登录接口,提交账号密码表单数据。
- 登录成功后,用同一个会话请求目标页面。
- 将返回的页面文本传给
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
相关产品推荐
相关产品推荐

