1. Grades Crawler 项目介绍
    由于教务处成绩不易自己打印,故编写爬虫Grades Crawler, 其可以将自己的(需要合法的学生帐号信息)教务处成绩爬取下来,并本地保存为excel格式或直接保存在sqlite数据库中
  2. 需额外安装的 libraries
    bs4, xlrd, xlwt(保存成绩为excel格式)

  3. python代码 (待有空时会详细讲解)

# -*-encoding:utf-8-*-
# coding=utf-8
__author__ = 'ysc'
import requests
from bs4 import BeautifulSoup
import xlrd
import xlwtclass ScrapeGrade:def __init__(self, auth_url=None, log_url=None):if not auth_url:self.auth_url = "http://ids.xidian.edu.cn/authserver/login?service=http%3A%2F%2Fjwxt.xidian.edu.cn%2Fcaslogin.jsp"self.log_url = "http://jwxt.xidian.edu.cn/caslogin.jsp"else:self.auth_url = auth_urlself.log_url = log_urlself.session = requests.Session()def login(self, id='1302051****', password='****'):r = self.session.get(self.auth_url)data = r.textbsObj = BeautifulSoup(data, "html.parser")lt_value = bsObj.find(attrs={"name": "lt"})['value']exe_value = bsObj.find(attrs={"name": "execution"})['value']params = {'username': id, 'password': password,"submit": "", "lt": lt_value, "execution": exe_value,"_eventId": "submit", "rmShown": '1'}headers = {'User-Agent': "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0",'Accept': "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",# "Host": "ids.xidian.edu.cn","Accept-Language": "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3","Accept-Encoding": "gzip, deflate","Referer": "http://ids.xidian.edu.cn/authserver/login?service=http%3A%2F%2Fjwxt.xidian.edu.cn%2Fcaslogin.jsp",# 'X-Requested-With': "XMLHttpRequest","Content-Type": "application/x-www-form-urlencoded"}s = self.session.post(self.auth_url, data=params, headers=headers)s = self.session.get(self.log_url)def store_into_db_by_term(self):# 按学期进行分类import sqlite3conn = sqlite3.connect('grades_term.db')# conn.text_factory = str  ##!!!c = conn.cursor()try:# init the counter of the sheetrow = 0# 打开成绩页面grade_page = self.session.get("http://jwxt.xidian.edu.cn/gradeLnAllAction.do?type=ln&oper=qbinfo&lnxndm=2015-2016%D1%A7%C4%EA%B5%DA%D2%BB%D1%A7%C6%DA(%C1%BD%D1%A7%C6%DA)")bsObj2 = BeautifulSoup(grade_page.text, "html.parser")# datas 包含了所有学期的成绩, tabledatas = bsObj2.find_all("table", attrs={"class": "titleTop2"})# seme 指每学期的成绩. tablefor i, seme in enumerate(datas):#写入一行标题thths = seme.find_all('th')titles = []for col, th in enumerate(ths):print(th.string.strip(), end='   ')th = th.string.strip()if th != '学分' and th != "成绩":titles.append(th + r'  text')else:titles.append(th + r'  real')# table.write(row, col, th.string.strip(), self.set_style('Times New Roman', 220, True))# Create tablesent = '''CREATE TABLE {0} ( '''.format('table' + str(i+1))for ith, title in enumerate(titles):sent += titleif ith < len(titles) - 1:sent += ",   "sent += ")"try:c.execute(sent)conn.commit()except sqlite3.OperationalError:passprint('\n')row += 1# 各科成绩subs = seme.findAll('td', attrs={"align": "center"})col_iter = 0len_ths = len(ths)grade_subs = []# sub为具体的某科成绩for sub in subs:if sub.string:if sub.string.strip() != '':print(sub.string.strip(), end='   ')grade_subs.append("'" + sub.string.strip()+"'")else:print("' '", end='   ')grade_subs.append("' '")else:print(sub.find('p').string.strip(), end='   ')grade_subs.append("'" + sub.find('p').string.strip() + "'")col_iter += 1if col_iter == len_ths:# 此时一科的成绩以及visited, 该访问下一科print('\n')# Insert a row of datasent = '''INSERT INTO {0} VALUES( '''.format('table' + str(i+1))for ith, grade_sub in enumerate(grade_subs):sent += grade_subif ith < len(grade_subs) - 1:sent += ",   "sent += ")"try:c.execute(sent)conn.commit()except sqlite3.OperationalError as e:print(e)print(sent)exit(-2)row += 1col_iter = 0grade_subs = []print("\n")# 保存到xls中finally:conn.close()def store_into_db_by_prop(self):# 按科目属性(必修\选修)进行分类import sqlite3conn = sqlite3.connect('grades_prop.db')c = conn.cursor()try:# init the counter of the sheetrow = 0# 打开成绩页面grade_page = self.session.get("http://jwxt.xidian.edu.cn/gradeLnAllAction.do?type=ln&oper=sxinfo&lnsxdm=001")bsObj2 = BeautifulSoup(grade_page.text, "html.parser")# datas 包含了所有学期的成绩, tabledatas = bsObj2.find_all("table", attrs={"class": "titleTop2"})# seme 指每学期的成绩. tablefor i, seme in enumerate(datas):#写入一行标题thths = seme.find_all('th')titles = []for col, th in enumerate(ths):print(th.string.strip(), end='   ')th = th.string.strip()if th != '学分' and th != "成绩":titles.append(th + r'  text')else:titles.append(th + r'  real')# table.write(row, col, th.string.strip(), self.set_style('Times New Roman', 220, True))# Create tablesent = '''CREATE TABLE {0} ( '''.format('table' + str(i+1))for ith, title in enumerate(titles):sent += titleif ith < len(titles) - 1:sent += ",   "sent += ")"try:c.execute(sent)conn.commit()except sqlite3.OperationalError:passprint('\n')row += 1# 各科成绩subs = seme.findAll('tr', attrs={'class': "odd"})col_iter = 0len_ths = len(ths)grade_subs = []# sub为具体的某科信息for sub in subs:infors = sub.findAll('td')  #, attrs={"align": "center"})for infor in infors:if infor.string:if infor.string.strip() != '':print(infor.string.strip(), end='   ')grade_subs.append("'" + infor.string.strip()+"'")else:print("' '", end='   ')grade_subs.append("' '")else:infor = infor.find('p').string.strip()if infor != '':print(infor, end='   ')grade_subs.append("'" + infor + "'")else:print("' '", end='   ')grade_subs.append("' '")# 此时一科的成绩已经visited, 该访问下一科print('\n')# Insert a row of datasent = '''INSERT INTO {0} VALUES( '''.format('table' + str(i+1))for ith, grade_sub in enumerate(grade_subs):sent += grade_subif ith < len(grade_subs) - 1:sent += ",   "sent += ")"try:c.execute(sent)conn.commit()except sqlite3.OperationalError as e:print(e)print(sent)exit(-2)row += 1col_iter = 0grade_subs = []print("\n")# 保存到xls中finally:conn.close()def set_style(self, name, height, bold=False):style = xlwt.XFStyle()font = xlwt.Font()font.name = name  # 'Times New Roman'font.bold = boldfont.color_index = 4font.height = height'''borders= xlwt.Borders()borders.left= 6borders.right= 6borders.top= 6borders.bottom= 6'''style.font = font# style.borders = bordersreturn styledef store_into_xls(self):file = xlwt.Workbook()table = file.add_sheet('grades', cell_overwrite_ok=True)# init the counter of the sheetrow = 0# 打开成绩页面grade_page = self.session.get("http://jwxt.xidian.edu.cn/gradeLnAllAction.do?type=ln&oper=qbinfo&lnxndm=2015-2016%D1%A7%C4%EA%B5%DA%D2%BB%D1%A7%C6%DA(%C1%BD%D1%A7%C6%DA)")bsObj2 = BeautifulSoup(grade_page.text, "html.parser")# datas 包含了所有学期的成绩, tabledatas = bsObj2.find_all("table", attrs={"class": "titleTop2"})# seme 指每学期的成绩. tablefor seme in datas:#写入一行标题thths = seme.find_all('th')for col, th in enumerate(ths):print(th.string.strip(), end='   ')table.write(row, col, th.string.strip(), self.set_style('Times New Roman', 220, True))print('\n')row += 1# 各科成绩subs = seme.findAll('td', attrs={"align": "center"})col_iter = 0len_ths = len(ths)# sub为具体的某科成绩for sub in subs:if sub.string:print(sub.string.strip(), end='   ')table.write(row, col_iter, sub.string.strip())else:print(sub.find('p').string.strip(), end='   ')table.write(row, col_iter, sub.find('p').string.strip())col_iter += 1if col_iter == len_ths:print('\n')row += 1col_iter = 0print("\n")# 保存到xls中file.save('demo.xls')if __name__ == '__main__':# 初始化爬虫对象sg = ScrapeGrade()# 登录(在此处传入正确的个人学号与密码信息)sg.login(id='1302051***', password='1234567')# 保存成绩为excelsg.store_into_xls()

【Grades Crawler】利用python编写爬虫 爬取西电教务处成绩并本地保存相关推荐

  1. 如何利用Python网络爬虫爬取微信朋友圈动态--附代码(下)

    前天给大家分享了如何利用Python网络爬虫爬取微信朋友圈数据的上篇(理论篇),今天给大家分享一下代码实现(实战篇),接着上篇往下继续深入. 一.代码实现 1.修改Scrapy项目中的items.py ...

  2. python朋友圈动态_如何利用Python网络爬虫爬取微信朋友圈动态--附代码(下)

    前天给大家分享了如何利用Python网络爬虫爬取微信朋友圈数据的上篇(理论篇),今天给大家分享一下代码实现(实战篇),接着上篇往下继续深入. 一.代码实现 1.修改Scrapy项目中的items.py ...

  3. python抓取朋友圈动态_如何利用Python网络爬虫爬取微信朋友圈动态--附代码(下)...

    原标题:如何利用Python网络爬虫爬取微信朋友圈动态--附代码(下) 前天给大家分享了如何利用Python网络爬虫爬取微信朋友圈数据的上篇(理论篇),今天给大家分享一下代码实现(实战篇),接着上篇往 ...

  4. python编写爬虫爬取先知社区文章

    python编写爬虫爬取先知社区文章的标题.标题链接.作者.作者链接.文章分类.发布时间.评论数(O(∩_∩)O哈哈~初级小白,暂时没用正则表达式) import requests '''爬取全部'' ...

  5. python3爬取网易云歌单数据清洗_如何利用Python网络爬虫爬取网易云音乐歌词

    赵雷的歌曲 本文以民谣歌神赵雷为数据采集对象,专门采集他的歌曲歌词,其他歌手的歌词采集方式可以类推,下图展示的是<成都>歌词. 赵雷歌曲---<成都> 一般来说,网页上显示的U ...

  6. python抓取微信朋友圈动态_2018最全如何利用Python网络爬虫抓取微信朋友圈的动态...

    今天小编给大家分享一下如何利用Python网络爬虫抓取微信朋友圈的动态信息,实际上如果单独的去爬取朋友圈的话,难度会非常大,因为微信没有提供向网易云音乐这样的API接口,所以很容易找不到门.不过不要慌 ...

  7. 2018最全如何利用Python网络爬虫抓取微信朋友圈的动态

    今天小编给大家分享一下如何利用Python网络爬虫抓取微信朋友圈的动态信息,实际上如果单独的去爬取朋友圈的话,难度会非常大,因为微信没有提供向网易云音乐这样的API接口,所以很容易找不到门.不过不要慌 ...

  8. python爬虫能爬取微信密码吗_如何利用Python网络爬虫抓取微信好友数量以及微信好友的男女比例...

    今天我们继续focus on微信,不过这次给大家带来的是利用Python网络爬虫抓取微信好友总数量和微信好友男女性别的分布情况.代码实现蛮简单的,具体的教程如下. 相信大家都知道,直接通过网页抓取微信 ...

  9. python爬去百度文库_利用Python语言轻松爬取数据[精品文档]

    利用 Python 语言轻松爬取数据 对于小白来说,爬虫可能是一件非常复杂. 技术门槛很高的事情. 比如有人认为学爬虫必须精通 Python ,然后哼哧哼哧系统学习 Python 的每个知识点,很久之 ...

最新文章

  1. 利用Linux或者Windows操作系统做路由器进行网络互连
  2. 2016.3.2(String 类)
  3. 关于readdir返回值中struct dirent.d_type的取值有关问题(转)
  4. mysql图片路径varchar大小_Mysqlvarchar大小长度问题_MySQL
  5. mybatis出现 Parameter '__frch_excelModel_0' not found.
  6. 买房为什么要少出首付,多贷款?
  7. Android系统信息获取 之五:系统语言信息(续)-语言地区和简写对照表
  8. C#之获取系统cpu
  9. R语言之随机数与抽样模拟篇
  10. 记录一下Android 长截屏功能
  11. c51单片机时钟程序汇编语言,51单片机时钟汇编程序
  12. 【PIE-Engine Studio学习笔记06】图像分类——监督分类
  13. Linux nohup bash cm_watch.sh >> run.log 2>1
  14. adb是什么?如何安装配置adb?如何检验是否成功安装adb?
  15. Java国密加密SM2代码
  16. 调用第三方接口的方式(简洁版)
  17. jmockit抛NullPointer异常,initialize failed异常
  18. Mac上Arduino ide首选项
  19. 汽车保养app 功能需求
  20. echo的故事(希腊神话山林女神和回声女神)

热门文章

  1. css scale()方法
  2. 绝佳表现电商各类促销活动插画素材|玩转大促购物节
  3. matlab添加旁白,在MATLAB中向已知信号添加高斯白噪声 (转载)
  4. web2.0常用网页配色
  5. 如果恢复计算机系统时间吗,一般的计算机还原系统需要多长时间?
  6. 7-5 快乐的尽头 (17 分)
  7. 教你如何用免费软件来发布活动直播
  8. 计算机研讨会通讯录,江苏学会网 中国力学学会学术大会’2005 第二轮通知
  9. [Practical.Vim(2012.9)].Drew.Neil.Tip94 学习摘要
  10. 感量越大抑制频率约低_开关电源电磁兼容进级-EMI传导输入滤波器的设计理论(ED-TEST上海)...