如何使用Python Requests库实现登录并获取网页数据?
编写脚本登录JSP页面并抓取数据的实现方案
嘿,我看你正在折腾写脚本登录JSP页面抓数据,刚好你给了部分登录页的代码,我来给你支几招,一步步搞定它!
首先先拆解你给出的登录页代码里的关键信息:页面里有个postSubmit()函数用来提交名为postForm的表单,还有一段防止页面被嵌入iframe的JS,以及Cookie相关的处理逻辑。咱们针对这些点来设计脚本。
第一步:先摸清楚登录的核心请求细节
JSP页面的登录通常依赖会话Cookie(比如JSESSIONID)和表单参数,所以第一步得先搞清楚这些:
- 打开浏览器开发者工具(按F12),进入Network标签,正常登录一次,找到登录时的POST请求:
- 记下请求的目标URL(就是表单的
action属性值) - 查看Form Data里的所有参数:除了用户名、密码,可能还有隐藏字段(比如CSRF令牌,很多JSP页面会加这个防跨站)
- 留意请求头里的Cookie、User-Agent这些字段,脚本里最好模拟这些
- 记下请求的目标URL(就是表单的
第二步:选工具写脚本(推荐Python+requests)
如果页面没有特别复杂的JS渲染,用requests库就足够简单高效,下面是示例代码:
import requests from bs4 import BeautifulSoup # 创建会话对象,自动帮咱们维护Cookie(关键!不然登录状态会丢) session = requests.Session() # 先访问登录页面,获取初始Cookie和可能的隐藏字段 login_page_url = "你的登录页面URL" # 可以加个User-Agent模拟浏览器 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" } response = session.get(login_page_url, headers=headers) # 解析登录页面,提取表单信息 soup = BeautifulSoup(response.text, "html.parser") post_form = soup.find("form", {"name": "postForm"}) if not post_form: print("找不到登录表单!") exit() # 构建表单提交的数据 form_data = {} # 提取表单里的所有输入字段(包括隐藏字段) for input_tag in post_form.find_all("input"): input_name = input_tag.get("name") input_value = input_tag.get("value", "") if input_name: form_data[input_name] = input_value # 手动填入你的账号密码 form_data["username"] = "你的账号" form_data["password"] = "你的密码" # 确定表单提交的目标URL form_action = post_form.get("action") if form_action.startswith("/"): # 相对路径转绝对路径 login_submit_url = f"{login_page_url.split('://')[0]}://{login_page_url.split('://')[1].split('/')[0]}{form_action}" else: login_submit_url = form_action if form_action.startswith("http") else f"{login_page_url}/{form_action}" # 提交登录请求 login_response = session.post(login_submit_url, data=form_data, headers=headers) # 验证登录是否成功:可以访问一个需要登录才能看的页面 target_data_url = "你要抓取数据的目标URL" data_response = session.get(target_data_url, headers=headers) # 处理返回的数据,比如解析HTML或者提取内容 print(data_response.text)
第三步:处理页面里的JS逻辑
你给出的页面里的JS不用太担心:
- 防止iframe的代码:脚本直接请求页面,不会涉及iframe嵌套,完全不影响
postSubmit()函数:本质就是触发表单提交,咱们用POST请求模拟这个动作就够了,不用去执行JS
几个要注意的坑
- 隐藏字段不能硬编码:有些JSP页面会生成随机的CSRF令牌,必须从登录页面的HTML里动态提取,不然登录会失败
- Cookie必须用Session维护:单独的GET/POST请求不会保存Cookie,用
requests.Session()才能保持登录状态 - 模拟浏览器标识:有些服务器会拦截没有User-Agent的请求,所以一定要加headers里的User-Agent
- 如果有验证码:那得额外处理,比如用OCR工具或者打码平台,但你给的代码里没提这个,暂时先忽略
内容的提问来源于stack exchange,提问作者ankur
相关产品推荐
相关产品推荐

