Bootstrap

爬虫实例:爬取中国大学排名Top20

每日一句:世界上没有一条道路是重复的,也没有一个人生是能够替代的。——余华《活着》

在学习对HTML页面信息的提取后,下面以实例来学习爬取网页。

首先找到需要爬取的网页:https://www.shanghairanking.cn/,再验证robots协议,如下:https://www.shanghairanking.cn/robots.txt

可以看到该网站并未对爬虫做出相关限制。

对大学排名网页爬取的要求为:

1.输入:大学排名URL链接。

2.输出:大学排名信息的输出(排名,大学名称,总分)。

3.技术路线:Requests+bs4。

4.定向爬虫:仅对输入URL进行爬取,不扩展爬取。

简单步骤:

1.从网络上获得大学排名的网页内容。

2.提取网页内容中信息到合适的数据结构。

3.利用数据结构展示并输出结果。

其中,最重要的便是在网页的代码中找到相关的标签并且进行分析,比如下图中,我们首先用快捷键Ctrl+F查找某个大学的名字,这里小编查找的是清华大学,按Enter键后会自动搜索到相关位置。找到大学名称后,在对相关标签进行分析,比如与大学名称相关的标签为a,与大学地址相关的标签为td标签,再向上找到某一所大学信息相关的标签,即tr,在tr标签内,包含了清华大学相关的所有内容;再向上找到包含所有学校信息的标签,即tbody标签。

实例源代码:

import requests
from bs4 import BeautifulSoup
import bs4
def getThmltext(url):#获取网页内容
    try:
        r=requests.get(url,timeout=30)
        r.raise_for_status()
        r.encoding=r.apparent_encoding#修改编码
        return r.text
    except:
        return ""

def fillUnivlist(info,html):#查找相关信息
    soup=BeautifulSoup(html,"html.parser")
    for tr in soup.find('tbody').children:
        if isinstance(tr,bs4.element.Tag):
            tds=tr('td')
            info.append([str(tr('td')[0].contents[0]).strip(), tds[1].a.string, str(tr('td')[4].contents[0]).strip()])
    return info

def printUnivlist(info,num):#打印相关数据
    print("{:^10}\t{:^6}\t{:^10}".format("排名","学校","总分"))
    for i in range(num):
        u=info[i]
        print("{:^10}\t{:^6}\t{:^10}".format(u[0],u[1],u[2]))

def main():
    info=[]
    url='https://www.shanghairanking.cn/rankings/bcur/2020'
    html=getThmltext(url)
    info=fillUnivlist(info,html)
    printUnivlist(info,20)#20个学校信息
main()

运行结果: