【Python爬虫】2023中国大学排名爬取

【Python爬虫】2023中国大学排名爬取

  • 项目思路
    • 一、对项目进行分析
    • 二、编写函数
    • 三、测试
    • 四、代码

项目思路

本代码大多参考北京理工大学嵩天老师代码,略作修改,学习其编码思想,嵩天老师中国慕课上的Python课非常不错,深入浅出,很系统
1 一个项目的编写,需要先列框架,然后再填入细节代码,将一个项目分成块,使用不同的函数
2 要符合规范,使用main函数进行调用
根据链接获取大学排名并将排名屏幕输出

一、对项目进行分析

功能描述:
输入:大学排名URL链接
输出:大学排名的屏幕输出(排名,学校名称,总分)
技术路线:requests-bs4
定向爬虫:仅对输入URL进行爬取,不扩展爬取
爬虫可行性分析:
1 确定想要的信息是否写在了源代码中,因为某些信息是通过JS动态加载的,无法使用requests-bs4获取
2 确定网站是否有robots协议(该网站无robots协议,可以爬取)

对程序结构进行初步设计:
步骤一:从网络上获取大学排名网页内容
步骤二:提取网页内容到合适的数据结构
步骤三:利用数据结构展示并输出结果

将每个步骤定义为一个函数,使程序结构清晰,可读性更好

二、编写函数

1 因为使用到网络请求,先导入库
2 因为还未对函数的内部进行实现,因此先写三个出函数的定义
3 写主函数
4 写各个函数细代码

三、测试

1 调试运行测试
2 代码优化
3 可将url中的年份换成其他,例如2020等进行尝试

四、代码

import requests
from bs4 import BeautifulSoup
import bs4

def getHTMLText(url):
    try:
        r = requests.get(url)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        return r.text
    except:
        return ""


def fillUnivList(ulist, html):
    # 将html对象赋给BuautifulSoup类的对象soup
    soup = BeautifulSoup(html, "html.parser")
    # soup.prettify()
    # 所有的大学排名信息在tbody标签下的tr中,每个大学单独一个tr,大学的信息在tr标签中的str中
    for tr in soup.find("tbody").children:
        # 排除非标签的tr
        if isinstance(tr, bs4.element.Tag):
            # 大学信息在tr标签中的td标签中
            tds = tr("td")
            # 将td标签中的内容赋值给ulist
            # 使用正则表达式删除string中的换行符和空格
            ulist.append([tds[0].string.replace(" ", '').replace("\n", ''), tds[1].find('a').string.replace(" ", '').replace("\n", ''), tds[4].string.replace(" ", '').replace("\n", '')])  # 目前这里存在问题,原因在于包含有校名的td标签中还有其他字符串
    print(ulist)
    pass


def printUnivList(ulist, num):
    # 格式化输出
    print("{0:^10}\t{1:^10}\t{2:^10}".format("排名", "学校名称", "分数", chr(12288)))
    # 对ulist进行遍历
    for i in range(num):
        # 每个大学信息
        u = ulist[i]
        # 打印出大学信息
        print("{0:^10}\t{1:^10}\t{2:^10}".format(u[0], u[1], u[2], chr(12288)))




def main():
    # 大学信息列表
    unifo = []

    # 大学信息网链接
    url = "https://www.shanghairanking.cn/rankings/bcur/202311"

    # 获取网页信息
    html = getHTMLText(url)

    # 将html放在大学信息变量unifo中
    fillUnivList(unifo, html)

    # 打印大学信息
    printUnivList(unifo, 20) # num = 20


main()

苟有恒,何必三更眠五更起;
最无益,莫过一日暴十日寒。

共勉!
-1-

  • 12
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值