selenium爬虫获取自己的课表信息
方正教务系统做的还挺安全!!! 密码用rsa加密,还带了token防御
一开始,我尝试用 request.post()表单提交数据,没用,看了一下网络请求,表单提交了4个数据,如下图:
也就是说,我们提交给后台的密码是通过rsa加密,把我给整蒙了,然后就继续看网络请求
用fiddler把我眼睛都看疼了,终于找到一个url是这样的: https://jwpd.webvpn.jsei.edu.cn/xtgl/login_getPublicKey.html?time=1654150370993&_=1654150370936
正好是公钥信息,然后我就寻思看看他是怎么加密的,看一下代码文件,果断放弃这个方法。。。,因为我不会,再加上token我也搞不定
下面就到了正题,用selenium模拟登陆,然后再获取想要的信息
大概步骤就是:先设置浏览器一些东西,然后selenium定位文本框位置,填充账号密码信息,登陆,然后url跳转到课表信息,然后用selenium在设置下当前第几周之类的信息,获取到当前周次的课表源码之后,分析一下页面,用bs4或者re慢慢提取到今天的课表信息
完整代码
import math
import time
import datetime
import requests
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.select import Select
import re
from bs4 import BeautifulSoup# 进入浏览器设置
def webSetting():global browseroptions = webdriver.ChromeOptions()# 设置中文options.add_argument('lang=zh_CN.UTF-8')# 取消下面一行注释设置无头,也就是不显示浏览器了options.add_argument('--headless')# 创建浏览器对象browser = webdriver.Chrome(options=options)# 规避机器人检测browser.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {"source": """Object.defineProperty(navigator, 'webdriver', {get: () => undefined})"""})return browser# 登陆
# 我们学校的很怪,需要先在今日校园里的页面登陆,然后再到方正的页面登陆一下
#
def login(url,user,pwd):driver = webSetting()driver.get(url)# 表单提交信息username = driver.find_element(By.ID, 'username')username.send_keys(user)password = driver.find_element(By.ID, 'password')password.send_keys(pwd)submit = driver.find_element(By.CLASS_NAME, 'auth_login_btn,primary,full_width')submit.click()time.sleep(1) # 避免被检测# 表单提交信息yhm = driver.find_element(By.ID, 'yhm')yhm.send_keys(user)mm = driver.find_element(By.ID, 'mm')mm.send_keys(pwd)dl = driver.find_element(By.ID, 'dl')dl.click()time.sleep(1)return driver# 获取到本周的课表页面源码
def seleniumGetPage(url,user,pwd,week):driver = login(url,user,pwd)# 登陆成功,跳转到本周课表页面driver.get('https://jwpd.webvpn.jsei.edu.cn/kbcx/xskbcxZccx_cxXskbcxIndex.html?gnmkdm=N2154&layout=default&su='+user)#设置学期和周次信息selectxqm = driver.find_element(By.ID,'xqm')Select(selectxqm).select_by_visible_text('2')selectzs = driver.find_element(By.ID,'zs')Select(selectzs).select_by_visible_text(str(week))time.sleep(1)return driver.page_source# 查询自己的学期成绩页面源码
def getScore(url,user,pwd):driver = login(url, user, pwd)# 登陆成功,跳转到成绩查询页面driver.get('https://jwpd.webvpn.jsei.edu.cn/cjcx/cjcx_cxDgXscj.html?gnmkdm=N305005&layout=default&su=' + user)time.sleep(2)select = driver.find_element(By.NAME, 'currentPage')Select(select).select_by_visible_text('5000')search = driver.find_element(By.ID, 'search_go')# document.getElementById("idName").innerHTML="改变后的内容"js = 'window.onload=function(){document.getElementById("xnm_chosen")[0].getElementsByClassName ("chosen-single")[0]' \'.getElementsByTagName ("span").innerHTML="全部";}'selectxnm = driver.find_element(By.ID, 'xnm_chosen')\.find_element(By.CLASS_NAME,'chosen-single').find_element(By.TAG_NAME,'span')driver.execute_script(js,selectxnm)#Select(selectxnm).select_by_visible_text('全部')time.sleep(1)js1 = 'window.onload=function(){document.getElementById("xqm_chosen")[0].getElementsByClassName ("chosen-single")[0].' \'getElementsByTagName ("span").innerHTML="全部"}'selectxqm = driver.find_element(By.ID, 'xqm_chosen')\.find_element(By.CLASS_NAME,'chosen-single').find_element(By.TAG_NAME,'span')#Select(selectxqm).select_by_visible_text('全部')driver.execute_script(js1,selectxqm)time.sleep(1)search.click()time.sleep(1)#print(driver.page_source)# 获取今天是周几
def getToday():y = datetime.datetime.now().yearm = datetime.datetime.now().monthd = datetime.datetime.now().daylis = [1,2,3,4,5,6,7,]dic = dict(enumerate(lis))w = datetime.date(y,m,d)return dic[w.weekday()]#获取当前第几周
def getWeeks(date):#获取今天日期y = datetime.datetime.now().yearm = datetime.datetime.now().monthd = datetime.datetime.now().daytoday = str(y)+'-'+str(m)+'-'+str(d)#算出天数startTime = datetime.datetime.strptime(date,"%Y-%m-%d")endTime = datetime.datetime.strptime(today, "%Y-%m-%d")day = (endTime - startTime).days#算出周次if(day % 7 == 0):week = day/7+1else:week = math.ceil(day/7)return int(week)# 获取当日课表
def getLessonList(r,gt):# 采用bs4获取元素soup = BeautifulSoup(r, features="lxml")tbody = soup.select('#table_tb')count = 0# 由于第10节课开始上的课在table中的特殊性,需要计算本周在当天之前有几次是第九节开始上的for i in range(1, gt):id = '#' + 'td_' + str(i) + '-9'if (len(tbody[0].select(id)[0].text) > 0):count += 1# 用于存储课程信息lessonList = []for info in tbody[0].select('td'):#元素中id:td_3-1 意思是周三第一节 下同if (info.get('id') == 'td_' + str(gt) + '-1' and len(info.text) > 0):lessonList.append(info.text + "(08:30~10:05)")if (info.get('id') == 'td_' + str(gt) + '-3' and len(info.text) > 0):lessonList.append(info.text + "(10:20~11:55)")if (info.get('id') == 'td_' + str(gt) + '-5' and len(info.text) > 0):lessonList.append(info.text + "(14:00~15:35)")if (info.get('id') == 'td_' + str(gt) + '-7' and len(info.text) > 0):lessonList.append(info.text + "(15:50~17:25)")if (info.get('id') == 'td_' + str(gt) + '-9' and len(info.text) > 0):lessonList.append(info.text + "(17:30~19:45)")# 元素中id: td_(gt-count)-10 第十节开始的课特殊性,要减去上面的countif (info.get('id') == 'td_' + str(gt - count) + '-10' and len(info.text) > 0):lessonList.append(info.text + "(19:00~20:40)")return lessonList# 打印课程信息
def printLesson(r,gt):List = getLessonList(r, gt)print("今天一共"+str(len(List))+"节课")for info in List:print(info)if __name__ == '__main__':timeStr = int(time.time()*1000)url = 'https://jwpd.webvpn.jsei.edu.cn/xtgl/index_initMenu.html?jsdm=&_t='+str(timeStr)user = '你的学号'pwd = '你的密码'# getScore(url,user,pwd)# 第一周周一2022-02-14StartWeek = '2022-02-14'# 本周周次week = getWeeks(StartWeek)# 今天周几gt = getToday()# 获取课表页面源码r = seleniumGetPage(url, user, pwd, week)# 获取今天的课表信息printLesson(r,gt)
自己用多个账号测试了一下
同样的道理,选课,查成绩 都应该能通过这样的方法操作
selenium爬虫获取自己的课表信息相关推荐
- python selenium爬虫代码示例_python3通过selenium爬虫获取到dj商品的实例代码
先给大家介绍下python3 selenium使用 其实这个就相当于模拟人的点击事件来连续的访问浏览器.如果你玩过王者荣耀的话在2016年一月份的版本里面就有一个bug. 安卓手机下载一个按键精灵就可 ...
- 某投诉网站爬虫-获取对应的投诉信息
某投诉网站爬虫-获取对应的投诉信息 此爬虫原本是一道面试题,说难不难,说简单也不简单:因为站点的反爬机制,我现在也没摸清楚,不过目前看来应该是你在一段时间内访问数据超过对应的数量就会封ip 5-10分 ...
- python爬虫获取肯德基门店信息
python爬虫获取肯德基门店信息 1.在谷歌浏览器中打开肯德基官网,进入餐厅查询页面 2.在搜索框中输入地区并按f12打开开发者工具 发现已经抓取到了一条Ajax请求,可以从中获取请求的url,以及 ...
- div中内容靠右_python读取excel的公司名称信息,并爬虫获取公司的经营范围信息,回填到excel中...
大家总说,python今天学明天忘,没有实际操作,想要知道哪里有练手的机会.其实你要善于发现问题,捕捉问题.不管是你看到文章中的一些案例,还是微信群友问的一个问题.你都需要仔细思考,如果是你做你应该怎 ...
- Java用Jsoup开发爬虫获取双色球开奖信息
想要获取双色球开奖信息,利用爬虫无疑是个比较方便的方式,针对简单的功能,除了python以外,Java也有比较便捷的方式--Jsoup 要获取指定位置的内容,需要知道该内容的标签,比如红球的标签是'l ...
- python读取excel的公司名称信息,并爬虫获取公司的经营范围信息,回填到excel中
本文作者:是老王吖 原文链接:https://blog.csdn.net/jdkss/article/details/106077755?utm_source=app 1.项目需求 项目需求:这个问题 ...
- Python爬虫获取斗鱼主播信息
感谢参考原文-http://bjbsair.com/2020-03-27/tech-info/7150.html 下面我们进入正题 首先 我们进入斗鱼的官网 我发现首页是一些推荐的主播,并不全面,不能 ...
- 微博数据爬虫——获取用户微博相关信息(四)
任务:给定u_id,获取用户每条微博的mid.发布时间.照片数.@数.链接数 1.获取微博信息 查看网页源代码,发现数据保存在js中 利用正则匹配可以实现获取单条微博全部信息 add = urllib ...
- 利用Python爬虫获取招聘网站职位信息
当你学会使用Python爬虫之后就会发现想要得到某些数据再也不用自己费力的去寻找,今天小千就给大家介绍一个很实用的爬虫案例,获取Boss直聘上面的招聘信息,同学们一起来学习一下了. Boss直聘爬虫案 ...
最新文章
- 程序员新手 0年份等级 指导(一) 开发人员IT架构总览
- 找圈圈 (BFS简单运用)
- python怎么显示结果_python中plot实现即时数据动态显示方法
- JAVA 海啸_java线程总结
- 关于SAP ABAP字符变量和字符串变量字符个数的一个知识点,和一个血案
- linux shell之控制台打印各种颜色字体和背景
- Tensorflow学习—— 预创建的 Estimator
- 添加谷歌账户显示与服务器,解决添加google同步帐户出错竟然可以这般简单!
- 【库】JavaScript——滚动条( 不是很完善 )
- Java降落伞_使用DJI Onboard SDK进行降落伞部署
- 软件的生命周期与特点
- jenkins+docker进行coverity检查自动构建
- 后悔没早知道这款UI自动化测试框架,让你写用例像口语化一样简单
- gateway oauth2 对称加密_深入理解Spring Cloud Security OAuth2及JWT
- VC++6.0的简单使用!(保姆级)
- 家乐福中国独立上市,是苏宁的一颗“定心丸”吗?
- 面向对象程序设计(c++)面试常问——for考研复试面试
- 第九十一章 SQL函数 LOWER
- C++第5周任务1-4使用默认参数的构造函数,不给定实参时,默认边长为1
- 【总结】解决Linux机器重装后-免密登录报错问题
热门文章
- Mac 命令行方式解压设置密码的ZIP
- i黑马 | 一览群智胡健:先成为头牌,再造AI软件生态
- 能源系统建模:安装和使用gcamdata_R package构建GCAM模型输入文件系统
- Excel只复制有公式的单元格进行批量的求和操作
- 黑龙江省企业及个人网站备案要求
- HTML+CSS 实现下拉三级菜单
- unix服务器日志文件,16.6.8 配置UNIX系统日志服务器
- org.elasticsearch.ElasticsearchException: not all primary shards of
- 常用设计模式C++实现(一)
- pdf合同模板创建与生成