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='<td width=\'610\' height=\'25\' style=\'padding-left:5px;\'>'
w2='</td></tr>'
pat=re.compile(w1+'(.*?)'+w2,re.S)
sybz=pat.findall(data)

2 数据库操作

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

pyodbc 官方文档:https://github.com/mkleehammer/pyodbc/wiki

2.1 连接Microsoft SQLServer 2008 R2

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

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



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



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



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



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



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



新建一个 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)

2.2 由 E-R 图设计数据库

E-R 图:



建表:

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='<td width=\'610\' height=\'25\' style=\'padding-left:5px;\'>'
w2='</td></tr>'
pat=re.compile(w1+'(.*?)'+w2,re.S)
sybz=pat.findall(data)
if(len(sybz)==0):
continue
del(sybz[9])
w1='<td height=\'25\' style=\'padding-left:5px; width: 82px;\'>'
w2='</td>'
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='<td align=\'center\'>'
w2='</td>'
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('<font color=\'red\'>', '')
xsbz[j] = xsbz[j].replace('</font>', '')
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()

如何用 python 优雅地完成数据库课设的更多相关文章

  1. 如何用python“优雅的”调用有道翻译?

    前言 其实在以前就盯上有道翻译了的,但是由于时间问题一直没有研究(我的骚操作还在后面,记得关注),本文主要讲解如何用python调用有道翻译,讲解这个爬虫与有道翻译的js“斗争”的过程! 当然,本文仅 ...

  2. 用Python优雅的写出送给女儿的藏头诗

    2016年迎来了我的小土匪,忙活了一年,在17年的4月加班的夜里因思念以小土匪的名字写了一首藏头发了朋友圈,不温不火,最近在看python,那么如何用python优雅的用写出这首诗了? 执行 代码 i ...

  3. 如何用Python从海量文本抽取主题?

    摘自https://www.jianshu.com/p/fdde9fc03f94 你在工作.学习中是否曾因信息过载叫苦不迭?有一种方法能够替你读海量文章,并将不同的主题和对应的关键词抽取出来,让你谈笑 ...

  4. Python 学习笔记:Python 操作 SQL Server 数据库

    最近要将数据写到数据库里,学习了一下如何用 Python 来操作 SQL Server 数据库. 一.连接数据库: 首先,我们要连接 SQL Server 数据库,需要安装 pymssql 这个第三方 ...

  5. python高级之操作数据库

    python高级之操作数据库 本节内容 pymysql介绍及安装 使用pymysql执行sql 获取新建数据自增ID fetch数据类型设置 1.pymysql介绍及安装 在python2中连接数据库 ...

  6. python——django使用mysql数据库(二)

    上一篇中,我们已经讲述了如何初始化一个django数据库,这一章就来讲讲在实际的项目中如何使用我们初始化的数据库呢? 如还未进行初始化数据库操作,请参考python——django使用mysql数据库 ...

  7. python——django使用mysql数据库(一)

    之前已经写过如何创建一个django项目,现在我们已经有了一个小骷髅,要想这个web工程变成一个有血有肉的人,我们还需要做很多操作.现在就先来介绍如何在django中使用mysql数据库. 前提:已经 ...

  8. 使用Python编程语言连接MySQL数据库代码

    使用Python编程语言连接MySQL数据库代码,跟大家分享一下: 前几天我用python操作了mysql的数据库,发现非常的有趣,而且python操作mysql的方法非常的简单和快速,所以我把代码分 ...

  9. 第九篇:python高级之操作数据库

    python高级之操作数据库   python高级之操作数据库 本节内容 pymysql介绍及安装 使用pymysql执行sql 获取新建数据自增ID fetch数据类型设置 1.pymysql介绍及 ...

随机推荐

  1. C++中获取汉字拼音首字缩写/全拼及生僻字的处理

    最近一直在修改关于搜索不到生僻字的问题,最后得出结论:对生僻字的处理,办法只有一个,建立一个字库,然后查表找. 可以参考一下:http://download.csdn.net/detail/lshlw ...

  2. python----运行机制

    Python 是一门解释型的编程语言,因此它具有解释型语言的运行机制. 计算机程序,其实就是一组计算机指令集,能真正驱动机器运行的是机器指令,但让普通开发者直接编写机器指令是不现实的,因此就出现了计算 ...

  3. TXT电子书格式怎样转换成epub格式

    怎样将TXT电子书格式转换成epub格式呢?因为很多时候不同的阅读器所支持的电子书格式是有所不同,所以电子书格式转换的问题,在生活中也是会经常出现的问题.如果我们需要将TXT电子书格式转换成epub格 ...

  4. 切分 拆分集合list的方式

    一般有两种,第一是sublist(),代码冗余效率低: 第二种: 引包自 com.google.common.collect.Lists 话不多说直接上实例: List<ContractMode ...

  5. Ubuntu 18.04安装JDK并配置环境变量

    1.官网下载jdk 下载链接 http://www.oracle.com/technetwork/java/javase/downloads/index.html 可以根据自己的系统进行下载 2.进行 ...

  6. Feign 重试解析

    Spring cloud Feign 在restful 调用失败后,会进行重试.在没有到达指定重试次数,会一直重试. @Override public Object invoke(Object[] a ...

  7. 12.1-uC/OS-III调度的内部实现

    1.调度的内部实现通过这两个函数完成调度功能: OSSched()和OSIntExit().OSSched()在任务级被调用, OSIntExit()在中断级被调用.这两个函数都在OS_CORE.C中 ...

  8. DAX/PowerBI系列 - 库存总价值(Inventory Value)

    DAX/PowerBI系列 - 库存总价值(Inventory Value) 欢迎交流与骚扰 难度: ★★☆☆☆(2星) 适用: ★★☆☆☆(2星) 概况: 有多少货(库存)当然重要(对于运营人员), ...

  9. [pat]1068 Find More Coins

    满背包问题,把体积和价值看成相等的.用滚动数组优化,然后额外开辟一个choice数组来记录每次的选择,然后回溯打印.因为要按字典序,先把价值进行排序.假如选最小的商品能装满m的话,那就把判断条件改成大 ...

  10. IdentityServer4授权和认证

    IdentityServer4 简称ids4 oidc了解:http://www.jessetalk.cn/2018/04/04/oidc-asp-net-core/ 是一个去中心化的网上身份认证系统 ...