如何用 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='<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()


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM