前言

今天来写写爬取教务系统的爬虫,此次的爬虫目的是爬取教务系统里面的成绩单,涉及到的库依旧是selenium,re,beautifulsoup,Options,今天多了个csv库用来处理爬取的数据,使其生成相应的csv文件,可用于excel和txt打开,好了,废话不多说,开始步骤

具体步骤

①首先要设定好chromedriver终端程序文件的路径以及生成文件的路径,还有登录的账号密码

#模拟登陆终端文件路径
driver_path = r'E:\py\chromedriver\chromedriver.exe'#生成csv文件路径
csv_file_path = r'E://py//教务系统成绩表.csv'#登录教务系统的账号与密码
UserId = '账号' #
PassWord = '密码' #

②对chromedriver一些参数的设定,代码注释有说明
chrome的定义i里面的executable_path是chromedriver.exe的路径
当然,调用参数 首先要接入Options库

#实现后台登陆浏览器
chrome_options = Options()
chrome_options.add_argument('--headless')#关闭浏览器,后台运行,即不会打开浏览器
chrome_options.add_argument('--disable-gpu')#禁止GUP为浏览器加速 防止过多开启浏览器卡死
#更改代理ip防反爬虫
#chrome_options.add_argument(f"--proxy-server=121.52.208.200:808")driver = webdriver.Chrome(executable_path = driver_path, chrome_options=chrome_options)

接入接口

from selenium.webdriver.chrome.options import Options

③一系列模拟登录操作,以达到可用获取成绩单页面的html,分别运用的driver的查找元素功能,send_keys()里面存放的是给与的输入值,click()是单击按钮
最后在每个页面加载时给程序停顿时间,防止加载页面过慢,导致下一步操作未能实现

driver.get('http://jwgln.zsc.edu.cn/jsxsd/')
time.sleep(5)#输入登录账号
try:driver.find_element_by_id("userAccount").send_keys(UserId)print('输入账号成功!')
except:print('输入账号失败!')
# 输入登录密码
try:driver.find_element_by_id("userPassword").send_keys(PassWord)print('输入密码成功!')
except:print('输入密码失败!')
# 点击登录
try:driver.find_element_by_xpath('//*[@id="btnSubmit"]').click()  # 用click模拟浏览器点击print('正在登录...')
except:print('登录失败!')
driver.implicitly_wait(3)
if '用户名或密码错误' in driver.page_source:print('登录失败,用户名或密码错误,请查证账号密码是否准确。')exit(0)
else:print('登录成功!')
# 点击学业情况
try:driver.find_element_by_xpath('//*[@class="block5"]').click()print('点击学业情况成功!')
except:print('点击学业情况失败!')
driver.implicitly_wait(3)#点击课程成绩查询
try:driver.find_element_by_xpath('//*[@href="/jsxsd/kscj/cjcx_query"]').click()time.sleep(3)driver.find_element_by_xpath('//*[@id="btn_query"]').click()print('课程成绩查询成功!')
except:print('课程成绩查询失败!')

④当然模拟登录就是为了获取此网页html,但是笔者多次一步获取此网页的cookie,然后再用request请求网页,得到网页信息,主要是为了以后某需要登录网页做准备。

cookies = driver.get_cookies()
cookies_list= []
for cookie_dict in cookies:cookie =cookie_dict['name']+'='+cookie_dict['value']cookies_list.append(cookie)
header_cookie = ';'.join(cookies_list)#关闭模拟终端
driver.quit()

上面的cookies_list存放着从driver获取的并且经过处理过可以放入头部信息的cookie

⑤获取了cookie,设置好头部,就可以直接拿所要爬取的页面的URL直接请求爬取,无需再登录,下面还有运用beautifulsoup对数据进行筛选的操作

#设置好页面请求头部
headers = {'cookie':header_cookie,'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36'
}#需要抓取信息的页面URL
fin_url = 'http://jwgln.zsc.edu.cn/jsxsd/kscj/cjcx_list'
response = requests.get(fin_url,headers=headers)
page_source=response.text#用bs4进行数据筛选
bs = BeautifulSoup(page_source, 'lxml')
my_score_detail = bs.find_all(name='td')[1:]
my_score_detail = list(my_score_detail)
my_score_list = [i.string for i in my_score_detail]

⑥数据过滤好后,就是存储到文件里面,运用csv库来生成格式写入文件

#数据整理,将数据按原格式存入csv文件,可用excel打开
try:f = open(csv_file_path, 'w', newline='')csv_write = csv.writer(f)csv_write.writerow(['序号', '开课学期', '课程编号', '课程名称', '总成绩', '学分', '平时成绩', '期中成绩', '实验成绩', '期末成绩', '课程属性', '课程性质', '备注', '考试性质'])for i in range(0, len(my_score_list), 14):course_list = []for j in range(i, i + 14):course_list.append(my_score_list[j])csv_write.writerow(course_list)f.close()print('生成csv文件成功!')
except:print('生成csv文件失败')

附加

下面是一些chrome的暂停操作,可用防止页面加载过慢问题导致爬取出错
driver就是经过Webdriver定义的driver,name就是网页html标签tag名字,意思就是出现名为name的tag就执行下一步,当然里面的20参数是等待20秒后执行下一步的意思

