Python脚本登录网站后无法获取数据,寻求技术排查
解决Python脚本登录网站后无法获取登录后数据的问题
兄弟,我看你这代码问题出在几个关键步骤没做对,导致登录操作根本没真正完成,所以打印HTML时还是未登录状态的内容。以下是你遗漏的核心步骤:
- 没有提交完整的登录表单数据:你只访问了登录页面,但没发送登录请求。而且JSF这类网站的登录表单通常包含很多隐藏字段(比如
javax.faces.ViewState、javax.faces.ClientWindow),这些字段必须从登录页面的HTML里提取出来,和用户名、密码一起提交,不能随便写个不完整的data字典。 - 没找对登录请求的目标URL:登录请求的提交地址不是你GET的那个页面URL,而是登录表单
action属性指向的地址,得从页面源码里提取这个地址。 - 没有验证登录是否成功:提交登录请求后,你得先确认登录是否成功(比如检查响应里有没有登录后的专属文本、状态码是否正常),再去访问需要权限的页面,不然就算请求失败了你也不知道。
给你个修正后的示例代码,你可以根据实际页面调整细节:
import requests from bs4 import BeautifulSoup def main(): headers = { "User-Agent": "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.101 Safari/537.36", "Accept-Language": "en-US,en;q=0.5" } # 用session自动维护cookies,这步你做对了 s = requests.session() s.headers.update(headers) # 1. 先访问登录页面,获取表单隐藏字段和必要的cookies login_page_url = 'https://www.e-ams.at/eams-sfa-account/p/index.jsf' login_page_res = s.get(login_page_url) soup = BeautifulSoup(login_page_res.text, 'html.parser') # 提取表单里的所有字段(包括隐藏项) login_data = {} # 找到页面里的登录表单(可能需要根据id/class定位,这里先找所有form) login_form = soup.find('form') if not login_form: print("找不到登录表单,请检查页面结构") return for input_tag in login_form.find_all('input'): input_name = input_tag.get('name') input_value = input_tag.get('value', '') if input_name: login_data[input_name] = input_value # 2. 填入你的用户名和密码(注意替换成页面里实际的input name,比如j_username、j_password) login_data['你的用户名字段name'] = '你的真实用户名' login_data['你的密码字段name'] = '你的真实密码' # 如果有登录按钮的提交字段(比如name为loginButton的input),也要确保包含在login_data里 # 3. 获取表单的提交地址,处理相对路径 form_action = login_form.get('action') if not form_action.startswith('http'): form_action = f'https://www.e-ams.at{form_action}' # 4. 提交登录请求 login_res = s.post(form_action, data=login_data) # 5. 验证登录是否成功(替换成页面里登录成功后的标识文本,比如"欢迎回来"之类的) if '登录成功的标识文本' in login_res.text: print("登录成功!现在可以访问需要权限的页面了") # 访问登录后才能看的页面 protected_page_url = '你要访问的登录后页面URL' protected_res = s.get(protected_page_url) print(protected_res.text) else: print("登录失败!请检查用户名密码,或者表单字段是否正确提取") if __name__ == '__main__': main()
额外提醒几个细节:
- 你得自己打开登录页面,用浏览器F12查看元素,确认用户名、密码对应的input标签
name属性是什么,别直接抄示例里的字段名。 - 如果网站有验证码,那这个脚本还得加验证码处理逻辑(比如手动输入或OCR识别),不然登录肯定失败。
- 有些网站会检测请求头的其他字段(比如
Referer),如果登录失败,可以试着在headers里加上Referer: 登录页面URL。
内容的提问来源于stack exchange,提问作者Constantin M
相关产品推荐
相关产品推荐

