Python Selenium模拟登录成功后,使用此cookie、利用requests库进行get时,提示“非法登陆”。

发布于 2022-09-07 12:42:47 字数 2657 浏览 20 评论 0

一. 步骤概述

 a. 模拟登录学校选课系统(使用Selenium库登陆http://xk.suibe.edu.cn/xsxk/login.xk)
 b. 取得cookie后传入requests的session中。(参考博客:https://blog.csdn.net/big__v/article/details/78151940)
 c. 使用requests库中的post提交选课序号至http://xk.suibe.edu.cn/xsxk/xkOper.xk
 d. 完成选课

二. 手动登录时浏览器截图(Chrmoe)

1. 登录时request headers(这里有一个cookie就是之后会出错的地方。)

图片描述

2. 登录时post

图片描述
三. 出错情况概述

1. 如果手动用浏览器登录并复制上述cookie直接进入get的headers里,get命令能够成功完成,并提示选课成功。
2. 如果把手动用浏览器登录这一步用Selenium模拟登录代替,并直接将cookies传入requests的session中,再次尝试gett就会报出“非法进入”。

四. 问题排除

1. 第二步get推测没有问题,因为复制浏览器中cookie直接进入get的headers里,post命令能够成功完成。
2. 不是cookie格式问题,因为格式问题会导致报错“登录过期”,而不是“非法登录”。

五. 问题猜测

  1. 猜测可能cookie进行过加密
  2. 猜测存在其他反爬虫手段
  3. 猜测cookie存在时效性

六. 完整代码如下

# -*- coding:utf-8 -*-
from selenium import webdriver
import requests
from selenium.webdriver.support.wait import WebDriverWait

# 添加选课序号
codes = []
while True:
    code = raw_input(u'请输入选课序号(输入回车结束):')
    if code != '':
        codes.append(code)
    else:
        break

# 开始登录
driver = webdriver.Chrome()
url = "http://xk.suibe.edu.cn/xsxk/login.xk"
s = requests.session()
while True:
    driver.get(url)
    name_input = driver.find_element_by_id('username')  # 找到用户名的框框
    pass_input = driver.find_element_by_id('password')  # 找到输入密码的框框
    login_button = driver.find_element_by_xpath('//*[@id="loginForm"]/table/tbody/tr[4]/td[2]/input[1]')
    name_input.clear()
    name_input.send_keys('1*******')  # 填写用户名
    pass_input.clear()
    pass_input.send_keys('********')  # 填写密码
    WebDriverWait(driver, 300000000).until_not(lambda x: x.find_element_by_id("verifyCode").is_displayed())  # 等待直到登录成功
    if u'夜大学' in driver.page_source:
        print u"登录成功!"
        selenium_cookies = driver.get_cookies()  # 把selenium获取的cookies保存到变量,备用。
        # print(selenium_cookies)
        driver.close()
        break
    else:
        driver.close()

# 处理cookie
s = requests.Session()
for i in selenium_cookies:
    requests.utils.add_dict_to_cookiejar(s.cookies, {i['name']: i['value']})

# 以下用post提交选课
for code in codes:
    info = {'method': 'handleQxgxk',
            'jxbid': '201820191' + code,
            'glJxbid': '',
            'xyjc': ''}
    r = s.get('http://xk.suibe.edu.cn/xsxk/xkOper.xk', params=info)
    if 'false' in r.text:
        print '选课序号:%s,选课失败。' % code, r.text
    else:
        print '选课序号:%s,选课成功。' % code

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

情域 2022-09-14 12:42:48

问题解决了——是存在第二次验证的问题(我也不知道叫什么,姑且这么叫它,如有不对请各位在评论指出。)
一开始猜测是编码有问题——毕竟python2.7的编码实在是让人有些头疼。各种调试之后发现并不是编码问题。
继续从头分析浏览器后发现这么一个get,如图:
图片描述
猜测这个是“二次认证”。
果断在代码中加入如下代码:

check = s.get('http://xk.suibe.edu.cn/xsxk/xkjs.xk?pyfaid=04265&jxqdm=2&data-frameid=main&data-timer=2000&data-proxy=proxy.xk', headers=headers)

然后就成功了。

月竹挽风 2022-09-14 12:42:48

既然是 POST 表单,应该将 session.get() 改成 session.post(),同时 params= 的值改向 data=

另外,可以开启 wireshark 抓包确认浏览器最后一次得到的 cookie,与你用 requests 发出去的一致。

若仍然不奏效,尝试添加 User-AgentReferer 请求头参数到 session.post()

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文