未见其人,先闻其声

==正如上述,点击运行之后,全部自动化处理,这逼格一下就上去了。==

代码实现

一.准备工作

1.下载驱动

本人使用Chrome,所以贴出来ChromeDriver,其他浏览器请自行百度,大版本对即可,我的Chrome是85.0.4183.102,但使用85.0.4183.87可以正常使用

此处内容需要评论回复后(审核通过)方可阅读。

下载路径 : http://chromedriver.storage.googleapis.com/index.html

2.环境安装

pip install selenium # 和其他库类似,这个selenium一定不能拼错

二.导入模块

首先你当然得导入webdriver,etree和xlwt三个模块。分别对应自动化处理浏览器登录和点击、xpath分析网页元素和持久化存储。

from selenium import webdriver
from lxml import etree
from time import sleep  # 时间暂停
import xlwt

三.自动化登录

1.实例化浏览器对象

bro = webdriver.Chrome('executable_path='./chromedriver.exe)

2.指定url进行访问

url = 'https://jwcnew.webvpn.nefu.edu.cn/dblydx_jsxsd/'
bro.get(url=url)

3.获取账号和密码标签并登录(通过selenium)

可见它账号id标签为un(可以使用其他标签定位)

密码标签为pd

登录按钮的class标签为login_box_landing_btn

account_input = bro.find_element_by_id('un')  # 定位账号
password_input = bro.find_element_by_id('pd')  # 定位密码
account_input = bro.send_keys('2019214286')  # 输入账号
password_input = bro.send_keys('xxxxxxxx') # 输入密码
login = bro.find_element_by_class_name('login_box_landing_btn')  # 定位登录
login.click()  # 字如其意,点击登录按钮

登陆完之后,他会转到另一个登录界面

此时再次使用上面用到的定位然后输入就不在啰嗦

account_input_two = bro.find_element_by_name('USERNAME')  # 定位账号
password_input_two = bro.find_element_by_name('PASSWORD')  # 定位密码account_input_two.send_keys('2019214286')  # 输入账号
password_input_two.send_keys('xxxx')  # 输入密码吗login_three = bro.find_element_by_id('btnSubmit')  # 定位登录按钮
login_three.click()  # 登录到教务管理系统个人界面

4.获取课程表界面

观看上图,可见我的课表就在第三排第一个

通过标签定位,然后click即可

login_four = bro.find_element_by_class_name('block7')
login_four.click()  # 进入课程表界面

四.解析课程表界面(通过xpath)

1.获取页面源码

page_text = bro.page_source  # 获取页面源码
tree = etree.HTML(page_text)  # 创建一个etree对象

2.获取具体内容

看上图,感觉挺简单的,都在tbody标签下,也涉及不到iframe。开整!!

1.第一行

第一行星期还算简单,都在相同标签下,见图

first_line_list = tree.xpath('//tbody/tr[1]/th/text()')  # 获取第一行
2.第一列

原本我想着,他会把下面所有内容都放到一个标签下,直接解析://tbody/tr/div/text(), 查看源码才发现,他是把第一列都放在th标签下,而具体课表都在div标签下,直接见图:

所以第一列也是需要单独解析出来

又因为第一列的元素都不在一个标签下,所以需要一个range循环

first_row_list = []  # 创建一个空列表
for i in range(7):first_row_list.append(tree.xpath('//tbody/tr[i+2]/th/text()')[0])

如果真的这么写的话,就会出现下面这种情况

我也不知道为什么tr标签不能带入未知量

==所以正确获取第一列的方法是== 虽然有点笨,但结果是对的

first_row_list = []
first_row_list.append(tree.xpath('//tbody/tr[2]/th/text()')[0])
first_row_list.append(tree.xpath('//tbody/tr[3]/th/text()')[0])
first_row_list.append(tree.xpath('//tbody/tr[4]/th/text()')[0])
first_row_list.append(tree.xpath('//tbody/tr[5]/th/text()')[0])
first_row_list.append(tree.xpath('//tbody/tr[6]/th/text()')[0])
first_row_list.append(tree.xpath('//tbody/tr[7]/th/text()')[0])
first_row_list.append(tree.xpath('//tbody/tr[8]/th/text()')[0])
3.课表具体内容
content_list = tree.xpath('//tbody/tr/td/div[2]/text()')

其实在爬取具体课表的时候,发现了一个好玩的

虽然我不懂前端,但看这也是可以知道当初学校编写课表的时候第一次没考虑到老师,然后又写了一个div,这也是为什么我上面写div[2]

到此为止所有课表相关的数据爬取下来了,下一步就是保存了

五.持久化存储

如果用的是flake8,就会发现上面有一个会一直报错,

'xlwt' imported but unused

import xlwt  # 这是因为下面还没用到

