天天看点

Python模拟登录青果教务系统

Python模拟登录青果教务系统

找了本书:《python网络数据采集》准备学一点 python 爬虫,记录一下学到的东西吧

详细知识就不说了,主要记录一下后面使用 webdriver 模拟登陆

需要有以下环境准备:

1、requests库

2、selenium库(版本在3.8.0,高了不支持phantonjs)

3、chromedriver(对应好谷歌浏览器版本,放在谷歌浏览器安装目录,然后把这个目录添加到环境变量)

Python模拟登录青果教务系统

代码部分:

from bs4 import BeautifulSoup
from selenium import webdriver
import requests
import time
from selenium.webdriver.common.keys import Keys
#这个库主要是用来模拟按键的

#browser=webdriver.PhantomJS(executable_path='D:/software/phantomjs-2.1.1-windows/bin/phantomjs')
#browser.get("http://jwxt.sdaeu.edu.cn/jwweb/home.aspx")
#为了验证,暂时不用无界

#chromeOptions = webdriver.ChromeOptions()
#chromeOptions.add_argument("--proxy-server=http://127.0.0.1:8080")
#给chrome设置代理

#browser = webdriver.Chrome(chrome_options = chromeOptions)
browser = webdriver.Chrome()
browser.get('http://jwxt.sdaeu.edu.cn/jwweb/home.aspx')
#打开chrome

time.sleep(2)
browser.switch_to_frame('frm_login')
#跳转表单,因为网页上有多个frame,每个都是独立的
#所以需要先找到登录用的那一个frame

browser.find_element_by_id("txt_sdertfgsadscxcadsads").click()
#要点一下才能出现更换验证码的链接

jpg=browser.find_element_by_id('imgCode')
img_src=jpg.get_attribute("src")
#拿到更换验证码url

#在这里应该使用browser的ASP.NET_SessionId的值
cookie_bro = browser.get_cookies()
#获取browser的cookie字典
#print(cookie_bro)
cookie1=cookie_bro[0]['value']
print("\n当前cookie为: "+cookie1)

headers1={
  'Host':'jwxt.sdaeu.edu.cn',
  'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36',
  'Accept':'image/webp,image/apng,image/*,*/*;q=0.8',
  'Referer':'http://jwxt.sdaeu.edu.cn/jwweb/_data/login_home.aspx',
  'Accept-Encoding':'gzip, deflate',
  'Accept-Language':'zh-CN,zh;q=0.9',
  'Cookie':'myCookie=;'+'ASP.NET_SessionId='+cookie1,
  'Connection':'close'
}
#header头要全一些,之前只用cookie请求还是不行

#proxy1={"http":"http://127.0.0.1:8080"}
#r=requests.get(img_src,headers=headers1,proxies=proxy1)
#requests使用代理

r=requests.get(img_src,headers=headers1)
img_content=r.content
print("[*]正在下载验证码...\n")
with open('check.jpg','wb') as f:
  f.write(img_content)

#提前填写学号和密码
browser.find_element_by_id("txt_asmcdefsddsd").send_keys("学号")
browser.find_element_by_id("txt_asmcdefsddsd").send_keys(Keys.TAB)
browser.find_element_by_id("txt_pewerwedsdfsdff").send_keys("密码")

#暂时需要手动输入
code = input("[*]请输入验证码: ")
browser.find_element_by_id("txt_sdertfgsadscxcadsads").send_keys(code)
browser.find_element_by_id("btn_login").click()

#browser.close()
#关闭浏览器           

复制

最后说一下验证码的事情:

当去访问教务处网站(简称网站)的时候,是没有 cookie 的

Python模拟登录青果教务系统

这时候会返回一个 cookie,“set_cookie”,服务器就是靠这个 cookie 知道是你的

Python模拟登录青果教务系统

当你去请求更换验证码的时候也是要带着这个 cookie 去请求,浏览器才能知道是你更换验证码,而不是一个新的访问者

Python模拟登录青果教务系统
Python模拟登录青果教务系统

而且 url 后面那个 ?t=208 参数,即使是相同的,返回的验证码也不是相同的

所以当你带着 cookie 去请求验证码的时候,实际上你应该输入的验证码,已经从浏览器上显示的,变成了请求之后下载下来的了

其实使用 webdriver 直接去请求链接也就不用管什么 cookie 了,毕竟一直就是那个浏览器,但是保存图片的时候有点编码之类的问题,也没解决就直接用 requests 了

Python模拟登录青果教务系统

另外,使用在 github 上其他人训练好的验证码识别模块整合了一下,但是识别率实在有点低

使用的识别模块

https://github.com/bieberg0n/jwgl-ocr           

复制

整理好的可以自动识别的代码:

https://github.com/yichen115/python-qgjwxt           

复制