Python新手求助:如何用账号密码及Token爬取登录保护网站?
解决登录爬虫失败的问题
以下是针对性的排查方向和修正方案:
1. 核心问题:Session未复用
你之前用独立的requests.get()获取token,再用requests.session()发起登录请求,这会导致两次请求的Cookie不共享,网站的CSRF验证直接失败。必须在同一个Session内完成「获取登录页→提取token→提交登录」的完整流程。
2. 严格匹配表单参数名
从页面源码的登录表单中,每个input标签的name属性必须和payload的键完全对应:
- 你提取的token来自
name="_token"的输入框,所以payload里的键必须是'_token',而非'token' - 用户名、密码的键名也要和页面里的
name值完全一致,比如页面里用户名输入框是name="username",就用'username';如果是name="name"就用'name'
3. 确认登录请求的目标URL
检查登录表单的action属性,确认POST请求的URL是否正确(可能和登录页URL一致,也可能是其他接口地址)。
修正后的代码示例
from bs4 import BeautifulSoup import requests login_page_url = 'https://aff.ven-door.com/login' target_url = 'https://aff.ven-door.com/products' with requests.session() as s: # 1. 在同一个Session内获取登录页,保存必要的Cookie和Token response = s.get(login_page_url) soup = BeautifulSoup(response.content, 'html.parser') token = soup.find('input', {'name':'_token'})['value'] # 2. 构造完全匹配表单的Payload payload = { '_token': token, # 键名与页面input的name严格一致 'username': '你的实际用户名', # 替换为真实用户名,键名对应页面的name值 'password': '你的实际密码' # 替换为真实密码,键名对应页面的name值 } # 3. 提交登录请求(URL需与表单action一致) login_response = s.post(login_page_url, data=payload) # 调试用:打印响应状态码和部分内容,查看登录反馈 print(login_response.status_code) print(login_response.text[:500]) # 4. 访问目标页面 logged_in_response = s.get(target_url) soup = BeautifulSoup(logged_in_response.content, 'html.parser') # 验证登录结果:打印页面标题 print(soup.title.text)
额外调试技巧
- 打开浏览器开发者工具(F12),切换到「网络」标签,手动登录一次,观察登录请求的「表单数据」,对比你的payload是否完全一致(包括键名、大小写)
- 部分网站需要特定请求头,可在Session中添加:
s.headers.update({ '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' }) - 如果登录失败,直接查看响应内容里的提示(比如用户名密码错误、Token无效),针对性调整
内容的提问来源于stack exchange,提问作者M33G0
相关产品推荐
相关产品推荐

