嵩天老师的中国大学排名定向爬虫实例-萌新教程

萌新实例,大佬们可以右上角了, 萌新可以看看互相学习

我是在是学习了《Python简明教程》还有廖雪峰老师的《Python3教程》后,才发现嵩天老师的视频的,简洁、生动、有趣,有时候还挺萌的,要是能早点知道嵩天老师,我觉的学习时间应该能减少少一半,不是说其他的不好,只是更喜欢嵩天老师的讲解

给嵩天老师打个广告,非常有意思的教程,这里是爬虫教程,里面还有Python基础教程,大家自己去挖掘下

https://www.icourse163.org/course/BIT-1001870001

和大家分享嵩天老师的实例,一是为了巩固自己的知识点,而是为了给像我一样的人安利下嵩天老师

 

任务目标

爬取中国最好大学排名的前30个排名

任务分解

嵩天老师在这里将任务分成了好几块,为了方便大家理解

我这里按嵩老师思路分成三大块,代码缩进可以参考后面的,完全代码

第一步:写框架

# 用get方法获取HTML信息

def getHTMLText(url)

    return" "

# 将获取到的html放在自己定义的ulist中

def fillUnivList(ulist, html)

    pass

# 将获取到的ulist信息打印出来,num在这里指要排名多少学校,可以自有填写

def printUnivList(ulist, num)

    print("Suc" + str(num))

第二步:完善函数

先写main函数

def main():
    # 将大学信息写进列表中,定义列表名uinfo
    uinfo = []
    # 给出url地址信息
    url = "http://www.zuihaodaxue.com/zuihaodaxuepaiming2018.html"
    # 用requests库中的get方法,将url信息转换成HTML信息
    html = getHTMLText(url)
    # 将提取的信息放在uinfo变量中
    fillUnivList(uinfo, html)
    # 打印大学信息,我们给出的排名信息是前30位
    printUnivList(uinfo, 30)
main()

然后再完善上面的的三个框架函数

完善getHTMLText函数

def getHTMLText(url):
    # 是用try...except 完成结构框架,方便调试
    try:
        r = requests.get(url, timeout=30)
    # 获取状态码
        r.raise_for_status()
    # 因为有中文,所以需要转换编码
        r.encoding = r.apparent_encoding
    # 返回给程序
        return r.text
    except:
	    print("产生异常")
        return

完善fillUnivList函数

这里又开始使用beautifullsoup提取html信息中关键的数据,并添加到列表中

通过网页查看源码,我们发现,所有的信息被封装在标签里,每一个大学信息又被封装在标签里,标签包含了当前大学的数据信息,每个大学的又被所包围

先找到标签,获取所有大学信息

再找到标签里的标签,获取每一个大学的信息

再找到标签里的标签,将大学所有属性写到ulist里

这里主要使用的是bs4库中的遍历和查找方法

还需要注意的是,因为要过滤的其他信息,所以用isinstace函数做判断,

 

 

嵩天老师的中国大学排名定向爬虫实例-萌新教程_第1张图片

# 将获取到的html放在自己定义的ulist列表中
def fillUnivList(ulist, html):
    # 使用bs4库解析网页
    soup = BeautifulSoup(html, "html.parser")
    # 使用for语句遍历查找tbody下的孩子标签,
    for tr in soup.find('tbody').children:
        # 检测ts标签,如果tr标签不是bs4定义的tag类型,将过滤掉
        if isinstance(tr, bs4.element.Tag):
            # tr标签查询完后,需要查询td标签,并将td标签存在tds里,
            tds = tr('td')
            # ulist 里添加我们需要的信息,分别是大学名称,大学排名,大学评分
            ulist.append([tds[0].string, tds[1].string, tds[2].string])

第三步,打印大学信息

打印大学信息时,需要有表头,这里时用print函数实现

format输出格式函数,需要自己下去找资料学习下

def printUnivList(ulist, num):
    # 定义输出模板的变量,并增加宽度设定
    # {3}表示打印输出时,需要填充时使用format函数的第三个变量进行填充,也就是使用中文空格进行填充
    tplt = "{0:^10}\t{1:{3}^10}\t{2:^10}"
    # 定义输出格式,如果看不懂可以去搜下format函数,学习下
    print(tplt.format("排名", "学校名称", "评分", chr(12288)))
    # 将dr信息用简短的变量u来代替,并用for...in 将每所学校信息打印出来
    for i in range(num):
        u = ulist[i]
        print(tplt.format(u[0], u[1], u[2], chr(12288)))
    print("Suc" + str(num))

完全体提代码

需要注意的是,这里需要的是三个库,requests库,BeautifulSoup4库的BeautifulSoup方法,以及BeautifulSoup4库

 

import requests
from bs4 import BeautifulSoup
import bs4


# 定义获取网页信息
def getHTMLText(url):
    # 是用try...except 完成结构框架,方便调试
    # noinspection PyBroadException
    # pycharm会报提示,过于宽泛,需要指定精准 except,强迫症必须要解决
    try:
        r = requests.get(url, timeout=30)
    # 获取状态码
        r.raise_for_status()
    # 因为有中文,所以需要转换编码
        r.encoding = r.apparent_encoding
    # 返回给程序
        return r.text
    except:
        print("产生异常")
        return ""


# 使用beautifullsoup提取html信息中关键的数据,并添加到列表中

# 将获取到的html放在自己定义的ulist列表中
def fillUnivList(ulist, html):
    # 使用bs4库解析网页
    soup = BeautifulSoup(html, "html.parser")
    # 使用for语句遍历查找tbody下的孩子标签,
    for tr in soup.find('tbody').children:
        # 检测tr标签,如果tr标签不是bs4定义的tag类型,将过滤掉
        if isinstance(tr, bs4.element.Tag):
            # tr标签查询完后,需要查询td标签,并将td标签存在tds里,
            tds = tr('td')
            # ulist 里添加我们需要的信息,分别是大学名称,大学排名,大学评分
            ulist.append([tds[0].string, tds[1].string, tds[2].string])


# 将获取的ulist信息打印出来,num是指需要多少个学校
def printUnivList(ulist, num):
    # 定义输出模板的变量,并增加宽度设定
    # {3}表示打印输出时,需要填充时使用format函数的第三个变量进行填充,也就是使用中文空格进行填充
    tplt = "{0:^10}\t{1:{3}^10}\t{2:^10}"
    # 定义输出格式,如果看不懂可以去搜下format函数,学习下
    print(tplt.format("排名", "学校名称", "评分", chr(12288)))
    # 将dr信息用简短的变量u来代替,并用for...in 将每所学校信息打印出来
    for i in range(num):
        u = ulist[i]
        print(tplt.format(u[0], u[1], u[2], chr(12288)))
    print("Suc" + str(num))




def main():
    # 将大学信息写进列表中,定义列表名uinfo
    uinfo = []
    # 给出url地址信息
    url = "http://www.zuihaodaxue.com/zuihaodaxuepaiming2018.html"
    # 用requests库中的get方法,将url信息转换成HTML信息
    html = getHTMLText(url)
    # 将提取的信息放在uinfo变量中
    fillUnivList(uinfo, html)
    # 打印大学信息,我们给出的排名信息是前30位
    printUnivList(uinfo, 30)


main()

 

 

 

 

你可能感兴趣的:(Python)