Python大学排名自动爬虫

在这里插入代码片
import requests
from bs4 import BeautifulSoup
import bs4
import csv
from tkinter import *
import tkinter.messagebox as messagebox
result_list=[]
count=[]

def getHTMLText(url):#获取网页内容
    try:
        r=requests.get(url,timeout=30)
        r.raise_for_status()
        r.encoding=r.apparent_encoding
        return r.text
    except:
        return ""
def fillUnivList(ulist,html):#提取网页内容中信息放到list中
    soup=BeautifulSoup(html,"html.parser")
    for tr in soup.find('tbody').children:
        if isinstance(tr,bs4.element.Tag):#过滤掉非标签的信息检测tr标签的类型
             tds =tr('td')
             ulist.append([tds[0].string,tds[1].string,tds[3].string])
    pass
def printUnivList(ulist,num):#输出打印
    tplt="{0:^10}\t{1:{3}^10}\t{2:^10}"#使用format函数的第三个变量
    print(tplt.format("排名","学校名称","总分",chr(12288)))
    for i in range(num):
        u=ulist[i]
        print(tplt.format(u[0], u[1], u[2],chr(12288)))
        #当中文字符宽度不够时,采用西文字符填充;中西文字符占用宽度不同
        result = {'排名':     (u[0]),

                  '大学名称': (u[1]),

                  '总分':     (u[2])

                 }

        result_list.append(result)
    wcsv(result_list)
def wcsv(ulist):
    with open('中国大学排名.csv', 'w', encoding='utf-8')as f:
        writer = csv.DictWriter(f, fieldnames=['排名', '大学名称', '总分'])
        #在保存文件定义定义文件每一行的信息类型
        writer.writeheader()

        writer.writerows(ulist)
def TK():
    root = Tk()
    #创建一个图形界面
    e = Entry(root)
    e.grid(row=0, column=1,
           padx=10, pady=10)
    #设置输入框
    def show():
        count.append(e.get())
        messagebox.showinfo( "大学排名", "您已提交请求!!")
        #点击提交后的弹窗
    # 设置按钮的宽度
    Button(root, text='提交请求', width=10, command=show) \
        .grid(row=1, column=1, sticky=W, padx=10, pady=10)
    # W->west 靠西
    mainloop()


def main():
    TK()
    uinfo=[]
    url ='http://www.zuihaodaxue.cn/zuihaodaxuepaiming2019.html'
    html=getHTMLText(url)#获取网页源码
    fillUnivList(uinfo,html)#从网页获取相关信息保存到list中
    printUnivList(uinfo,int(count[0]))
    #打印20所学校的信息
if __name__ == '__main__':
    main()


正文小四、宋体,1.5倍行距
一、 大作业目的
对所学知识融会贯通,能综合运用所学知识开发一款符合题目要求、具有一定规模的爬虫。
二、 大作业内容
目标网址:http://www.zuihaodaxue.cn/zuihaodaxuepaiming2019.html
目标内容:如下图所示内容,包括排名,大学名称,总分。

(1)从网络上获取大学排名网页内容;
(2)提取网页内容中信息;
(3)把提取的信息保存为CSV格式;
三、 需求分析
需求:利用Python的requests-bs4的技术路线,定向爬取(仅对输入的URL进行爬取)由上海交通大学设计的2019年‘最好大学网’中国大学排名情况并输出并保存大学的排名,大学名称,总分到文件中。
分析:
实验的可行性是大前提,在该实验中,我们需要考虑两方面的可行性:
①确定我们想要爬取的信息内容确实被写在了该网页的html文件中;
②网络爬虫亦要盗亦有道,需查看网页是否提供了Robots协议;
具体操作如下:
(1)访问网址,鼠标右键查看网页源代码;
(2)在源代码中查看是否有我们需要的信息,或者直接搜索清华大学查看(因为大学排名一定有清华)
(3)发现我们所需要的学校排名信息确实被写在HTML文件的td标签中,满足第一个可行性

四、 实现思路

第一步:打开PyCharm建立pycodes文件
第二步:导入或者安装bs4库requests库,csv库
第三步:从网络上获取大学排名网页内容getHTMLText()
第三步:获取我们想要信息的list fillUnivList():
第四步:输出打印信息并调用保存函数wcsv()
第五步:保存信息到文件里
第六步:改变大学的数量定义一个可输入函数TK()
第七步:运行主函数
五、 详细实现
1.从网络上获取大学排名网页内容:
getHTMLText()
#网络爬虫有风险,为增强代码的可靠性,使用异常,如有异常返回空

2.提取网页内容中的信息,并找到合适的数据结构进行存储:
fillUnivList():
(1).利用BeautifulSoup对网页的内容进行解析,用到解析器"html.parser"。
(2).观察网页的源代码(上有图),我们发现信息在以 ‘tbody’ 标签为索引的’tr’标签下的’td’标签中,于是我们需要先在html文件中找到 ‘tbody’ 的孩子 ‘tr’,再找到 ‘td’,进而获取信息。
(3).这里需要对 ‘tr’ 进行一次判断,判断什么呢,判断我们找到的这个 ‘tr’ 确实是标签,而不是字符串。这时需要引入bs4包!

3.利用数据结构展示并格式化输出我们想要的结果:
printUnivList()
格式化输出用到 ‘format()’ 函数,利用循环输出的学校信息

4.保存文件
wcsv()导入csv库,进行文件保存

5.定义爬取前多少名的大学排名- 5 -

TK():导入tkinter库实现一个可输入的框,然后把值赋给count列表

6.主程序调用:
main()调用函数的实现

六、 源代码
import requests
from bs4 import BeautifulSoup
import bs4
import csv
from tkinter import *
import tkinter.messagebox as messagebox
result_list=[]
count=[]

def getHTMLText(url):#获取网页内容
try:
r=requests.get(url,timeout=30)
r.raise_for_status()
r.encoding=r.apparent_encoding
return r.text
except:
return “”
def fillUnivList(ulist,html):#提取网页内容中信息放到list中
soup=BeautifulSoup(html,“html.parser”)
for tr in soup.find(‘tbody’).children:
if isinstance(tr,bs4.element.Tag):#过滤掉非标签的信息检测tr标签的类型
tds =tr(‘td’)
ulist.append([tds[0].string,tds[1].string,tds[3].string])
pass
def printUnivList(ulist,num):#输出打印
tplt="{0:10}\t{1:{3}10}\t{2:^10}"#使用format函数的第三个变量
print(tplt.format(“排名”,“学校名称”,“总分”,chr(12288)))
for i in range(num):
u=ulist[i]
print(tplt.format(u[0], u[1], u[2],chr(12288)))
#当中文字符宽度不够时,采用西文字符填充;中西文字符占用宽度不同
result = {‘排名’: (u[0]),

              '大学名称': (u[1]),

              '总分':     (u[2])

             }

    result_list.append(result)
wcsv(result_list)

def wcsv(ulist):
with open(‘中国大学排名.csv’, ‘w’, encoding=‘utf-8’)as f:
writer = csv.DictWriter(f, fieldnames=[‘排名’, ‘大学名称’, ‘总分’])
#在保存文件定义定义文件每一行的信息类型
writer.writeheader()

    writer.writerows(ulist)

def TK():
root = Tk()
#创建一个图形界面
e = Entry(root)
e.grid(row=0, column=1,
padx=10, pady=10)
#设置输入框

def show():
    count.append(e.get())
    messagebox.showinfo( "大学排名", "您已提交请求!!")
    #点击提交后的弹窗



# 设置按钮的宽度
Button(root, text='提交请求', width=10, command=show) \
    .grid(row=1, column=1, sticky=W, padx=10, pady=10)
# W->west 靠西
mainloop()

def main():
TK()
uinfo=[]
url =‘http://www.zuihaodaxue.cn/zuihaodaxuepaiming2019.html’
html=getHTMLText(url)#获取网页源码
fillUnivList(uinfo,html)#从网页获取相关信息保存到list中
printUnivList(uinfo,int(count[0]))
#打印20所学校的信息
if name == ‘main’:
main()

七、 运行结果
控制台的运行结果:

保存在csv文件中的结果:

导出excel的结果:

八、 大作业小结

1.这是我第一个这么用心学然后实现的爬虫实验;
2.以前编写小程序也从不会考虑可靠性问题,但事实是,不论代码长短,可靠性都是需要考虑的问题;
3.我认为编程是一个由大到小,由粗到细的一个过程。.良好的编程习惯从编程顺序开始;
4.Python不是有多难的语言,但多看10遍老师编的代码,都不如自己上手一遍来得强;
5.其中需要定义一个大学数量的一个变量,我利用了tkinter库定义了一个输入框,通过输入大学的数量,然后爬取前多少名的大学排名,点击提交之后会弹出一个一个提示窗口,我学的不是很多,我还得继续努力加以完善程序的优化
6.保存文件时,用到了csv库,对这个库的学习还不是很彻底,用起来有一点不理解,通过广泛的学习,有了很大的收获
6.总的来说这次python大作业收获很大,虽然技术有带提高,但可以说是用心了,我对自己的编程有了有个新的认识

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值