用python的GUI、requests、BeautifulSoup庫和pyinstaller,做個高校排名查詢窗口的應用(新老 手做項目)

用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網絡爬蟲與信息提取 》嵩天

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章