python课设_如何用 python 优雅地完成数据库课设

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)

394393-20180609141438416-1751776270.png

2 数据库操作

2.1 连接Microsoft SQLServer 2008 R2

首先在命令行中输入 pip install pyodbc 安装 pyodbc 包

打开 SQL server Configuration Manager,选择 SQL Server 网络配置 - MSSQLSERVER 的协议 - TCP/IP

394393-20180609135643946-2073999762.png

右击属性找到设置的端口,一般是 127.0.0.1:1433

394393-20180609135658952-95001063.png

打开 Microsoft SQL Server Management Studio,连接上本地数据库后右击属性,选择安全性,将服务器身份验证中 SQL SERVER 和 WINDOWS 身份验证模式复选栏勾上。

394393-20180609135901624-52625910.png

打开左侧个人数据库的属性,选择文件,将 sa 赋予所有者权限

394393-20180609140124698-458841293.png

打开安全性 - 登录名 - sa,右击属性给 sa 指定一个密码,并将强制实施密码策略取消选择

394393-20180609140232492-1011707045.png

选择状态,如图所示,将设置完成:

394393-20180609140259238-1028730530.png

新建一个 py 文件,输入下列代码(注意将 yourpassword 处改为自己的密码):

import pyodbc

cnxn = 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)

394393-20180609140652757-248199354.png

2.2 由 E-R 图设计数据库

E-R 图:

394393-20180609171037399-1964901137.png

建表:

import pyodbc

cnxn = 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.request

import pyodbc

import re

for 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()

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值