本篇文章涉及到的知识点有:Python爬虫,MySQL数据库,html/css/js基础,selenium和phantomjs基础,MVC设计模式,ORM(对象关系映射)框架,django框架(Python的web开发框架),apache服务器,linux(centos 7为例)基本操作。因此适合有以上基础的同学学习。

声明:本博文只是为了纯粹的技术交流,敏感信息本文会有所过滤,大家见谅(由于任何缘故导致长江大学教务处网站出现问题,都与本人无关)。

实现思路:在没有教务处数据接口的前提下(学生的信息安全),那也只有自己写爬虫去模拟登陆教务处,然后爬数据,为了防止教务处网站崩溃,导致爬虫失败,可以进行数据缓存,下次可以直接从自己的数据库中取数据,而我们要做的就是定时更新数据与教务处实现同步。

技术架构:centos 7 + apache2.4 + mariadb5.5 + Python2.7.5 + mod_wsgi 3.4 + django1.11

------------------------------------------------------------------------

一、Python爬虫:

1、先看一下登录入口 

我们这里用FireFox进行抓包分析,我们发现登录是post上去的,并且带有7个参数,发现有验证码,此时有两种解决办法,一种是运用现在很火的技术用DL做图片识别,一种是down下来让用户自己输。第一种成本比较高。。等不忙了可以试一下,记得Python有个库叫Pillow还是PIL可以做图片识别,,暑假用TF试一下。第二种很low就不说了。

2、 还有种高大上的方式,,,可以不用管验证码,这里就不细说了,我们模拟登陆上去:

  1. #coding:utf8
  2. from bs4 import BeautifulSoup
  3. import urllib
  4. import urllib2
  5. import requests
  6. import sys
  7.  
  8. reload(sys)
  9. sys.setdefaultencoding('gbk')
  10.  
  11. loginURL = "教务处登陆地址"
  12. cjcxURL = "http://jwc2.yangtzeu.edu.cn:8080/cjcx.aspx"
  13. html = urllib2.urlopen(loginURL)
  14. soup = BeautifulSoup(html,"lxml")
  15. __VIEWSTATE = soup.find(id="__VIEWSTATE")["value"]
  16. __EVENTVALIDATION = soup.find(id="__EVENTVALIDATION")["value"]
  17.  
  18. data = {
  19. "__VIEWSTATE":__VIEWSTATE,
  20. "__EVENTVALIDATION":__EVENTVALIDATION,
  21. "txtUid":"账号",
  22. "btLogin":"%B5%C7%C2%BC",
  23. "txtPwd":"密码",
  24. "selKind":""
  25. }
  26. header = {
  27. # "Host":"jwc2.yangtzeu.edu.cn:8080",
  28. "User-Agent":"Mozilla/5.0 (Windows NT 10.0;… Gecko/20100101 Firefox/54.0",
  29. "Accept":"text/html,application/xhtml+x…lication/xml;q=0.9,*/*;q=0.8",
  30. "Accept-Language":"zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3",
  31. "Accept-Encoding":"gzip, deflate",
  32. "Content-Type":"application/x-www-form-urlencoded",
  33. # "Content-Length":"644",
  34. "Referer":"http://jwc2.yangtzeu.edu.cn:8080/login.aspx",
  35. # "Cookie":"ASP.NET_SessionId=3zjuqi0cnk5514l241csejgx",
  36. # "Connection":"keep-alive",
  37. # "Upgrade-Insecure-Requests":"1",
  38. }
  39.  
  40. UserSession = requests.session()
  41. Request = UserSession.post(loginURL,data,header)
  42. Response = UserSession.get(cjcxURL,cookies = Request.cookies,headers=header)
  43. soup = BeautifulSoup(Response.content,"lxml")
  44. print soup

接下来我们可以看到:

