用Python實現模擬登入正方教務系統搶課
最近學校開始選課,但是如果選課時間與自己的事情衝突,這時候就可以使用Python指令碼自助搶課,搶課的第一步即是模擬登入,需要模擬登入後儲存登入資訊然後再進行操作。
而且整個流程是比較簡單,這是因為正方教務系統是比較舊的,全文的IP地址部分遮擋,請換成你們學校的IP地址。
嘗試登入
首先我們開啟學校的教務系統,隨便輸入,然後提交表單,開啟Chrome的開發者工具中的Network準備抓包把css 圖片之類的過濾掉,發現了default.aspx這個東西
如果你們學校教務系統不使用Cookie則會是這樣
我們可以發現真實的地址是這樣的
http://110.65.10.xxx/(bdq1aj45lpd42o55vqpfgpie)/default2.aspx
隨後我們發現這個網址括號圍起來的一串資訊有點詭異,而且每次進入的時候資訊都不一樣,經過資料查詢,這是一種ASP.NET不使用Cookie會話管理的技術。
不使用 Cookie 的 ASP.NET 會話管理
那這樣就很好辦了,我們只需要登入時記錄下這個資料即可保持登入狀態。
經過測試發現,我們可以隨便偽造一個會話資訊即可一直保持登入狀態,但是為了體現模擬登入的科學性,我們需要先獲取該會話資訊。
如果你們學校教務系統使用Cookie則會是這樣伺服器會返回一個Cookie值,然後在本地儲存,這與下面的會不相同。
獲取會話資訊(不使用Cookie)
這裡我們要使用requests庫,並且要偽造header的UA資訊
經過測試發現,我們只訪問學校的IP地址,會自動重定向至有會話資訊的網址,所以我們先訪問一下IP地址。
class Spider: def __init__(self, url): self.__uid = '' self.__real_base_url = '' self.__base_url = url self.__headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36', } def __set_real_url(self): request = requests.get(self.__base_url, headers=self.__headers) real_url = request.url self.__real_base_url = real_url[:len(real_url) - len('default2.aspx')] return request
上面獲取的url即為帶有會話資訊的網址,儲存的url格式為
http://110.65.10.xxx/(bdq1aj45lpd42o55vqpfgpie)/
儲存為這樣的格式是因為我們要訪問其他地址
獲取會話資訊(使用Cookie)
有些學校的教務系統是使用Cookie的,我們只需要首次get請求時儲存Cookie即可,然後此後一直使用該cookie
def get_cookie():
request = requests.get('http://xxx.xxx.xxx.xxx') #以某教務系統為例子
cookie = requets.cookie
return cookie
而requests中使用Cookie很簡單
只需要這樣
def use_cookie(cookie):
request = requests.get('http://xxx.xxx.xxx.xxx',cookie=cookie)
由於我們學校採用的是無Cookie方案,所以下面的程式碼均沒有傳送Cookie,如果你的學校採用了Cookie,只需要像我上面這樣傳送Cookie就行了。
而如果你們學校使用Cookie,就不必獲取帶有會話資訊的地址了,直接儲存Cookie即可。
或者也可以使用requests的Session自動管理會話資訊,這樣文章下面的程式碼的請求全部改成Session的請求即可,但是首先需要在類的初始化方法中初始化。
def __init__(self):
self.session = requests.Session()
然後我們首先訪問一次網站即可獲取Cookie並且儲存
def get(self):
r = self.session.get(url,headers=headers)
更多的用法可以查詢文件
驗證碼的處理
分析r返回的文字資訊
發現驗證碼的標籤的資源地址為 src=”CheckCode.aspx” ,我們可以直接requests然後下載驗證碼圖片,下載圖片的一種優雅的方式如下
def __get_code(self):
request = requests.get(self.__real_base_url + 'CheckCode.aspx', headers=self.__headers)
with open('code.jpg', 'wb')as f:
f.write(request.content)
im = Image.open('code.jpg')
im.show()
print('Please input the code:')
code = input()
return code
上面的程式碼把圖片儲存為code.jpg,Python有一個Image模組,可以實現自動開啟圖片
這樣驗證碼就展示出來了,我們人工輸入或者轉入打碼平臺皆可
登入資料的構造
這是上面抓的登入post的資料包,
發現有資訊無法被解碼,應該是gb2312編碼,檢視解碼前的編碼
然後將不能解碼的程式碼複製能夠解碼的地方
發現%D1%A7%C9%FA編碼解碼後為學生
這也就對應了學生選項的登入
學號和密碼和驗證碼能夠顯而易見地知道是哪些資訊,但是我們發現有__VIEWSTATE這一項
查詢一下,這是一個表單隱藏資訊,我們可以用BeautifulSoup庫解析可以得出該一項資料的值
這是完整的登入資料包,
def __get_login_data(self, uid, password):
self.__uid = uid
request = self.__set_real_url()
soup = BeautifulSoup(request.text, 'lxml')
form_tag = soup.find('input')
__VIEWSTATE = form_tag['value']
code = self.__get_code()
data = {
'__VIEWSTATE': __VIEWSTATE,
'txtUserName': self.__uid,
'TextBox2': password,
'txtSecretCode': code,
'RadioButtonList1': '學生'.encode('gb2312'),
'Button1': '',
'lbLanguage': '',
'hidPdrs': '',
'hidsc': '',
}
return data
登入
如果登入完成了,如何判斷是否登入成功呢?我們從登入成功返回的介面發現有姓名這一標籤,而我們等一下也是需要學生姓名,所以我們用這個根據來判斷是否登入成功。
程式碼如下,進行了驗證碼使用者名稱和密碼的提示資訊判別
def login(self,uid,password):
while True:
data = self.__get_login_data(uid, password)
request = requests.post(self.__real_base_url + 'default2.aspx', headers=self.__headers, data=data)
soup = BeautifulSoup(request.text, 'lxml')
try:
name_tag = soup.find(id='xhxm')
self.__name = name_tag.string[:len(name_tag.string) - 2]
print('歡迎'+self.__name)
except:
print('Unknown Error,try to login again.')
time.sleep(0.5)
continue
finally:
return True
獲取選課資訊
接下來就是獲取選課資訊了,這裡我們以校公選課為例子,點選進去,進行抓包,headers沒有什麼好注意的,我們只用關注get傳送的包即可
發現有學號與姓名與gnmkdm這一項,姓名我們需要編碼為gb2312的形式才能進行傳送
這裡我們注意headers需要新增Referer項也就是當前訪問的網址,才能進行請求
def __enter_lessons_first(self):
data = {
'xh': self.__uid,
'xm': self.__name.encode('gb2312'),
'gnmkdm': 'N121103',
}
self.__headers['Referer'] = self.__real_base_url + 'xs_main.aspx?xh=' + self.__uid
request = requests.get(self.__real_base_url + 'xf_xsqxxxk.aspx', params=data, headers=self.__headers)
self.__headers['Referer'] = request.url
soup = BeautifulSoup(request.text, 'lxml')
self.__set__VIEWSTATE(soup)
注意到上面有一個設定VIEWSTATE值的函式,這裡等下在選課構造資料包的時候會講
模擬選課
隨便選一門課,然後提交,抓包,看一下有什麼資料傳送
前三個值可以在原網頁中input標籤中找到,由於前兩項為空,就不獲取了,而第三項我們使用soup解析獲取即可,由於這個操作是每請求一次就變化的,我們寫成一個函式,每次請求完成就設定一次。
def __set__VIEWSTATE(self, soup):
__VIEWSTATE_tag = soup.find('input', attrs={'name': '__VIEWSTATE'})
self.__base_data['__VIEWSTATE'] = __VIEWSTATE_tag['value']
而其他資料,我們通過搜尋響應網頁就可以知道他們是幹什麼用的,這裡我只說明我們要用的資料。
TextBox1為搜尋框資料,我們可以用這個來搜尋課程,dpkcmcGrid:txtPageSize為一頁顯示多少資料,經過測試,伺服器最多響應200條。
值得注意的是ddl_xqbs這個校區資料資訊,我所在的校區的數字代號為2,也許不同學校設定有所不同,需要自己設定一下,也可以從網頁中獲取
下面是基礎資料包,由於我們搜尋課程與選擇課程都要使用這個基礎資料包,所以我們直接在init函式裡面新增
self.__base_data = {
'__EVENTTARGET': '',
'__EVENTARGUMENT': '',
'__VIEWSTATE': '',
'ddl_kcxz': '',
'ddl_ywyl': '',
'ddl_kcgs': '',
'ddl_xqbs': '2',
'ddl_sksj': '',
'TextBox1': '',
'dpkcmcGrid:txtChoosePage': '1',
'dpkcmcGrid:txtPageSize': '200',
}
然後我們關注一下這條資料,我們搜尋一下,發現這是課程的提交選課的程式碼,所以我們也可以直接從網頁中獲取,而on表示選項被選上
kcmcGrid:_ctl2:xk:'on'
搜尋課程
課程有很多資訊,比如名字,上課時間,地點,這些東西確定好了才知道選的是哪門課,所以我們先新建一個類來儲存資訊
class Lesson:
def __init__(self, name, code, teacher_name, Time, number):
self.name = name
self.code = code
self.teacher_name = teacher_name
self.time = Time
self.number = number
def show(self):
print('name:' + self.name + 'code:' + self.code + 'teacher_name:' + self.teacher_name + 'time:' + self.time)
有了這個類,我們就可以進行搜尋課程了,具體程式碼看下面程式碼,解析網頁內容就不細講了。
def __search_lessons(self, lesson_name=''):
self.__base_data['TextBox1'] = lesson_name.encode('gb2312')
request = requests.post(self.__headers['Referer'], data=self.__base_data, headers=self.__headers)
soup = BeautifulSoup(request.text, 'lxml')
self.__set__VIEWSTATE(soup)
return self.__get_lessons(soup)
def __get_lessons(self, soup):
lesson_list = []
lessons_tag = soup.find('table', id='kcmcGrid')
lesson_tag_list = lessons_tag.find_all('tr')[1:]
for lesson_tag in lesson_tag_list:
td_list = lesson_tag.find_all('td')
code = td_list[0].input['name']
name = td_list[1].string
teacher_name = td_list[3].string
Time = td_list[4]['title']
number = td_list[10].string
lesson = self.Lesson(name, code, teacher_name, Time, number)
lesson_list.append(lesson)
return lesson_list
進行選課
選課我們只要將lesson_list傳入即可,這就是我們之前建立的Lesson類的例項的列表,’Button’的內容為’ 提交 ‘,這兩邊各有一個空格,完事後我們可以進行傳送請求進行選課。
這裡我們用正則提取了錯誤資訊,比如選課時間未到、上課時間衝突這些錯誤資訊來提示使用者,我們還解析了網頁的已選課程,這裡也不細講了,都是基礎的網頁解析。
def __select_lesson(self, lesson_list):
data = copy.deepcopy(self.__base_data)
data['Button1'] = ' 提交 '.encode('gb2312')
for lesson in lesson_list:
code = lesson.code
data[code] = 'on'
request = requests.post(self.__headers['Referer'], data=data, headers=self.__headers)
soup = BeautifulSoup(request.text, 'lxml')
self.__set__VIEWSTATE(soup)
error_tag = soup.html.head.script
if not error_tag is None:
error_tag_text = error_tag.string
r = "alert\('(.+?)'\);"
for s in re.findall(r, error_tag_text):
print(s)
print('已選課程:')
selected_lessons_pre_tag = soup.find('legend', text='已選課程')
selected_lessons_tag = selected_lessons_pre_tag.next_sibling
tr_list = selected_lessons_tag.find_all('tr')[1:]
for tr in tr_list:
td = tr.find('td')
print(td.string)
總結
這次我們完成了模擬正方教務系統選課的過程,由於這個教務系統技術比較陳舊,所以比較好弄,事實上搶課的時候用Fiddler即可完成操作,因為我們只需要提前登入然後記錄網址即可。
完整程式碼
import requests
from PIL import Image
from bs4 import BeautifulSoup
import copy
import time
import re
import os
class Spider:
class Lesson:
def __init__(self, name, code, teacher_name, Time, number):
self.name = name
self.code = code
self.teacher_name = teacher_name
self.time = Time
self.number = number
def show(self):
print(' name:' + self.name + ' code:' + self.code + ' teacher_name:' + self.teacher_name + ' time:' + self.time)
def __init__(self, url):
self.__uid = ''
self.__real_base_url = ''
self.__base_url = url
self.__name = ''
self.__base_data = {
'__EVENTTARGET': '',
'__EVENTARGUMENT': '',
'__VIEWSTATE': '',
'ddl_kcxz': '',
'ddl_ywyl': '',
'ddl_kcgs': '',
'ddl_xqbs': '',
'ddl_sksj': '',
'TextBox1': '',
'dpkcmcGrid:txtChoosePage': '1',
'dpkcmcGrid:txtPageSize': '200',
}
self.__headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36',
}
self.session = requests.Session()
self.__now_lessons_number = 0
def __set_real_url(self):
request = self.session.get(self.__base_url, headers=self.__headers)
real_url = request.url
if real_url != 'http://218.75.197.123:83/' and real_url != 'http://218.75.197.123:83/index.apsx': # 湖南工業大學
self.__real_base_url = real_url[:len(real_url) - len('default2.aspx')]
else:
if real_url.find('index') > 0:
self.__real_base_url = real_url[:len(real_url) - len('index.aspx')]
else:
self.__real_base_url = real_url
return request
def __get_code(self):
if self.__real_base_url != 'http://218.75.197.123:83/':
request = self.session.get(self.__real_base_url + 'CheckCode.aspx', headers=self.__headers)
else:
request = self.session.get(self.__real_base_url + 'CheckCode.aspx?', headers=self.__headers)
with open('code.jpg', 'wb')as f:
f.write(request.content)
im = Image.open('code.jpg')
im.show()
print('Please input the code:')
code = input()
return code
def __get_login_data(self, uid, password):
self.__uid = uid
request = self.__set_real_url()
soup = BeautifulSoup(request.text, 'lxml')
form_tag = soup.find('input')
__VIEWSTATE = form_tag['value']
code = self.__get_code()
data = {
'__VIEWSTATE': __VIEWSTATE,
'txtUserName': self.__uid,
'TextBox2': password,
'txtSecretCode': code,
'RadioButtonList1': '學生'.encode('gb2312'),
'Button1': '',
'lbLanguage': '',
'hidPdrs': '',
'hidsc': '',
}
return data
def login(self, uid, password):
while True:
data = self.__get_login_data(uid, password)
if self.__real_base_url != 'http://218.75.197.123:83/':
request = self.session.post(self.__real_base_url + 'default2.aspx', headers=self.__headers, data=data)
else:
request = self.session.post(self.__real_base_url + 'index.aspx', headers=self.__headers, data=data)
soup = BeautifulSoup(request.text, 'lxml')
if request.status_code != requests.codes.ok:
print('4XX or 5XX Error,try to login again')
time.sleep(0.5)
continue
if request.text.find('驗證碼不正確') > -1:
print('Code error,please input again')
continue
if request.text.find('密碼錯誤') > -1:
print('Password may be error')
return False
if request.text.find('使用者名稱不存在') > -1:
print('Uid may be error')
return False
try:
name_tag = soup.find(id='xhxm')
self.__name = name_tag.string[:len(name_tag.string) - 2]
print('歡迎' + self.__name)
self.__enter_lessons_first()
return True
except:
print('Unknown Error,try to login again.')
time.sleep(0.5)
continue
def __enter_lessons_first(self):
data = {
'xh': self.__uid,
'xm': self.__name.encode('gb2312'),
'gnmkdm': 'N121103',
}
self.__headers['Referer'] = self.__real_base_url + 'xs_main.aspx?xh=' + self.__uid
request = self.session.get(self.__real_base_url + 'xf_xsqxxxk.aspx', params=data, headers=self.__headers)
self.__headers['Referer'] = request.url
soup = BeautifulSoup(request.text, 'lxml')
self.__set__VIEWSTATE(soup)
selected_lessons_pre_tag = soup.find('legend', text='已選課程')
selected_lessons_tag = selected_lessons_pre_tag.next_sibling
tr_list = selected_lessons_tag.find_all('tr')[1:]
self.__now_lessons_number = len(tr_list)
try:
xq_tag = soup.find('select', id='ddl_xqbs')
self.__base_data['ddl_xqbs'] = xq_tag.find('option')['value']
except:
pass
def __set__VIEWSTATE(self, soup):
__VIEWSTATE_tag = soup.find('input', attrs={'name': '__VIEWSTATE'})
self.__base_data['__VIEWSTATE'] = __VIEWSTATE_tag['value']
def __get_lessons(self, soup):
lesson_list = []
lessons_tag = soup.find('table', id='kcmcGrid')
lesson_tag_list = lessons_tag.find_all('tr')[1:]
for lesson_tag in lesson_tag_list:
td_list = lesson_tag.find_all('td')
code = td_list[0].input['name']
name = td_list[1].string
teacher_name = td_list[3].string
Time = td_list[4]['title']
number = td_list[10].string
lesson = self.Lesson(name, code, teacher_name, Time, number)
lesson_list.append(lesson)
return lesson_list
def __search_lessons(self, lesson_name=''):
self.__base_data['TextBox1'] = lesson_name.encode('gb2312')
request = self.session.post(self.__headers['Referer'], data=self.__base_data, headers=self.__headers)
soup = BeautifulSoup(request.text, 'lxml')
self.__set__VIEWSTATE(soup)
return self.__get_lessons(soup)
def __select_lesson(self, lesson_list):
data = copy.deepcopy(self.__base_data)
data['Button1'] = ' 提交 '.encode('gb2312')
for lesson in lesson_list:
code = lesson.code
data[code] = 'on'
request = self.session.post(self.__headers['Referer'], data=data, headers=self.__headers)
soup = BeautifulSoup(request.text, 'lxml')
self.__set__VIEWSTATE(soup)
error_tag = soup.html.head.script
if not error_tag is None:
error_tag_text = error_tag.string
r = "alert\('(.+?)'\);"
for s in re.findall(r, error_tag_text):
print(s)
print('已選課程:')
selected_lessons_pre_tag = soup.find('legend', text='已選課程')
selected_lessons_tag = selected_lessons_pre_tag.next_sibling
tr_list = selected_lessons_tag.find_all('tr')[1:]
self.__now_lessons_number = len(tr_list)
for tr in tr_list:
td = tr.find('td')
print(td.string)
def run(self):
print('請輸入搜尋課程名字')
lesson_name = input()
lesson_list = self.__search_lessons(lesson_name)
print('請輸入想選的課的id,id為每門課程開頭的數字,如果沒有課程顯示,代表公選課暫無')
for i in range(len(lesson_list)):
print(i, end='')
lesson_list[i].show()
select_id = int(input())
lesson_list = lesson_list[select_id:select_id + 1]
while True:
try:
number = self.__now_lessons_number
self.__select_lesson(lesson_list)
if self.__now_lessons_number > number:
break
except:
print("搶課失敗,休息0.5秒後繼續")
time.sleep(0.5)
if __name__ == '__main__':
print('請輸入你們學校教務系統的地址,不用加上前面的http://')
url = input()
url = 'http://' + url
spider = Spider(url)
print('請輸入學號')
uid = input() #學號
print('請輸入密碼')
password = input() #密碼
if (spider.login(uid, password)):
spider.run()
os.system("pause")
作者:vhyz 源自:https://vhyz.me/ GitHub地址:https://github.com/vhyz/ZF_Spider
相關推薦
用Python實現模擬登入正方教務系統搶課
最近學校開始選課,但是如果選課時間與自己的事情衝突,這時候就可以使用Python指令碼自助搶課,搶課的第一步即是模擬登入,需要模擬登入後儲存登入資訊然後再進行操作。 而且整個流程是比較簡單,這是因為正方教務系統是比較舊的,全文的IP地址部分遮擋,請換成你們學校的IP地址。
選修課有很多有趣的!用Python模擬登入學校教務系統搶課!
最近學校開始選課,但是如果選課時間與自己的事情衝突,這時候就可以使用Python指令碼自助搶課,搶課的第一步即是模擬登入,需要模擬登入後儲存登入資訊然後再進行操作。把css 圖片之類的過濾掉,發現了default.aspx這個東西如果你們學校教務系統不使用Cookie則會是這
無腦超簡易快速選課技巧(ps:正方教務系統搶課)(精)
序、不想聽廢話直接跳第二章吧,兄dei (ps:本文以華中農業大學為例)(好吧,暴露了。) 一、我的搶課經歷。。 第一次選課一臉懵逼。。完全不會,搶不到課。(你懂的)mmp,只能撿漏 大二,大三學會一個很簡單的搶課技巧: 平均三
用Python實現簡單的名片管理系統
rem 代碼 card 刪除 import val 字典 fin pytho 首先新建項目,包含主程序cards_main和工具庫cards_tools: 如下:main函數主主要使用while和if實現4功能切換,切換的具體操作由cards_tools中的函數執行。不說了
用JS程式碼自動填寫正方教務系統的教學評價
1、新建一個書籤,在網址出輸入如下程式碼:javascript:void(function(){var s=document.createElement('script');s.setAttribute('src','https://liyin.date/myfiles/ja
一個用python實現的app 質量保障系統Newton
一、Newton是什麼? 一個將Cat上抓取到的crash作為資料來源,為tapd上建立缺陷、持續提供crash資料分析、監控以及報表生成功能的工具集。 系統流程圖: 二、專案背景 2.1 Newton的誕生前因 1、縮短crash發現和處理時間 2、減少
HttpWatch+HttpClient模擬登入學校教務系統
因為最近在做一個安卓專案,有查成績模組,而學校並不提供介面,也沒找到其他可用的API,無奈之下只能迴歸原始的模擬登入。首先,我們得先弄明白我們校園網是怎麼工作的,這裡要用到HttpWatch,分析我們正常登入時的請求與響應資訊,當然你有chrome或fox之類的也行。我個人還
python爬蟲——模擬登入教務系統爬取成績
主要思路 1.模擬登入到教務處,獲取登入的cookie值,用獲取到的cookie值,訪問成績的網址,分析成績頁面,獲取成績資訊。 2.打包成exe檔案,方便使用 ,我們可以用自己寫的程式快速查詢我們的成績,速度要比正常登入教務處網址查詢快很多,也比超級課程表
python爬蟲登入正方教務管理系統獲取成績資料
本程式以四川理工學院教務管理系統為例。。。。 準備工作:1.ruquests庫的使用(或者urllib也可行) 2.正則表示式的書寫 3.HTTP通訊基礎 4.一些解析庫的使用 準備
用Python實現系統監控
要求: 對(系統、CPU、記憶體、硬碟、使用者)進行實時監控 主函式(run.py): import random import socket import platform import psutil from flask import Flask, render_t
小夥用Python實現可擴充套件的電子商務推薦系統,成功被阿里巴巴錄取
AI 前線導讀:在我國,電商非常發達。今年雙 11 的成交額僅僅過了 12 小時就達到了驚人的 1491.6 億元!電商在我國的火爆程度由此可見一斑。 當然在學習Python的道路上肯定會困難,沒有好的學習資料,怎麼去學習呢? 學習Python中有不明白推薦加
python刷課指令碼(正方教務系統)
#!/usr/bin/env python # coding=utf-8 __metaclass__=type import urllib2 import urllib import time import sys import re reload(sys) sys.setdefaultencoding
用Python實現代理池(Proxy Pool)系統
跨語言高效能IP代理池,Python實現。 注意:請執行程式前先更新一下抓取代理的函式。 執行環境 Python 3.5 (請務必保證Python的版本在3.5以上,否則非同步
用python實現LBP特征點計算
i+1 [0 code read cvt lena 實現 ims numpy 1 import cv2 2 import numpy as np 3 4 5 def olbp(src): 6 dst = np.zeros(src.shape,dty
用python編寫模擬用戶登錄
es2017 顯示 列表 退出 count png comment 賬戶 tin readme:涉及python知識點 數據類型 用戶與程序交互 while循環 if..else判斷 大致流程圖: 基礎需求: 讓用戶輸入用戶名密碼 認證成功後顯示歡迎信息 輸錯
21-城裏人套路深之用python實現邏輯回歸算法
rom 成功 基礎知識 壓力 dvp ilb nbsp html 感覺 如果和一個人交流時,他的思想像彈幕一樣飄散在空中,將是怎樣的一種景象?我想大概會毫不猶豫的點關閉的。生活為啥不能簡單明了?因為太直白了令人乏味。保留一些不確定性反而撲朔迷離,引人入勝。我們學習了線性回歸
用python實現歸並排序
想是 一個 pass 列合並 cnblogs plist post 思想 str def merge(lfrom, lto, low, mid, high): i, j, k = low, mid, low while i < mid and j &l
用python實現一個命令行文本編輯器
screen alt 保存 模型 既然 ffffff 圖片 單行 pda “這看起來相當愚蠢”——題記 不過我整個人都很荒誕,何妨呢?貼一張目前的效果圖 看起來很舒服,不是麽?即使一切都是個幌子:光標只能在最後,按一下上下左右就會退出,一行超出75個字符
用python實現銀行轉賬功能
賬號 pytho exec llb 賬戶 密碼 rollback money 輸入數據 #coding:utf-8 import MySQLdb #調用MySQL數據庫模塊 conn=MySQLdb.Connect( host='.........
用 Python 實現武科大教務處自動搶課
kit overflow 簡單的 pos request 直接 sts itl head 首先分析網頁,找到教務處登錄的驗證碼 然後用 Python 直接把驗證碼下載到本地(整個程序通過 requests 庫實現): def GetRandCode(): url