需要的接口

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

主要函数

#暂停防止页面加载太慢出错
def wait(drive, name):try:element = WebDriverWait(drive, 20).until(EC.presence_of_all_elements_located((By.TAG_NAME, name)))finally:driver.quit()

引用

wait(driver,name)

再附加

下面是定义虚拟鼠标来模拟登录的方法,当然要接入接口

from selenium.webdriver.common.action_chains import ActionChains
#模拟登录鼠标点击方法
def login(drive):actions = ActionChains(drive)name_input = drive.find_element_by_id('username')actions.move_to_element(name_input)actions.send_keys_to_element(name_input, '账号')psw_input = drive.find_element_by_id('password')actions.move_to_element(psw_input)actions.send_keys_to_element(psw_input, '密码')actions.perform()submit_button = drive.find_element_by_xpath('xpath格式')submit_button.click()

最后放上所有代码

当然,要运行成功这个代码,肯定需要我们学校ZSC的教务系统所属的学生账号密码

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support import expected_conditions as EC
import requests
from bs4 import BeautifulSoup
import time
import csv
import re
from prettytable import PrettyTable# selenium 模拟教务系统查询成绩登陆
#@author Himit_ZH#模拟登陆终端文件路径
driver_path = r'E:\py\chromedriver\chromedriver.exe'#生成csv文件路径
csv_file_path = r'E://py//教务系统成绩表.csv'#登录教务系统的账号与密码
UserId = '账号'
PassWord = '密码' #实现后台登陆浏览器
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
#更改代理ip防反爬虫
#chrome_options.add_argument(f"--proxy-server=121.52.208.200:808")driver = webdriver.Chrome(executable_path = driver_path, chrome_options=chrome_options)driver.get('http://jwgln.zsc.edu.cn/jsxsd/')
time.sleep(5)#输入登录账号
try:driver.find_element_by_id("userAccount").send_keys(UserId)print('输入账号成功!')
except:print('输入账号失败!')
# 输入登录密码
try:driver.find_element_by_id("userPassword").send_keys(PassWord)print('输入密码成功!')
except:print('输入密码失败!')
# 点击登录
try:driver.find_element_by_xpath('//*[@id="btnSubmit"]').click()  # 用click模拟浏览器点击print('正在登录...')
except:print('登录失败!')
driver.implicitly_wait(3)
if '用户名或密码错误' in driver.page_source:print('登录失败,用户名或密码错误,请查证账号密码是否准确。')exit(0)
else:print('登录成功!')
# 点击学业情况
try:driver.find_element_by_xpath('//*[@class="block5"]').click()print('点击学业情况成功!')
except:print('点击学业情况失败!')
driver.implicitly_wait(3)#点击课程成绩查询
try:driver.find_element_by_xpath('//*[@href="/jsxsd/kscj/cjcx_query"]').click()time.sleep(3)driver.find_element_by_xpath('//*[@id="btn_query"]').click()print('课程成绩查询成功!')
except:print('课程成绩查询失败!')#获取此页面的cookies
cookies = driver.get_cookies()
cookies_list= []
for cookie_dict in cookies:cookie =cookie_dict['name']+'='+cookie_dict['value']cookies_list.append(cookie)
header_cookie = ';'.join(cookies_list)#关闭模拟终端
driver.quit()#设置好页面请求头部
headers = {'cookie':header_cookie,'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36'
}#需要抓取信息的页面URL
fin_url = 'http://jwgln.zsc.edu.cn/jsxsd/kscj/cjcx_list'
response = requests.get(fin_url,headers=headers)
page_source=response.text#用bs4进行数据筛选
bs = BeautifulSoup(page_source, 'lxml')
my_score_detail = bs.find_all(name='td')[1:]
my_score_detail = list(my_score_detail)
my_score_list = [i.string for i in my_score_detail]#数据整理,将数据按原格式存入csv文件,可用excel打开
try:f = open(csv_file_path, 'w', newline='')csv_write = csv.writer(f)csv_write.writerow(['序号', '开课学期', '课程编号', '课程名称', '总成绩', '学分', '平时成绩', '期中成绩', '实验成绩', '期末成绩', '课程属性', '课程性质', '备注', '考试性质'])for i in range(0, len(my_score_list), 14):course_list = []for j in range(i, i + 14):course_list.append(my_score_list[j])csv_write.writerow(course_list)f.close()print('生成csv文件成功!')
except:print('生成csv文件失败')#暂停防止页面加载太慢出错
def wait(drive, name):try:element = WebDriverWait(drive, 20).until(EC.presence_of_all_elements_located((By.TAG_NAME, name)))finally:driver.quit()#模拟登录鼠标点击方法
def login(drive):actions = ActionChains(drive)name_input = drive.find_element_by_id('username')actions.move_to_element(name_input)actions.send_keys_to_element(name_input, '账号')psw_input = drive.find_element_by_id('password')actions.move_to_element(psw_input)actions.send_keys_to_element(psw_input, '密码')actions.perform()submit_button = drive.find_element_by_xpath('xpath格式')submit_button.click()

