博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如何用 python 优雅地完成数据库课设
阅读量:5298 次
发布时间:2019-06-14

本文共 5567 字,大约阅读时间需要 18 分钟。

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 数据库操作

试了好几种包,最后发现还是 pyodbc 好用

pyodbc 官方文档:

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

394393-20180609140652757-248199354.png

2.2 由 E-R 图设计数据库

E-R 图:

394393-20180609171037399-1964901137.png
建表:

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

转载于:https://www.cnblogs.com/shy-/p/9157911.html

你可能感兴趣的文章
Excel-信息函数&数组公式
查看>>
Excel-基本操作
查看>>
面对问题,如何去分析?(分析套路)
查看>>
Excel-逻辑函数
查看>>
面对问题,如何去分析?(日报问题)
查看>>
数据分析-业务知识
查看>>
求职秘籍-简历制作?
查看>>
用配置文件里面的参数值替换yaml模板中的变量值【python】
查看>>
Linux自动输入密码登录用户
查看>>
kvm虚拟机操作相关命令及虚拟机和镜像密码修改
查看>>
全球项目多区域数据同步问题解决方案
查看>>
spring boot jpadata 使用
查看>>
第三周总结
查看>>
jqGrid 3.6.2 中文文档——BasicGrid(3) .
查看>>
BZOJ1208[HNOI2004]宠物收养场——treap
查看>>
nodejs vs python
查看>>
python全栈开发基础【第五篇】Python可变数据类型和不可变数据类型
查看>>
poj-1410 Intersection
查看>>
Ubuntu 16.04 安装Mysql后,初始账号密码位置。
查看>>
艰难中前行
查看>>