使用requests.post登录网站失败,需正确定位表单元素求助
别担心,刚接触网页抓取遇到这种问题太正常了!我来一步步帮你理清怎么用requests搞定登录~
第一步:从HTML里挖登录表单的核心信息
你需要先从给出的HTML片段里锁定这几个关键内容:
- 表单提交地址:找到
<form>标签里的action属性值,比如<form action="/api/login" method="post">,这里的/api/login就是提交路径,要和网站的基础域名拼接成完整登录URL(比如网站是https://xxx.com,那完整URL就是https://xxx.com/api/login) - 所有必填表单字段:逐个看
<input>标签的name属性——用户名可能是name="user_account",密码是name="user_pwd",还有很多网站会有隐藏的CSRF令牌(比如<input name="csrf_token" type="hidden" value="abc123">),这些字段都必须包含在你要提交的表单数据里
第二步:用requests构造登录请求
拿到上面的信息后,就可以写代码了,核心是用requests.Session()维持会话(这样登录后抓取其他页面时能保持登录状态),步骤如下:
import requests from lxml import etree # 用你熟悉的XPath来提取字段,无缝衔接 # 初始化会话,自动保存登录状态 session = requests.Session() # 1. 先访问登录页面,获取必要的隐藏字段(比如CSRF令牌) login_page_url = "https://xxx.com/login" # 替换成实际的登录页面URL page_response = session.get(login_page_url) html_tree = etree.HTML(page_response.text) # 用XPath提取CSRF令牌,根据你的HTML结构调整路径 csrf_token = html_tree.xpath('//input[@name="csrf_token"]/@value')[0] # 2. 组装表单数据,所有input的name对应填值 form_data = { "user_account": "你的用户名", "user_pwd": "你的密码", "csrf_token": csrf_token, # 如果没有这个字段就删掉 # 其他必填字段比如"remember_me": "1"之类的也要加上 } # 3. 发送登录请求到完整的提交URL login_submit_url = "https://xxx.com/api/login" # 替换成form的action拼接后的完整URL login_response = session.post(login_submit_url, data=form_data) # 验证登录是否成功:访问需要登录的页面,看返回内容是否符合预期 target_page = session.get("https://xxx.com/需要登录的目标页面") print(target_page.text)
第三步:常见问题排查
- 找不到form的
action?打开浏览器开发者工具(F12),切换到Network标签,手动登录一次,看请求列表里的Request URL就是完整的登录地址 - 提交后还是登录失败?检查表单数据有没有漏字段,或者给请求加个浏览器的
User-Agent头(模拟真实浏览器请求),比如在post里加: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"} login_response = session.post(login_submit_url, data=form_data, headers=headers) - 要是能把HTML片段里
<form>标签的完整内容(包括里面所有input)贴出来,我能帮你更精准地定位问题~
内容的提问来源于stack exchange,提问作者sanwall
相关产品推荐
相关产品推荐