再来post(此代码接上面):

  1. __VIEWSTATE2 = soup.find(id="__VIEWSTATE")["value"]
  2. __EVENTVALIDATION2 = soup.find(id="__EVENTVALIDATION")["value"]
  3.  
  4. AllcjData = {
  5. "__EVENTTARGET":"btAllcj",
  6. "__EVENTARGUMENT":"",
  7. "__VIEWSTATE":__VIEWSTATE2,
  8. "__EVENTVALIDATION":__EVENTVALIDATION2,
  9. "selYear":"",
  10. "selTerm":"",
  11. # "Button2":"%B1%D8%D0%DE%BF%CE%B3%C9%BC%A8"
  12. }
  13. AllcjHeader = {
  14. # "Host":"jwc2.yangtzeu.edu.cn:8080",
  15. "User-Agent":"Mozilla/5.0 (Windows NT 10.0;… Gecko/20100101 Firefox/54.0",
  16. "Accept":"text/html,application/xhtml+x…lication/xml;q=0.9,*/*;q=0.8",
  17. "Accept-Language":"zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3",
  18. "Accept-Encoding":"gzip, deflate",
  19. "Content-Type":"application/x-www-form-urlencoded",
  20. # "Content-Length":"644",
  21. "Referer":"http://jwc2.yangtzeu.edu.cn:8080/cjcx.aspx",
  22. # "Cookie":,
  23. "Connection":"keep-alive",
  24. "Upgrade-Insecure-Requests":"",
  25. }
  26. Request1 = UserSession.post(cjcxURL,AllcjData,AllcjHeader)
  27. Response1 = UserSession.get(cjcxURL,cookies = Request.cookies,headers=AllcjHeader)
  28. soup = BeautifulSoup(Response1.content,"lxml")
  29. print soup

发现不行。。。这次get的页面还是原来的页面。。。我觉得有两种原因导致这次post失败:一是asp.net的__VIEWSTATE和__EVENTVALIDATION变量导致post失败,二是一个form多个button用了js做判断,导致爬虫失败,对于动态加载的页面,普通爬虫还是不行。。。。

3、再来点高大上的用selenium(web自动化测试工具,可以模拟鼠标点击)+ phantomjs(没有界面的浏览器,比chrome和Firefox都要快)

selenium安装:pip install selenium

phantomjs安装:

(1)地址:http://phantomjs.org/download.html(我下载的是Linux 64位的)

(2)解压缩:tar -jxvf phantomjs-2.1.1-linux-x86_64.tar.bz2 /usr/share/  

(3)安装依赖:yum install fontconfig freetype libfreetype.so.6 libfontconfig.so.1

(4)配置环境变量:export PATH=$PATH:/usr/share/phantomjs-2.1.1-linux-x86_64/bin

(5)shell下输入phantomjs,如果能进入命令行,安装成功。

