python爬取教务系统课表
通过python爬取教务系统课表
# coding=utf-8 from bs4 import BeautifulSoup #网页解析获取数据 import re#正则表达式。进行文字匹配 import urllib.request,urllib.error#制定URL ,获取网页数据 import xlwt#进行excle操作 import sqlite3#进行数据库操作 import urllib.request import urllib.parse #1.爬取网页 #2.解析数据 #3.保存数据 def main(): print("开始爬取......") #baseurl = "https://movie.douban.com/top250?start=" baseurl = "https://tiedao.vatuu.com/vatuu/CourseAction" # datalist=getData(baseurl) datalist = getData(baseurl) savepath="教务系统课表.xls" savaData(datalist,savepath) #askURL("https://tiedao.vatuu.com/vatuu/CourseAction")#爬取铁大教务处网站 #askURL("https://movie.douban.com/top250?start") #设置影片链接的规则 findXh=re.compile(r'<td>(\d{1,2})</td>') findX=re.compile(r'<font color="#000080">(.*?)</font>') findJxl=re.compile(r'<td>(.*)</td>') findJsmc=re.compile(r'<font color="#0000FF">(.*)</font>') findJslx=re.compile(r'<td>(多媒体)</td>') findRl=re.compile(r'<td>(\d*)</td>') findZt=re.compile(r'<font color="blue">(空闲)</font>') findSfkj=re.compile(r'(可借|不可借)') findZc=re.compile(r'<td>(第.*周)</td>') findXq=re.compile(r'(星期.)') findJc=re.compile(r'<td>(第.*节)</td>') def getData(baseurl):#获取数据 datalist = [] html = askURL(baseurl) # 保存获取到的网页源码 # 2.逐一解析 soup = BeautifulSoup(html, "html.parser") for item in soup.select('tr'):# 查找符合要求的字符串,形成列表 data = [] # 保存一部电影的全部信息 item = str(item) xh = re.findall(findXh, item) if(len(xh)==2):# re库通过正则表达式来查找指定的字符串, data.append(xh[0]) else:# 添加序号 data.append(xh) x = re.findall(findX, item) # re库通过正则表达式来查找指定的字符串, data.append(x) # 添加校区 jxl = re.findall(findJxl, item) if(len(jxl)>0):# re库通过正则表达式来查找指定的字符串, data.append(jxl[1]) # 添加教学楼 jsmc = re.findall(findJsmc, item) # re库通过正则表达式来查找指定的字符串, data.append(jsmc) # 添加教室名称 jslx = re.findall(findJslx, item) # re库通过正则表达式来查找指定的字符串, data.append(jslx) # 添加教室类型 rl = re.findall(findRl, item) if(len(rl)==2):# re库通过正则表达式来查找指定的字符串, data.append(rl[1]) # 添加教室容量 zt = re.findall(findZt, item) # re库通过正则表达式来查找指定的字符串, data.append(zt) # 添加教室状态 fkj = re.findall(findSfkj, item) # re库通过正则表达式来查找指定的字符串, data.append(fkj) # 添加教室是否可借 zc = re.findall(findZc, item) # re库通过正则表达式来查找指定的字符串, data.append(zc) # 添加教室周次 xq = re.findall(findXq, item) # re库通过正则表达式来查找指定的字符串, data.append(xq) # 添加教室星期 jc = re.findall(findJc, item) # re库通过正则表达式来查找指定的字符串, data.append(jc) # 添加教室节次 datalist.append(data) # 把一部电影的信息放入数组 print(datalist) #逐一解析数据 return datalist#返回数据列表 def savaData(datalist,savapath): book = xlwt.Workbook(encoding="utf-8",style_compression=0) # 创建workbook对象 sheet = book.add_sheet('教务系统课表',cell_overwrite_ok=True) # 创建工作表 col = ("序号","校区","教学楼","教室名称","教室类型","容量","状态","是否可借","周次","星期","节次") for i in range(0,11): sheet.write(0,i,col[i])#设置列名 for i in range(3, len(datalist)): print("第%d条"%i) data=datalist[i] for j in range(0,11): sheet.write(i+1-3,j,data[j]) book.save(savapath)#保存 #得到指定一个url的网页内容 def askURL(url): data = bytes(urllib.parse.urlencode({ "setAction": "classroomQuery", "PageAction": "Query", "day_time_text": "0011000000000", "school_area_code": "1", "building": "13", "week_no": "256" , "day_no": "2", "day_time1": "ON", "B1": "查询"}), encoding="utf-8") headers = { # 模拟浏览器头部信息,向浏览器发送消息 "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:99.0) Gecko/20100101 Firefox/99.0" } #用户代理,表示告诉服务器,我么是什么类型的机器,本质上是告诉浏览器,我们可以接受什么类型的内容 request=urllib.request.Request(url,headers=headers,data=data,method="POST") html="" try: resonse = urllib.request.urlopen(request) html=resonse.read().decode("utf-8") #print(html) except urllib.error.URLError as e: if hasattr(e,"code"): print(e.code) if hasattr(e,"reason"): print(e.reason) return html if __name__=="__main__":#当前程序被调用执行时 #调用函数 main()