中国大学排名的爬虫实战

中国大学排名的爬虫实战(结合信息组织与提取,两种方式实现)

功能描述

  • 输入:大学排名url链接
  • 输出:大学排名信息的屏幕输出(排名,大学名称,总分)
  • 技术路线:requests-bs4
  • 定向爬虫:仅对输入url进行爬取,不扩展爬取

我们使用requests-bs4提取信息时,提取到的只是静态脚本信息,只是展示在网络页面上的。

程序的结构设计

  • 步骤1:从网络上获取大学排名网页内容 getHTMLText()
  • 步骤2:提取网页内容中信息到合适的数据结构 fillUnevList()
  • 步骤3:利用数据结构展示并输出结构 printUnivList()

用于理解上述的程序设计结构,为视频讲解中的源代码(2016版):

import requests
from bs4 import BeautifulSoup
import bs4

def getHTMLText(url):
    try:
        r = requests.get(url,timeout = 30)
        r.raise_for_stasus()
        r.encoding = r.apparend_encoding
        return r.text
    except:
        return ""
    
    
def fillUnivList(ulist,html):
	soup = BeaurifulSoup(html,"html.parser")
    # 解析html代码中的tbody标签,获得子标签
    for tr in soup.find('tbody').children:
        if isinstance(tr,bs4.element.Tag):
            # 在tr标签中找到td标签,并将td标签中所需要的东西添加到列表里
            tds = tr('td')
            ulist.append([[tds[0],tds[1],tds[2]]])


def printUnivList(ulist,num):  
    print("{:^10}\t{:^6}\t{:^10}".format("排名","学校","总分"))
    for i in range(num):
        u = ulistp[i]
        print("{:^10}\t{:^6}\t{:^10}".format(u[0],u[1],u[2]))
    
def main():
    unifo = []
    url = "https://www.shanghairanking.cn/rankings/bcur/201611"
    html = getHTMLText(url)
    fillUnivList(unifo,html)
    printUnivList(unifo,20)
    
main()

现对上述代码进行实现,并阐述自己的想法:

对html页面进行文本获取:

import requests
from bs4 import BeautifulSoup
import re

html = 'https://www.shanghairanking.cn/rankings/bcur/2021'
try:
    r = requests.get(html)
    r.raise_for_status()
    r.encoding = r.apparent_encoding
    demo = r.text
except:
    print(" ")
soup = BeautifulSoup(demo,'html.parser')
# print(soup)

此时,我们有两种想法。一、获取每一所大学的相关信息,并把他们存放在一个列表中。思路和视频中的代码类似。二、根据属性值获取每一个大学的内容,并将统一个属性值的放到一个列表中(具体思路可以参考信息组织与提取的文章https://blog.csdn.net/petrichor316/article/details/122647192)。

我们现给出第二种思路的代码:

# 获取a标签下的属性为name-cn的文本
name = soup.find_all('a','name-cn')
names = []
for i in name:
    names.append(i.text)
print(names)
# 获取div标签下的属性为ranking的文本
rank = soup.find_all('div',re.compile('ranking'))
ranks = []
for j in rank:
    ranks.append(j.text.strip())
print(ranks)
point = []
for tr in soup.tbody.children:
    u = (tr.text).split()
    point.append(u[-2])
print(point)

这种方法有一个弊端,就是没有很好的办法获取到没有属性值,且标签与无关信息的标签一致的信息。

输出如下结果:在这里插入图片描述

接着,我们给出第一种思路的代码:

unis = []
# 找到tbody标签下的tr标签
for tr in soup.tbody.children:
    uni = []
    point = tr.children
# print(point.string.strip())
	# 在tr标签下获取一所大学的全部信息
    for k in point:
        # print(k)
        # print(k.text.strip())
        uni.append(k.text.strip())
    unis.append(uni)
print(unis)

如图所示:在这里插入图片描述

现给出完整代码

import requests
from bs4 import BeautifulSoup
import re

html = 'https://www.shanghairanking.cn/rankings/bcur/2021'
r = requests.get(html)
r.raise_for_status()
r.encoding = r.apparent_encoding
demo = r.text

soup = BeautifulSoup(demo,'html.parser')

unis = []
for tr in soup.tbody.children:
    uni = []
    point = tr.children
# print(point.string.strip())
    for k in point:
        # print(k)
        # print(k.text.strip())
        uni.append(k.text.strip())
    unis.append(uni)
print(unis)

print('{:^6}\t{:^15}\t{:^6}\t{:^6}\t{:^6}\t{:^6}'.format('排名','学校名称','省份','类型','总分','办学层次'))

for uni in unis:
    print('{:^6}\t{:^15}\t{:^6}\t{:^6}\t{:^6}\t{:^6}'.format(uni[0],uni[1].split(' ')[0],uni[2],uni[3],uni[4],uni[5]))
  

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

肇锡

希望各位勿喷,相互促进学习!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值