请忽略我的注释:

  1. #coding:utf8
  2. from bs4 import BeautifulSoup
  3. from selenium import webdriver
  4. from selenium.webdriver.common.keys import Keys
  5. import time
  6. import urllib
  7. import urllib2
  8. import sys
  9.  
  10. reload(sys)
  11. sys.setdefaultencoding('utf8')
  12.  
  13. driver = webdriver.PhantomJS();
  14. driver.get("教务处登录地址")
  15. driver.find_element_by_name('txtUid').send_keys('账号')
  16. driver.find_element_by_name('txtPwd').send_keys('密码')
  17. driver.find_element_by_id('btLogin').click()
  18. cookie=driver.get_cookies()
  19. driver.get("http://jwc2.yangtzeu.edu.cn:8080/cjcx.aspx")
  20. #print driver.page_source
  21. #driver.find_element_by_xpath("//input[@name='btAllcj'][@type='button']")
  22. #js = "document.getElementById('btAllcj').onclick=function(){__doPostBack('btAllcj','')}"
  23. #js = "var ob; ob=document.getElementById('btAllcj');ob.focus();ob.click();)"
  24. #driver.execute_script("document.getElementById('btAllcj').click();")
  25. #time.sleep(2) #让操作稍微停一下
  26. #driver.find_element_by_link_text("全部成绩").click() #找到‘登录’按钮并点击
  27. #time.sleep(2)
  28. #js1 = "document.Form1.__EVENTTARGET.value='btAllcj';"
  29. #js2 = "document.Form1.__EVENTARGUMENT.value='';"
  30. #driver.execute_script(js1)
  31. #driver.execute_script(js2)
  32. #driver.find_element_by_name('__EVENTTARGET').send_keys('btAllcj')
  33. #driver.find_element_by_name('__EVENTARGUMENT').send_keys('')
  34. #js = "var input = document.createElement('input');input.setAttribute('type', 'hidden');input.setAttribute('name', '__EVENTTARGET');input.setAttribute('value', '');document.getElementById('Form1').appendChild(input);var input = document.createElement('input');input.setAttribute('type', 'hidden');input.setAttribute('name', '__EVENTARGUMENT');input.setAttribute('value', '');document.getElementById('Form1').appendChild(input);var theForm = document.forms['Form1'];if (!theForm) { theForm = document.Form1;}function __doPostBack(eventTarget, eventArgument) { if (!theForm.onsubmit || (theForm.onsubmit() != false)) { theForm.__EVENTTARGET.value = eventTarget; theForm.__EVENTARGUMENT.value = eventArgument; theForm.submit(); } }__doPostBack('btAllcj', '')"
  35. #js = "var script = document.createElement('script');script.type = 'text/javascript';script.text='if (!theForm) { theForm = document.Form1;}function __doPostBack(eventTarget, eventArgument) { if (!theForm.onsubmit || (theForm.onsubmit() != false)) { theForm.__EVENTTARGET.value = eventTarget; theForm.__EVENTARGUMENT.value = eventArgument; theForm.submit(); }}';document.body.appendChild(script);"
  36. #driver.execute_script(js)
  37. driver.find_element_by_name("Button2").click()
  38. html=driver.page_source
  39. soup = BeautifulSoup(html,"lxml")
  40. print soup
  41. tables = soup.findAll("table")
  42. for tab in tables:
      for tr in tab.findAll("tr"):
        print "--------------------"
        for td in tr.findAll("td")[0:3]:
          print td.getText()

现在只能拿到必修课成绩。。。。。因为全部成绩是ASP生成的js触发的。。。而不是直接submit。。。正在寻找解决的办法。下面开始我们数据库的设计。。。

二、Mariadb学生数据库设计,,,这里引用了我们SQL server数据库原理上机的内容。。。

我的建库语句:

  1. create database jwc character set utf8;
  2.  
  3. use jwc;
  4.  
  5. create table Student(
  6. Sno char(9) primary key,
  7. Sname varchar(20) unique,
  8. Sdept char(20),
  9. Spwd char(20)
  10. );
  11. create table Course(
  12. Cno char(2) primary key,
  13. Cname varchar(30) unique,
  14. Credit numeric(2,1)
  15. );
  16. create table SC(
  17. Sno char(9) not null,
  18. Cno char(2) not null,
  19. Grade int check(Grade>=0 and Grade<=100),
  20. primary key(Sno,Cno),
  21. foreign key(Sno) references Student(Sno),
  22. foreign key(Cno) references Course(Cno)
  23. );

三、Python web环境的搭建(LAMP):

1、因为这次选的http服务器时apache,所以要安装mod_wsgi(python通用网关接口)来实现apache和Python程序的交互。。。如果用nginx就要安装配置uwsgi。。。类似java的servlet和PHP的php-fpm。

安装:yum install mod_wsgi

配置:vim /etc/httpd/conf/httpd.conf

这个配置花费了我不少心思和时间。。。网上的有很多错误。。。最标准的Python web django开发配置。。。拿走不谢。

  1. #config python web
  2. LoadModule wsgi_module modules/mod_wsgi.so
  3. <VirtualHost *:>
  4. ServerAdmin root@Vito-Yan
  5. ServerName www.yuol.onlne
  6. ServerAlias yuol.online
  7.  
  8. Alias /media/ /var/www/html/jwc/media/
  9. Alias /static/ /var/www/html/jwc/static/
  10. <Directory /var/www/html/jwc/static/>
  11. Require all granted
  12. </Directory>
  13.  
  14. WSGIScriptAlias / /var/www/html/jwc/jwc/wsgi.py
  15. # DocumentRoot "/var/www/html/jwc/jwc"
  16. ErrorLog "logs/www.yuol.online-error_log"
  17. CustomLog "logs/www.yuol.online -access_log" common
  18.  
  19. <Directory "/var/www/html/jwc/jwc">
  20. <Files wsgi.py>
  21. AllowOverride All
  22. Options Indexes FollowSymLinks Includes ExecCGI
  23. Require all granted
  24. </Files>
  25. </Directory>
  26. </VirtualHost>

