0 前言
偶然间发现 Google 收录了学校实验打卡系统的接口,正好要做数据库课设,便拿来作为 environment。
机房居然装了 python ,早就听说 python 写爬虫速度一流,课上的 DDL 做完也闲,便决定用 python 完成这次数据库课设。1 爬虫
1.1 HTTP 访问
爬虫访问网页需要 import 一个 HTTP 访问包,由于接口过于简单,直接 GET 请求即可得到数据,连 COOKIES 都不用,直接用 urllib 即可。
url="yoururladdress"req=urllib.request.Request(url)resp=urllib.request.urlopen(req)data=resp.read().decode('GBK')
1.2 爬取内容
爬到的网页需要批量取出两个已知字符串的中间文本,可以使用正则表达式轻松解决,import re 包即可。
w1=''w2=''pat=re.compile(w1+'(.*?)'+w2,re.S)sybz=pat.findall(data)
2 数据库操作
试了好几种包,最后发现还是 pyodbc 好用
pyodbc 官方文档:2.1 连接Microsoft SQLServer 2008 R2
首先在命令行中输入 pip install pyodbc
安装 pyodbc 包
import pyodbccnxn = pyodbc.connect('DRIVER={SQL Server};SERVER=127.0.0.1;DATABASE=SPDG;UID=sa;PWD=yourpassword')cursor = cnxn.cursor()
随便执行一个命令看看效果:
cursor.execute("SELECT * FROM SPB")row = cursor.fetchall()print(row)
2.2 由 E-R 图设计数据库
E-R 图:
建表:import pyodbccnxn = pyodbc.connect('DRIVER={SQL Server};SERVER=127.0.0.1;DATABASE=SYDK;UID=sa;PWD=test')cursor = cnxn.cursor()cursor.execute(""" Create Table XSB ( 班级 varchar(20), 学号 char(11), 姓名 varchar(20) ) """)#学生表cursor.execute(""" Create Table KCB ( 课程代码 varchar(20), 课程名称 varchar(255), 开课学院 varchar(20) ) """)#课程表cursor.execute(""" Create Table JSB ( 姓名 varchar(20), 联系电话 varchar(20) ) """)#教师表cursor.execute(""" Create Table SYXXB ( 实验编号 varchar(20), 课程代码 varchar(20), 实验项目 varchar(20), 上课老师 varchar(20), 辅助教师 varchar(20), 上课日期 varchar(255), 星期几 varchar(20), 实验中心 varchar(255), 实验分室 varchar(255), 上课地点 varchar(255) ) """)#实验信息表cursor.execute(""" Create Table SYDKB ( 实验编号 varchar(20), 学号 varchar(20), 实际上课时间 varchar(255), 状态 varchar(255) ) """)#实验打卡表cursor.commit()cursor.close()
爬数据插入表:
这里注意避免在调试过程中插入重复的表值,以及老师姓名后也存在打卡时间的情况。import urllib.requestimport pyodbcimport refor i in range(33102,33300): cnxn = pyodbc.connect('DRIVER={SQL Server};SERVER=127.0.0.1;DATABASE=SYDK;UID=sa;PWD=test') cursor = cnxn.cursor() cursor.execute("SELECT * FROM SYXXB WHERE 实验编号="+str(i)) row = cursor.fetchall() print(i) if (len(row)!=0): cursor.close() continue url= try: req=urllib.request.Request(url) resp=urllib.request.urlopen(req) except: print("oppops") continue data=resp.read().decode('GBK') w1='' w2='' pat=re.compile(w1+'(.*?)'+w2,re.S) sybz=pat.findall(data) if(len(sybz)==0): continue del(sybz[9]) w1='' w2='' pat2=re.compile(w1+'(.*?)'+w2,re.S) syb=pat2.findall(data) del(syb[9]) for j in range(0,len(syb)): print (syb[j]+':'+sybz[j]) if(sybz[4].find("(")!=-1): tmp=sybz[4] tmp=tmp[0:tmp.find("(")] sybz[4]=tmp w1='' w2='' pat3=re.compile(w1+'(.*?)'+w2,re.S) xsbz=pat3.findall(data) #print(xsbz) xsb=xsbz[0:5].copy() for j in range(0,5): del xsbz[0] for j in range(len(xsbz)): xsbz[j] = xsbz[j].replace('', '') xsbz[j] = xsbz[j].replace('', '') cursor.execute("SELECT * FROM JSB WHERE 姓名=\'"+sybz[4]+"\'") row = cursor.fetchall() if (len(row)==0): cursor.execute("insert into JSB values ("+"\'"+sybz[4]+"\'"+",\'" +sybz[5]+"\'"+")") cursor.execute("SELECT * FROM KCB WHERE 课程代码="+sybz[0]) row = cursor.fetchall() if (len(row)==0): cursor.execute("insert into KCB values ("+"\'"+sybz[0]+"\'"+",\'" +sybz[1]+"\'"+",\'"+sybz[2]+"\'"+")") cursor.execute("SELECT * FROM SYXXB WHERE 实验编号="+str(i)) row = cursor.fetchall() if (len(row)==0): cursor.execute("insert into SYXXB values ("+"\'"+str(i)+"\'"+",\'"+sybz[0]+"\'"+",\'" +sybz[3]+"\'"+",\'"+sybz[4]+"\'"+",\'"+sybz[6]+"\'"+",\'" +sybz[7]+"\'"+",\'"+sybz[8]+"\'"+",\'"+sybz[9]+"\'"+",\'" +sybz[10]+"\'"+",\'"+sybz[11]+"\'"+")") cursor.execute("SELECT * FROM SYDKB WHERE 实验编号="+str(i)) row = cursor.fetchall() if (len(row)==0): for j in range(0,int(len(xsbz)/5)): cursor.execute("insert into SYDKB values ("+"\'"+str(i)+"\'"+",\'" +xsbz[j*5+1]+"\'"+",\'"+xsbz[j*5+3]+"\'"+",\'" +xsbz[j*5+4]+"\'"+")") for j in range(0,int(len(xsbz)/5)): cursor.execute("SELECT * FROM XSB WHERE 学号="+xsbz[j*5+1]) row = cursor.fetchall() if (len(row)==0): cursor.execute("insert into XSB values ("+"\'"+xsbz[j*5+0]+"\'"+",\'" +xsbz[j*5+1]+"\'"+",\'"+xsbz[j*5+2]+"\'"+")") cursor.commit() cursor.close()