如何用Python模拟登录含安全提问的网站并编写爬虫?以人大经济论坛为例
模拟登录带安全提问的论坛步骤
嘿,这个带自定义安全提问的模拟登录场景其实挺常见的,咱们一步步来搞定它:
1. 先搞清楚登录需要提交的核心参数
从你贴的网页代码能看出来,登录时后端需要的参数有这几个:
username:用户名/手机号password:密码questionid:安全提问的ID(对应下拉选项里的v属性,比如选「母亲的名字」就是1)answer:对应提问的答案
另外要注意,很多网站会在登录页面设置隐藏的CSRF Token(你贴的代码里没显示,但最好用浏览器开发者工具抓包确认下),如果有的话,要把这个参数也加到表单里。
2. 用Session保持会话
模拟登录一定要用requests.Session(),它会自动帮你管理Cookie,避免每次请求都重新处理会话状态。
3. 编写核心代码示例
下面是一个基础的实现框架,你可以根据实际情况调整:
import requests # 初始化会话,模拟浏览器请求头 session = requests.Session() 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' } # 先访问登录页面,获取必要的Cookie和可能的CSRF Token login_page_url = 'http://bbs.pinggu.org/' # 替换成实际的登录页面URL session.get(login_page_url, headers=headers) # 构造登录表单数据,替换成你自己的账号信息 login_data = { 'username': '你的用户名或手机号', 'password': '你的密码', # 如果网站密码是加密的,要先抓包看加密方式再处理 'questionid': '1', # 替换成你账号对应的安全提问ID,比如母亲的名字是1 'answer': '你的答案' } # 发送登录请求,注意替换成实际的登录接口URL(通过抓包获取) login_api_url = 'http://bbs.pinggu.org/login.php' # 示例URL,以实际抓包为准 response = session.post(login_api_url, data=login_data, headers=headers) # 验证登录是否成功:访问一个需要登录的页面,检查返回内容 test_url = 'http://bbs.pinggu.org/home.php' # 示例页面,替换成实际需要登录的页面 test_response = session.get(test_url, headers=headers) if '你的用户名' in test_response.text: print('登录成功啦!') else: print('登录失败,检查参数或者密码加密方式哦')
4. 处理可能的坑点
- 密码加密:如果抓包发现提交的密码不是明文,你需要找到网站的加密JS代码,要么在Python里实现相同的加密逻辑,要么用
execjs库调用JS代码加密。 - 验证码:如果网站有验证码,你可能需要用OCR工具(比如pytesseract)或者第三方打码平台来识别验证码,把验证码参数也加到登录表单里。
- 请求头完整性:有些网站会校验Referer、Origin等请求头,你可以从浏览器抓包的请求头里把这些字段也加到headers里,提高模拟的真实性。
5. 关于前端下拉框的说明
你看到的那个用div模拟的下拉框,本质上只是前端UI交互,后端根本不关心你有没有点击下拉框,只要你提交的questionid和answer是正确的就行,所以不用去模拟点击下拉的操作,直接填正确的参数就好。
内容的提问来源于stack exchange,提问作者Eric