2、下面来安装django。。。pip install django。。。。搞定。

查看django的版本:python -m django --version

官网地址:https://www.djangoproject.com

新建项目:django-admin.py startproject jwc(我的是在/var/www/html下建的,apache的网站根目录)

3、apcehe的配置:就不贴了,把上面的jwc改成jwc2,然后端口改成9000,然后Listen 9000(为什么用9000呢,第一个项目jwc用的是8080,django自带的服务器用python manage.py runserver可以开启,它的默认端口是8000,所以不用8000,以免冲突,我的jsp项目的tomcat服务器用的是9090端口,以免冲突,最好不用,常见的就9000端口了,其他不敢乱用)。

4、 settings.py的配置:

DEBUG = True 调试开启

ALLOWED_HOSTS = ['192.168.47.128'] 添加主机

5、wsgi.py配置,不要问我为什么。。。我也不知道。。用apache服务器启动django项目这样做就行了。。。如果用django自带的server就不用改了。。。

  1. """
  2. WSGI config for jwc2 project.
  3.  
  4. It exposes the WSGI callable as a module-level variable named ``application``.
  5.  
  6. For more information on this file, see
  7. https://docs.djangoproject.com/en/1.11/howto/deployment/wsgi/
  8. """
  9.  
  10. #import os
  11.  
  12. #from django.core.wsgi import get_wsgi_application
  13.  
  14. #os.environ.setdefault("DJANGO_SETTINGS_MODULE", "jwc2.settings")
  15.  
  16. #application = get_wsgi_application()
  17.  
  18. import os
  19. from os.path import join,dirname,abspath
  20. PROJECT_DIR = dirname(dirname(abspath(__file__)))
  21.  
  22. import sys
  23. sys.path.insert(0,PROJECT_DIR)
  24. os.environ.setdefault("DJANGO_SETTINGS_MODULE", "jwc2.settings")
  25.  
  26. from django.core.wsgi import get_wsgi_application
  27. application = get_wsgi_application()

然后就大功告成。。。。Python web环境算是搭建完成。。。

四、开启我们的第一个django项目应用。。。

1、新建成绩查询的应用 python manage.py startapp cjcx

2、在settings.py中添加应用

3、在views.py里写下写下第一行代码。。。。

  1. # -*- coding: utf-8 -*-
  2. from __future__ import unicode_literals
  3. from django.http import HttpResponse
  4. from django.shortcuts import render
  5.  
  6. # Create your views here.
  7.  
  8. def index(request):
  9. return HttpResponse("Hello,YUOL!")

4、在urls.py下添加url

  1. from django.conf.urls import url
  2. from django.contrib import admin
  3. import cjcx.views as cj
  4.  
  5. urlpatterns = [
  6. url(r'^admin/', admin.site.urls),
  7. url(r'^cjcx/',cj.index),
  8. ]

5、Hello,YUOL!

6、刚刚上面的4还可以换种方法。。。。

在cjcx应用下面新建urls.py

  1. from django.conf.urls import url
  2. from . import views
  3.  
  4. urlpatterns = [
  5. url(r'^$', views.index),
  6. ]

修改jwc2下面的urls.py(项目根路径)

  1. from django.conf.urls import url, include
  2. from django.contrib import admin
  3.  
  4. urlpatterns = [
  5. url(r'^admin/', admin.site.urls),
  6. url(r'^cjcx/', include('cjcx.urls')),
  7. ]

7、写前端页面。。。。。

