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

前言

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

发布了11 篇原创文章 · 获赞 307 · 访问量 6758

猜你喜欢

转载自blog.csdn.net/weixin_43853097/article/details/103969940
今日推荐