用python的GUI、requests、BeautifulSoup庫和pyinstaller,做個高校排名查詢窗口
放假了,閒着也是閒着,青春短暫。看到2019級的孩子們,登上大學的舞臺,並想到了2020級的孩子還在苦苦奮鬥,於是突發奇想,做個查詢窗口,以便於他們樹立目標,獲得自己想去高校的部分信息。也藉此機會,學點沒學過的python的知識,給自己入門的爬蟲技巧做個總結。
用到的庫
import requests#網頁請求
from bs4 import BeautifulSoup#網頁解析
import bs4
from tkinter import #窗口製作
import tkinter as tk
首先是獲得想要查詢的網頁,我看的是中國大學慕課中的一個老師講解視頻,所以也延用了他舉例子用到的網站
http://www.zuihaodaxue.cn/zuihaodaxuepaiming2019.html
進入網站
查看網頁源碼
1、2、3表示網頁的數據結構,(tbody(tr(td))),所以查找時,要查找tbody下的 tr,從中查找出 td 標籤
接下來就是爬取並解析網頁數據
def get_url(url):#獲得網頁內容
try:
r = requests.get(url , timeout = 30)#獲得url的相關參數
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text#返還url的內容
except:
return "網頁爬取異常" + r.status_code#返回狀態碼
def explain_url(url , list):#獲得url的內容,並解析在一個二維列表當中
soup = BeautifulSoup(url, "html.parser")#解釋
for tr in soup.find('tbody').children:#查看網頁的源代碼,發現每個tbody下面有tr個分支,每個tr分支下td是他的兒子,所以遍歷
if isinstance(tr, bs4.element.Tag):#判斷tr下是否是bs4的類型
tds = tr('td')#查詢tr下所有的td標籤
list.append([tds[0].string, tds[1].string, tds[2].string, tds[3].string, tds[4].string])#將爬下的數據寫到一個二維數據列表當中
return list
這段代碼參考了中國大學慕課《Python網絡爬蟲與信息提取 》嵩天老師的授課代碼(其實還是懶)
下面就是做窗口的代碼塊了
做窗口浪費了很大一部分時間,因爲沒接觸過這個模塊,但最總解決了,上代碼!!!!!
def store_content(list , name):#輸出儲存的內容
static = ""
for i in ulist:#由於數據結構這門課還沒學,所以不知道我這個搜索方法高效不(還有一種內置函數的方法find)
for j in i:
if name in i:
static += "{:^15}\t{:^15}\t{:^15}\t{:^15}\t{:^15}\n".format(i[0], i[1], i[2], i[3], i[4])#由於下面的組件text只能是文本,我只好這樣,給他定義個字符串
break
return static #
def window(list):#窗口設置
root = Tk()#建立窗口
root.title("2019年全國高校排名查詢窗口")#取名
group1 = Label(root, text="2019年全國高校排名(排名範圍是教育部公佈的全國普通高等學校名單中,"
"1243所辦學層次爲本科的大學。\n"
"這其中公辦大學826所、民辦大學153所、獨立學院264所。)"
"\n\n輸入你想查詢的學校名稱,或者省份")
group1.pack(padx = 5 , pady = 0)#Label組件
e = tk.Entry(root,show=None)#輸入框組件,並設置大小
e.pack(padx = 300 , pady =8)
def insert_point():#定義一個事件
var = e.get()
temp = store_content(list , var)
t.insert('insert',temp)
b1 = tk.Button(root, text='查詢', width=9,
height=1, command=insert_point)#button觸發事件,事件中包含的函數store_content就是用來儲存並輸出數據內容
b1.pack()
group2 = Label(root, text="-----------------------------查詢結果如下"
"-----------------------------",font=(35), fg="green")
group2.pack(padx=5, pady=10)
group21 = Label(root, text="{:^10}\t{:^11}\t{:^11}\t{:^11}\t{:^10}".format("排名",
"學校名稱",
"省份",
"總分",
"生源質量"),font=("黑體", 12))
group21.pack(padx=5, pady=10)
t = tk.Text(root, width=90, height=20, font = ("黑體",12))#文本組件,用來顯示數據內容
t.pack()
group3 = Label(root)
group3.pack(padx = 3 , pady = 0)
mainloop( )#設置主循環
這段代碼耗費 3 天,做出來的那一剎那都快哭出來了
新手到老手,就得經歷從未有過的磨難,何況是笨笨的自學
全代碼
import requests
from bs4 import BeautifulSoup
import bs4
from tkinter import *
import tkinter as tk
def get_url(url):#獲得網頁內容
try:
r = requests.get(url , timeout = 30)#獲得url的相關參數
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text#返還url的內容
except:
return "網頁爬取異常" + r.status_code#返回狀態碼
def explain_url(url , list):#獲得url的內容,並解析在一個二維列表當中
soup = BeautifulSoup(url, "html.parser")#解釋
for tr in soup.find('tbody').children:#查看網頁的源代碼,發現每個tbody下面有tr個分支,每個tr分支下td是他的兒子,所以遍歷
if isinstance(tr, bs4.element.Tag):#判斷tr下是否是bs4的類型
tds = tr('td')#查詢tr下所有的td標籤
list.append([tds[0].string, tds[1].string, tds[2].string, tds[3].string, tds[4].string])#將爬下的數據寫到一個二維數據列表當中
return list
def store_content(list , name):#輸出儲存的內容
static = ""
for i in ulist:
for j in i:
if name in i:
static += "{:^15}\t{:^15}\t{:^15}\t{:^15}\t{:^15}\n".format(i[0], i[1], i[2], i[3], i[4])#給二維列表賦
break
return static #
def window(list):
root = Tk()
root.title("2019年全國高校排名查詢窗口")
group1 = Label(root, text="2019年全國高校排名(排名範圍是教育部公佈的全國普通高等學校名單中,"
"1243所辦學層次爲本科的大學。\n"
"這其中公辦大學826所、民辦大學153所、獨立學院264所。)"
"\n\n輸入你想查詢的學校名稱,或者省份")
group1.pack(padx = 5 , pady = 0)
e = tk.Entry(root,show=None)
e.pack(padx = 300 , pady =8)
def insert_point():
var = e.get()
temp = store_content(list , var)
t.insert('insert',temp)
b1 = tk.Button(root, text='查詢', width=9,
height=1, command=insert_point)
b1.pack()
group2 = Label(root, text="-----------------------------查詢結果如下"
"-----------------------------",font=(35), fg="green")
group2.pack(padx=5, pady=10)
group21 = Label(root, text="{:^10}\t{:^11}\t{:^11}\t{:^11}\t{:^10}".format("排名",
"學校名稱",
"省份",
"總分",
"生源質量"),font=("黑體", 12))
group21.pack(padx=5, pady=10)
t = tk.Text(root, width=90, height=20, font = ("黑體",12))
t.pack()
group3 = Label(root)
group3.pack(padx = 3 , pady = 0)
mainloop( )
if __name__ == '__main__':
ulist = []
url = "http://www.zuihaodaxue.cn/zuihaodaxuepaiming2019.html"
first = get_url(url)
second = explain_url(first, ulist)
third = window(ulist)
pass
運行結果如下
最後又突然想到,高中生會編程的應該不多,我還是給他打包成 .exe 可運行應用,這樣裝機就可以使用啦
打開cmd ,輸入下面命令
pyinstaller -F -w D:\PyCharm2017\pycharm_pyfile\.idea\pachong.py -i C:\Users\Dell\Desktop\bitbug_favicon.ico
最後得到我想要的
OHHHHH!!
圖標生成方法:
下載你要生成的圖片,隨便格式如jpg、png到桌面(好找),然後在這個網站上進行免費轉化 .ico 圖標
http://www.bitbug.net/
想要那個應用的小夥伴可以私信我!
總結:“你最終會成你想成爲的那個人”,2019年最後一天發的我2020年要怎麼怎麼樣,然後第二天就繼續刷抖音,玩b站,人生,青春,不能這樣吧。這4天苦熬,看了許多文章,看了好多視頻課,最終結果還令人滿意,加油!2020!
中國大學慕課《Python網絡爬蟲與信息提取 》嵩天