1.创建Workbook

book = xlwt.Workbook(encoding='unicode')  # 第一次我用的是utf-8,会报错,就换了
sheet = book.add_sheet(u'课程表', cell_overwrite_ok=True)

2.保存课表

和上面对应,分别保存第一行,第一列和课表具体内容

for i in range(8):sheet.write(0, i, first_line_list[i])  # 保存第一行
for j in range(7):sheet.write(j+1, 0, first_row_list[j])  # 保存第一列
for i in range(7):sheet.write(1, i+1, content_list[i])sheet.write(2, i+1, content_list[7+i])sheet.write(3, i+1, content_list[14 + i])sheet.write(4, i+1, content_list[21+i])sheet.write(5, i+1, content_list[28+i])sheet.write(6, i+1, content_list[35+i])

3.储存位置

book.save('./课程表.xls')  # 我直接在本目录下保存,第一次用xlsx报错,就换成xls...

关闭selenium

sleep(4)  # 让浏览器暂停一下
bro.quit()  # 退出模拟浏览器

到此便完成全部工作,展示一下结果

程序代码

from selenium import webdriver
from lxml import etree
from time import sleep
import xlwt
import xdlj# 1.实现从登录到课程表界面开始
bro = webdriver.Chrome(executable_path='chromedriver.exe')url = 'https://jwcnew.webvpn.nefu.edu.cn/dblydx_jsxsd/'
bro.get(url=url)# 获取登录账号和密码的位置
account_input = bro.find_element_by_id('un')
password_input = bro.find_element_by_id('pd')# 输入账号密码
account_input.send_keys('2019214286')
password_input.send_keys('xxxxxxxx')# 点击立即到教务处登录
login = bro.find_element_by_class_name('login_box_landing_btn')
login.click()account_input_two = bro.find_element_by_name('USERNAME')
password_input_two = bro.find_element_by_name('PASSWORD')account_input_two.send_keys('2019214286')
password_input_two.send_keys('xxxxxxxxx')login_three = bro.find_element_by_id('btnSubmit')
login_three.click()  # 登录教务处login_four = bro.find_element_by_class_name('block7')  # 进入课程表界面
login_four.click()# 2.解析课程表界面,并保存到本地
page_text = bro.page_source
tree = etree.HTML(page_text)
first_line_list = tree.xpath('//tbody/tr[1]/th/text()')  # 获取第一行星期内容
first_row_list = []
first_row_list.append(tree.xpath('//tbody/tr[2]/th/text()')[0])
first_row_list.append(tree.xpath('//tbody/tr[3]/th/text()')[0])
first_row_list.append(tree.xpath('//tbody/tr[4]/th/text()')[0])
first_row_list.append(tree.xpath('//tbody/tr[5]/th/text()')[0])
first_row_list.append(tree.xpath('//tbody/tr[6]/th/text()')[0])
first_row_list.append(tree.xpath('//tbody/tr[7]/th/text()')[0])
first_row_list.append(tree.xpath('//tbody/tr[8]/th/text()')[0])  # 获取第一列节数内容
content_list = tree.xpath('//tbody/tr/td/div[2]/text()')  # 获取课表具体内容
book = xlwt.Workbook(encoding='unicode')  # 创建Workbook,相当于创建Excel
sheet = book.add_sheet(u'课程表', cell_overwrite_ok=True)
for i in range(8):sheet.write(0, i, first_line_list[i])  # 保存第一行
for j in range(7):sheet.write(j+1, 0, first_row_list[j])  # 保存第一列
for i in range(7):sheet.write(1, i+1, content_list[i])sheet.write(2, i+1, content_list[7+i])sheet.write(3, i+1, content_list[14 + i])sheet.write(4, i+1, content_list[21+i])sheet.write(5, i+1, content_list[28+i])sheet.write(6, i+1, content_list[35+i])
book.save('./课程表.xls')
sleep(4)
bro.quit()

总结

1. selenium无敌,selenium无敌,selenium无敌

2.爬取第一列的时候还有一点问题没解决,不能循环

3. Python处理Excel表格是现学现卖的,没有处理好单元格大小问题

4.如果你也认为这篇文章有趣,请一定要评论,转发并投币