在cjcx应用下面新建templates文件夹放我们的html文件(请暂时忽略动态加载的代码,我懒得删了)

  1. <html>
  2.  
  3. <head>
  4. <title>YUOL成绩查询系统</title>
  5. <style type="text/css">
  6. #border {
  7. margin: 0 auto;
  8. width: 500px;
  9. min-height: 500px;
  10. background-color: #FFFFFF;
  11. border: 1px solid #000000;
  12. }
  13.  
  14. #button {}
  15. </style>
  16. </head>
  17.  
  18. <body style="text-align:center">
  19. <div id="border">
  20. <h1>YUOL成绩查询系统</h1><br/>
  21. <form action="" method="post"> 账号:
  22. <input type="text" id="xuehao" name="Sno" /><br/> 密码:
  23. <input type="password" id="pwd" name="Spwd" /><br/><br/>
  24. <input type="submit" value="查询" id="submit" /><br/>
  25. <div style="text-align:left;padding-left:50px;">
  26. -----------------------------------------------------------<br/>
  27. 姓名:{{ student.Sname }}<br/>
  28. 学号:{{ student.Sno}}<br/>
  29. 班级:{{ student.Sdept }}<br/>
  30. </div>
  31. -----------------------------------------------------------<br/>
  32. <div>
  33. &nbsp;&nbsp; &nbsp;&nbsp;
  34. <br>
  35. <div style="display:inline-block;width:150px;">
  36. 科目:<br>
  37. {{ course.Cname }}
  38. </div>
  39. <div style="display:inline-block;width:150px;">
  40. 成绩:<br>
  41. {{ sc.Grade }}
  42. </div>
  43. <div style="display:inline-block;width:150px;">
  44. 学分:<br>
  45. {{ course.Credit }}
  46. </div>
  47.  
  48. </div>
  49. </form>
  50. </div>
  51. </body>
  52.  
  53. </html>

修改views.py:

  1. # -*- coding: utf-8 -*-
  2. from __future__ import unicode_literals
  3. from django.http import HttpResponse
  4. from django.shortcuts import render
  5.  
  6. # Create your views here.
  7.  
  8. def index(request):
  9. return render(request, 'jwcjcx.html')

然后就成这样了。。。。。

8、根据jwc数据库设计Models。。。。

django默认支持的是sqllite,,现在换成 mariadb,修改settings.py

  1. DATABASES = {
  2. 'default': {
  3. # 'ENGINE': 'django.db.backends.sqlite3',
  4. # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
  5. 'ENGINE': 'django.db.backends.mysql',
  6. 'NAME': 'jwc2',
  7. 'USER':'root',
  8. 'PASSWORD':'你的密码',
  9. 'HOST':'localhost',
  10. 'PORT':'',
  11. }
  12. }

9、去models.py下面建表吧。。。。

  1. # -*- coding: utf-8 -*-
  2. from __future__ import unicode_literals
  3.  
  4. from django.db import models
  5.  
  6. # Create your models here.
  7.  
  8. class Student(models.Model):
  9. Sno=models.CharField(max_length=9,primary_key=True)
  10. Sname=models.CharField(max_length=20,unique=True)
  11. Sdept=models.CharField(max_length=20)
  12. Spwd=models.CharField(max_length=20)
  13.  
  14. class Course(models.Model):
  15. Cno=models.CharField(max_length=2,primary_key=True)
  16. Cname=models.CharField(max_length=30,unique=True)
  17. Credit=models.DecimalField(max_digits=2, decimal_places=1)
  18.  
  19. class SC(models.Model):
  20. Sno=models.CharField(max_length=9)
  21. Cno=models.CharField(max_length=2)
  22. Grade=models.IntegerField()
  23.  
  24. def __unicode__(self):
  25. return self.Sno

这种ORM免去了写sql语句的麻烦,直接把表封装成一个类继承model.Model,查询字段直接‘点’操作。。。很方便。

然后生成数据模型表:python manage.py makemigrations

再将数据表迁移到mariadb数据库:python manage.py migrate

生成cjcx_三个表,其他是django默认的不用管,另外数据库要自己先建(create database jwc2 charset=utf8;)

10、使用django admin做数据管理。。。。Admin真心好用这是django框架最显著的一个优势。。。

创建用户:python manage.py createsuperuser

