Python Selenium模拟登录成功后,使用此cookie、利用requests库进行get时,提示“非法登陆”。
一. 步骤概述
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格式问题,因为格式问题会导致报错“登录过期”,而不是“非法登录”。
五. 问题猜测
- 猜测可能cookie进行过加密
- 猜测存在其他反爬虫手段
- 猜测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
回答:
问题解决了——是存在第二次验证的问题(我也不知道叫什么,姑且这么叫它,如有不对请各位在评论指出。)
一开始猜测是编码有问题——毕竟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)
然后就成功了。
回答:
既然是 POST 表单,应该将 session.get()
改成 session.post()
,同时 params= 的值改向 data=。
另外,可以开启 wireshark 抓包确认浏览器最后一次得到的 cookie,与你用 requests 发出去的一致。
若仍然不奏效,尝试添加 User-Agent 和 Referer 请求头参数到 session.post()
。
以上是 Python Selenium模拟登录成功后,使用此cookie、利用requests库进行get时,提示“非法登陆”。 的全部内容, 来源链接: utcz.com/a/165776.html