python3爬虫模拟登录爬取教务系统成绩单(获取cookie操作)相关推荐

  1. 枯燥的寒假生活(一) python爬虫模拟登录whu老教务系统获取期末考试成绩(已失效 , 老教务系统增加了新的反爬, 老教务系统已停用)

    python模拟登录老教务系统(2021.6.24更新) 一.写在前面 之前用爬虫爬取的都是静态网页html中的内容,但是大多数时候需要动态处理网页爬取数据.因为学校出成绩太慢了,每次都自己打开浏览器 ...

  2. Python爬虫练习记录-爬取教务系统成绩

    模拟post提交表单,获取Cookie 使用火狐浏览器打开学校教务系统,F12打开开发者模式 点击网络,持续记录数据包,发现login.action是提交的表单信息 查看表单数据,发现前端对param ...

  3. python3爬取教务系统的个人学期课程表(无头谷歌浏览模拟登录)

    前言 今天带来的是与上次爬取教务系统获取成绩单的姐妹版--爬取教务个人的学期课程表. 工具 使用pycharm编辑器,安装selenium库,beautifulsoup库,csv库,当然需要下载对应的 ...

  4. JSoup模拟登录新版正方教务系统(内网-教务系统)获取信息过程详解

    新版正方教务系统登录界面: 目录 一.需求分析 二.模拟登录内网 三.模拟登录教务系统 四.爬取成绩和课表信息 参考文章 一.需求分析   需要访问教务系统,爬取出课表成绩等信息,并在自己所写的APP ...

  5. 2021春项目需求记录 python实现模拟登录+爬取NASA Modis 上的产品数据

    python实现模拟登录+爬取Nasa Modis 上的产品数据 概述 需求分析 基本思路 代码 概述 3月的中旬时候参与了学校的一个大创项目,作为本科生,本人只是摸鱼打杂,负责了其中的一个功能模块: ...

  6. 第26讲:模拟登录爬取实战案例

    在上一课时我们了解了网站登录验证和模拟登录的基本原理.网站登录验证主要有两种实现,一种是基于 Session + Cookies 的登录验证,另一种是基于 JWT 的登录验证,那么本课时我们就通过两个 ...

  7. python3爬虫之多线程爬取英雄联盟所有皮肤图片

    python3爬虫之多线程爬取英雄联盟所有皮肤图片 线程不要太高,容易出错,大约用时1分钟左右. import requests import json import os import thread ...

  8. python3爬取教务系统_python requests模拟登陆正方教务管理系统,并爬取成绩

    最近模拟带账号登陆,查看了一些他人的博客,发现正方教务已经更新了,所以只能自己探索了. 登陆: 通过抓包,发现需要提交的值 需要值lt,这是个啥,其实他在访问登陆页面时就产生了 session=req ...

  9. 模拟登录爬取广职院正方教务系统

    最近突然的想爬取学校的课程表,于是经过几经努力,终于出来的一个小demo,话不多说,马上为大家讲解:先放上代码 import re import requests from fake_useragen ...

最新文章

  1. git add . 之后 想执行回滚操作(git add 到本地仓库的代码回滚到没有add 之前的操作)
  2. matlab循环求 近似for,Matlab for 多个变量循环能不能这样啊 ,求教高手!!!!...
  3. python处理csv数据-Python处理csv文件
  4. Git 远程分支的查看及相关问题
  5. jsf组件不显示_JSF组件库–质量不只是零缺陷
  6. 最右显示请求服务器不存在,修改合流任务_实时音视频 RTC_服务端API参考_合流任务管理_华为云...
  7. 移动端页面0.5px border的实现
  8. Java笔记-解决SSLHandshakeException: No subject alternative names present
  9. libcap-ng库旨在使具有posix功能的编程比传统的libcap库容易得多
  10. ssm 项目记录用户操作日志和异常日志
  11. 多投资机构点评神州信息2019业绩:看好金融信创,给出增持评级!
  12. strcpy_s函数
  13. devexpress控件使用笔记
  14. 转:: 刺鸟:用python来开发webgame服务端(5)
  15. Python分析上证指数历史数据,发现估值还不够低……
  16. 史上最全的开源库整理
  17. mysql升级 增删改查询
  18. Stata连享会:分享一大堆资料
  19. Spring boot 项目(十二)——实现电脑网页微信扫码自动授权
  20. 台大郭彦甫_MATLAB视频笔记(六)图形界面_GUI程序设计

热门文章

  1. android 开发手机推荐 2015年,2015年6月十大最佳安卓手机排行榜 性价比高Android手机推荐...
  2. 当我们买手机时,我们在买什么
  3. 画质增强概述-4-传统方法增强实践
  4. 金蝶EAS/BOS开发小知识二
  5. 网络适配器如何设置?
  6. 鸿蒙系统获取Android版本
  7. Kotlin直接执行kt文件方法
  8. android app开发混合开发,混合开发入门 Vue结合Android/iOS开发仿京东项目App
  9. 酷q插件开发Java_如何使用Java开发QQ机器人 方法一
  10. docker+Jenkins+nginx实现前端自动部署详细教程