用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网络爬虫与信息提取 》嵩天