今天来写写爬取教务系统的爬虫,此次的爬虫目的是爬取教务系统里面的成绩单,涉及到的库依旧是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()