然后在主机后面加/admin就可以登录。。。我们发现它的css和img丢失了

解决办法:

在jwc2下面建一个静态文件夹:static

修改settings.py。。。在最后一行添加STATIC_ROOT = "/var/www/html/jwc2/static/",LANGUAGE_CODE = 'zh-Hans'(改成中文的admin)

执行命令 :python manage.py collectstatic

上面apache的静态文件配置取消注释。。。

这样进去看不到数据表,需要修改admin.py引入models

  1. # -*- coding: utf-8 -*-
  2. from __future__ import unicode_literals
  3.  
  4. from django.contrib import admin
  5. import models
  6. # Register your models here.
  7. admin.site.register(models.Student)
  8. admin.site.register(models.Course)
  9. admin.site.register(models.SC)

可以直接操作数据库了。。。django的强大之处。。

11、下面开始我们最重要的业务逻辑。。

数据入库(MVC中的M,models):我这里把Course表的Cno给删了,把SC表的Cno换成Cname了。。。和上面有所不同,只需要把库删了重新生成数据表即可。。。

  1. #encoding=utf-8
  2. from bs4 import BeautifulSoup
  3. from selenium import webdriver
  4. from selenium.webdriver.common.keys import Keys
  5. import MySQLdb
  6. import time
  7. import urllib
  8. import urllib2
  9. import sys
  10.  
  11. reload(sys)
  12. sys.setdefaultencoding('utf8')
  13.  
  14. conn= MySQLdb.connect(
  15. host='localhost',
  16. port = 3306,
  17. user='root',
  18. passwd='密码',
  19. db ='jwc2',
  20. charset='utf8'
  21. )
  22. cur = conn.cursor()
  23.  
  24. driver = webdriver.PhantomJS();
  25. driver.get("教务处登录入口")
  26. driver.find_element_by_name('txtUid').send_keys('账号')
  27. driver.find_element_by_name('txtPwd').send_keys('密码')
  28. driver.find_element_by_id('btLogin').click()
  29. cookie=driver.get_cookies()
  30. driver.get("http://jwc2.yangtzeu.edu.cn:8080/cjcx.aspx")
  31. driver.find_element_by_name("Button2").click()
  32. html=driver.page_source
  33. #html = open("btAllcj.html","r")
  34. soup = BeautifulSoup(html,"lxml")
  35. Sno = str(soup.find(id="lbXH").getText())
  36. Sname = str(soup.find(id="lbXm").getText())
  37. Sdept = str(soup.find(id="lbBj").getText())
  38. Student = (Sno,Sname,Sdept,'')
  39. sql = "insert into cjcx_student values(%s,%s,%s,%s)"
  40. cur.execute(sql,Student)
  41. id = 0
  42. tables = soup.findAll("table")
  43. for tab in tables[1:2]:
  44. for tr in tab.findAll("tr")[1:]:
  45. count = 0
  46. for td in tr.findAll("td"):
  47. count += 1
  48. if count==1:
  49. Cname = td.getText()
  50. if count==2:
  51. Grade = td.getText()
              id += 1
  52. sql = "insert into cjcx_sc values(%s,%s,%s,%s)"
  53. SC = (id,Sno,Cname,Grade)
  54. cur.execute(sql,SC)
  55. if count==3:
  56. Credit = td.getText()
  57. sql = "insert into cjcx_course values(%s,%s)"
  58. Course = (Cname,Credit)
  59. cur.execute(sql,Course)
  60. conn.commit()
  61. cur.close()
  62. conn.close()

业务逻辑views.py(MVC中的V,views)

  1. # -*- coding: utf-8 -*-
  2. from __future__ import unicode_literals
  3. from django.http import HttpResponse
  4. from django.shortcuts import render
  5. from . import models
  6.  
  7. # Create your views here.
  8.  
  9. def index(request):
  10. return render(request, 'jwcjcx.html')
  11.  
  12. def search_action(request):
  13. Sno = request.POST['Sno']
  14. Spwd = request.POST['Spwd']
  15. #这里放爬虫和数据入库的代码。。。。。
  16. student = models.Student.objects.get(Sno=Sno)
  17. pwd = student.Spwd
  18. if Spwd==pwd:
  19. sc = models.SC.objects.filter(Sno=Sno)
  20. # course = models.Course.objects.filter(Cname=sc.Cname)
  21. return render(request,'jwcjcx.html',{'student':student, 'sc':sc})