如何与众不同的查看课程表?不是Excel表格我不看!相关推荐

  1. 把Excel表格发给领导看,如何快速查找表格改动的地方?

    把Excel表格发给领导看,如何快速查找表格改动的地方? 目录 把Excel表格发给领导看,如何快速查找表格改动的地方? 1.首先在把表格发给领导前复制一个工作表,鼠标放置工作表名称位置,鼠标右键点击 ...

  2. 表格的计算机在哪个文件夹,如何查看当前打开的Excel表格文件在电脑中的保存位置...

    我们就以工作簿3为例,来查看一下此文件在电脑中的存放位置. 第一种方法 gif动画演示教程如下: 演示教程为wps软件,点击左上角的wps表格旁边的下拉三角,从中选择文件菜单下的自属性项,如下图: 在 ...

  3. 三维点云数据使用Excel表格成散点图看趋势

    文章目录 前言 1. 载入Excel 2. 加散点图 前言 手上有一堆激光扫描获得的原始数据经三维转换后的数据.想要看一看坐标趋势是否符合预期.那么将其在Excel打开,插入散点图. 1. 载入Exc ...

  4. android jxl.jar 使用,使用jxl.jar在Android中操作Excel表格——重中之重——对隐藏表的处理...

    曾简单了解过C#,将Excel(数据库表)表中的数据导入到C#中,使用C#制作的图形化界面进行对Excel表中数据进行操作. 今天想试试,在Android中导入Excel表格进行操作.在网上查阅资料, ...

  5. matlab excel 单元居中,用matlab如何识别excel里的单元格是否为合并单元格|excel表格怎么调整行高和列宽...

    用matlab合并excel表格文件 没看明白 你换一种表述说说 matlab怎么合并excel单元格并赋值? 需要确切地说明一下:matlab导入默认是double型的,小数点后至以保留15位.你不 ...

  6. excel表格转vcf图文教程详解

    工作中我们总是习惯性的用excel表格来存放数据,比如公司和客户联系方式,但是有的时候我们需要将excel通讯录导入到手机. vCard通讯录格式(文件后缀名vcf)是电子名片的文件格式标准,常用于在 ...

  7. json转excel_如何快速把json数据转到excel表格,方便个人查看

    如何快速把json数据转到excel表格,方便个人查看 json数据格式并不是人人都能看明白,密密麻麻的代码不是专业人士看起来肯定很费劲, 办公人士一般都是看excel这样的整理好的数据, 但是偶尔会 ...

  8. 什么是计算机嵌套分类汇总,excel嵌套分类汇总 Excel表格中创建嵌套分类汇总和查看嵌套分类汇总明细的方法...

    excel嵌套分类汇总 Excel表格中创建嵌套分类汇总和查看嵌套分类汇总明细的方法,我们在工作中会遇到很多文章,像excel嵌套分类汇总这类问题应该大家也都遇到过吧,今天这篇excel嵌套分类汇总 ...

  9. html 查看excel表格,html展示excel表格数据-html读取本地excel文件并展示

    怎么用html实现excel表格 首先html不能读取本地excel文件 其次就算是javascript 也是不允许的 这是为了安全考虑 如果前端脚本可以读取本地文件 那很不安全 如何将excel上的 ...

最新文章

  1. 在react hook里使用mobx(配置mobx依赖)
  2. 身份证号码对应地区-官方措辞:行政区划代码
  3. ES6数组的解构赋值( 中)
  4. 读取CSV数据的集中方式(Java和Oracle)
  5. LINUX 使用tcgetattr函数与tcsetattr函数控制终端四
  6. mysql 创建唯一索引_Mysql创建索引
  7. boost::math::hypot用法的测试程序
  8. Tomcat可运行源码资源分享
  9. **16.app后端如何保证通讯安全--url签名
  10. android默认获取敏感权限
  11. vue插槽的使用(slot)
  12. micrometer_具有InlfuxDB的Spring Boot和Micrometer第2部分:添加InfluxDB
  13. 【每日算法】【图论】【最小边覆盖 最小路径覆盖 最小顶点覆盖 最大独立集 最大团】
  14. mysql8安装目录linux7.5_Linux系统下 MySQL 5.7和8.0 版本安装指南
  15. java设计思想和设计模式,快来收藏!
  16. 关于动态语言 静态语言 静态类型语言 动态类型语言的区别
  17. 改造u3d第一人称控制器,使之适合Cardboard+蓝牙手柄控制
  18. RMI 自己创建的 过程
  19. 用 ANSYS/LS-DYNA 进行显式动力学仿真计算 (转帖,有修改)
  20. Hilbert 变换

热门文章

  1. Golang http短连接
  2. 计算机主板电池没电了 会怎么样,主板电池没电了会怎么样_主板电池没电引起罕见故障...
  3. 计算机网络试题合工大,合工大计算机网络课后习题答案精简版
  4. 判断内存卡的可用空间
  5. 如何给根分区扩容(以centos为例)
  6. 给elementui的dialog标题下方添加一条线提升观感效果
  7. ceph源码分析--Monitor paxos算法
  8. 车牌子PHP533好吗,图文评测曝光容声533与532的区别哪个好?配置有什么区别?内幕剖析评测...
  9. 【单目标优化算法】杂草优化算法(Matlab代码实现)
  10. [Swift]获取手机SIM卡网络运营商名称