修改urls.py(MVC中的C,Controller)

jwc2项目urls:

  1. from django.conf.urls import url,include
  2. from django.contrib import admin
  3.  
  4. urlpatterns = [
  5. url(r'^admin/', admin.site.urls),
  6. url(r'^cjcx/',include('cjcx.urls', namespace='cjcx')),
  7. ]

cjcx应用urls:

  1. from django.conf.urls import url
  2. from . import views
  3.  
  4. urlpatterns = [
  5. url(r'^$', views.index),
  6. url(r'^search/$',views.search_action,name='search_action'),
  7. ]

12、前端数据渲染。。。。

  1. <html>
  2.  
  3. <head>
  4. <title>YUOL成绩查询系统</title>
  5. <style type="text/css">
  6. #border {
  7. margin: 0 auto;
  8. width: 500px;
  9. min-height: 500px;
  10. background-color: #FFFFFF;
  11. border: 1px solid #000000;
  12. }
  13.  
  14. #button {}
  15. </style>
  16. </head>
  17.  
  18. <body style="text-align:center">
  19. <div id="border">
  20. <h1>YUOL成绩查询系统</h1><br/>
  21. <form action="{% url 'cjcx:search_action' %}" method="post">{% csrf_token %} 账号:
  22. <input type="text" id="xuehao" name="Sno" /><br/> 密码:
  23. <input type="password" id="pwd" name="Spwd" /><br/><br/>
  24. <input type="submit" value="查询" id="submit" /><br/>
  25. <div style="text-align:left;padding-left:50px;">
  26. -----------------------------------------------------------<br/>
  27. 姓名:{{ student.Sname }}<br/>
  28. 学号:{{ student.Sno}}<br/>
  29. 班级:{{ student.Sdept }}<br/>
  30. </div>
  31. -----------------------------------------------------------<br/>
  32. <div>
  33. &nbsp;&nbsp; &nbsp;&nbsp;
  34. <br/>
  35. <div style="display:inline-block;width:200px;">
  36. 科目:<br/>
  37. {% for sc in sc %}
  38. {{ sc.Cname }}<br/>
  39. -------------------<br/>
  40. {% endfor %}
  41. </div>
  42. <div style="display:inline-block;width:100px;">
  43. 成绩:<br/>
  44. {% for sc in sc %}
  45. {{ sc.Grade }}<br/>
  46. ------<br/>
  47. {% endfor %}
  48. </div>
  49. <div style="display:inline-block;width:150px;">
  50. 学分:<br/>
  51. {% for course in course %}
  52. {{ course.Credit }}
  53. {% endfor %}
  54. </div>
  55.  
  56. </div>
  57. </form>
  58. </div>
  59. </body>
  60.  
  61. </html>

收工。。。。。。

写了两天两夜,实在卡不住了,后面学分就没写了。。。。。。。。。爬虫还不稳定,逻辑判断几乎没写。。。只是简单实现了功能。。。

最后附上一张照片:

暑假闲着没事第一弹:基于Django的长江大学教务处成绩查询系统的更多相关文章

  1. python 全栈开发,Day95(RESTful API介绍,基于Django实现RESTful API,DRF 序列化)

    昨日内容回顾 1. rest framework serializer(序列化)的简单使用 QuerySet([ obj, obj, obj]) --> JSON格式数据 0. 安装和导入: p ...

  2. web 框架的本质及自定义web框架 模板渲染jinja2 mvc 和 mtv框架 Django框架的下载安装 基于Django实现的一个简单示例

    Django基础一之web框架的本质 本节目录 一 web框架的本质及自定义web框架 二 模板渲染JinJa2 三 MVC和MTV框架 四 Django的下载安装 五 基于Django实现的一个简单 ...

  3. Hadoop基础-MapReduce的工作原理第一弹

    Hadoop基础-MapReduce的工作原理第一弹 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在本篇博客中,我们将深入学习Hadoop中的MapReduce工作机制,这些知识 ...

  4. RMQ_第一弹_Sparse Table

    title: RMQ_第一弹_Sparse Table date: 2018-09-21 21:33:45 tags: acm RMQ ST dp 数据结构 算法 categories: ACM 概述 ...

  5. 基于Django的Disqus如何支持每月80亿PV(转)

    原文:基于Django的Disqus如何支持每月80亿PV 本文由 伯乐在线 - 贱圣OMG 翻译.未经许可,禁止转载!英文出处:Matt Robenolt.欢迎加入翻译小组. 现在我们Disqus能 ...

  6. 第一章、Django概述

    目录 第一章.Django概述 一.了解软件开发架构 二.HTTP协议 三.响应状态码 四.请求方式 五.基于wsgiref模块 六..动静态网页 七.python三大主流web框架 八.安装Djan ...

  7. JVM第一弹

    JVM第一弹 基本概念 JVM是可运行java代码的假想计算机,包括一套字节码指令集,一组寄存器,一个栈,一个垃圾回收.堆和一个存储方法域.JVM是运行在操作系统之上的,它与硬件没有直接的交互. 运行 ...

  8. 六、Django学习之基于下划线的跨表查询

    六.Django学习之基于下划线的跨表查询 一对一 正向查询的例子为 已知用户名,查询用户的电话号码.反向查询例子反之. 正向查询 其中下划线前的表示表名,无下划线的表示的是Author表 resul ...

  9. Spring Boot 第一弹,问候一下世界!!!

    持续原创输出,点击上方蓝字关注我吧 目录 前言 什么是Spring Boot? 如何搭建一个Spring Boot项目? 第一个程序 Hello World 依赖解读 什么是配置文件? 什么是启动类? ...

随机推荐

  1. asp.net webapi 的Request如何获取参数

    public class BaseApiController : ApiController { private HttpRequestBase _request; /// 全局Requests对象 ...

  2. Win7下emacs简单配置

    ;;win7下.emacs在C:\Users\用户名\AppData\Roaming目录下 在.emacs文件中添加 ;; cancel welcome page取消欢迎界面(setq inhibit ...

  3. webapi读取上传的文件流

    逻辑说明 这里未引用System.Web.Mvc. 主要使用MultipartMemoryStreamProvider对象从Request中获取文件流. var provider = new Mult ...

  4. 【Teradata SQL】行转列函数TDStats.udfConcat

    TDstats.udfConcat为Teradata自带UDF,定义如下: show function tdstats.udfconcat; REPLACE FUNCTION tdstats.UDFC ...

  5. MySQL 常用语句总结

    用一个表更新另一个表 UPDATE table1 t1, table2 t2 SET t1.field1 = t2.field1, t1.field2 = t2.field2 WHERE t1.fie ...

  6. C++一些基本数据结构:字面常量、符号常量、枚举常量

    常量:C++包括两种常量,字面常量和符号常量. 字面常量:指的是直接输入到程序中的值 比如:in myAge=26: myAge是一个int类型变量,而26是一个字面常量. 符号常量:指的是用名称表示 ...

  7. .NET开源快速开发框架Colder发布 (NET452+AdminLTE版)

    .NET开源快速开发框架Colder(NET452+AdminLTE版) 引言 半年前将基于Easyui的快速开发框架开源,三个版本(NET4.52,NETCore和NET4.0)总共荣获200+星, ...

  8. 菜鸟学IT之第一次作业

    作业的要求来自于:https://www.cnblogs.com/greyzeng/p/9581624.html 反思· 为何要来上课并且认真参与? 在大学中的师生关系? 自我简述题目 心得· 学习态 ...

  9. python_while

    while 格式 while 条件 : pass 使用 while True : print("精忠报国") print("粉红的回忆") print(&quo ...

  10. VScode插件以及配置

    Auto Rename Tag —— 自动同步修改标签 AutoFileName —— 自动补全路径提示 background —— 一个萌萌的插件,可以自己设置vsc的背景图 Bootstrap 3 ...