嵩天老师爬虫实战笔记

参考文章:Python 最好大学网大学排名爬取(2020年)

中国大学MOOC嵩天老师Python网络爬虫课程第二周第六单元实例1爬取的大学排名网页发生变化,知远同学的blog在老师原来代码的基础上进行了修改,我发现网页又发生了变化,继续修改,给出最新的爬取过程及代码。

一、网页分析

网页链接:https://www.shanghairanking.cn/rankings/bcur/2020

发生变化的地方1 (参考知远同学blog)

大学名字增加超链接,名字包裹在td标签下的a标签内,需要注意

嵩天老师爬虫实战笔记

发生变化的地方2

td标签中表示序号的标签td[0]以及表示分数的标签td[4]内有空行
嵩天老师爬虫实战笔记
如果直接用

td[0].string

由于对象为空,printUnivList函数中的format将会报错:

TypeError: unsupported format string passed to NoneType.__format__

因此需要去掉空行。
首先想到的是replace()方法:

tds[0].text.replace("\n", "")

经调试,确实可行。

后查阅bs4文档,发现了stripped_strings方法:

tds[0].stripped_strings

二、代码:

# -*- coding: utf-8 -*-
# Created on 2021/3/6 14:01

import requests
from bs4 import BeautifulSoup
import bs4


# 获取目标网页的文本信息
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):
    soup = BeautifulSoup(html, "html.parser")
    for tr in soup.find('tbody').children:
        if isinstance(tr, bs4.element.Tag):
            tds = tr.find_all('td')
            name = tds[1].find('a').string.strip()
            rank = tds[0].text.replace("\n", "").strip()
            score = tds[4].text.replace("\n", "").strip()
            ulist.append([rank, name, score])


# 打印列表内容
def printUnivList(ulist, num):
    print("{:^10}\t{:^6}\t{:^10}".format("排名", "学校名称", "总分"))
    for i in range(num):
        u = ulist[i]
        print("{:^10}\t{:^6}\t{:^10}".format(u[0], u[1], u[2]))


def main():
    uinfo = []
    url = 'https://www.shanghairanking.cn/rankings/bcur/2020'
    html = getHTMLText(url)
    fillUnivList(uinfo, html)
    printUnivList(uinfo, 20)


main()

另一种fillUnivList写法:

# 通过BeautifulSoup库解析网页,将信息加入列表中
def fillUnivList(ulist, html):
    soup = BeautifulSoup(html, "html.parser")
    for tr in soup.find('tbody').children:
        if isinstance(tr, bs4.element.Tag):
            tds = tr.find_all('td')
            tlist = []  # 创建临时列表
            for rank in tds[0].stripped_strings:  # 使用stripped_strings去掉换行、空格等
                tlist.append(rank)
                name = tds[1].find('a').string.strip()
                tlist.append(name)
                for score in tds[4].stripped_strings:
                    tlist.append(score)
        ulist.append([tlist[0], tlist[1], tlist[2]])  # 将临时列表元素填充到ulist

输出结果:

    排名    	 学校名称 	    总分    
    1     	 清华大学 	  852.5   
    2     	 北京大学 	  746.7   
    3     	 浙江大学 	  649.2   
    4     	上海交通大学	  625.9   
    5     	 南京大学 	  566.1   
    6     	 复旦大学 	  556.7   
    7     	中国科学技术大学	  526.4   
    8     	华中科技大学	  497.7   
    9     	 武汉大学 	   488    
    10    	 中山大学 	  457.2   
    11    	西安交通大学	  452.5   
    12    	哈尔滨工业大学	  450.2   
    13    	北京航空航天大学	  445.1   
    14    	北京师范大学	  440.9   
    15    	 同济大学 	   439    
    16    	 四川大学 	  435.7   
    17    	 东南大学 	  432.7   
    18    	中国人民大学	  409.7   
    19    	 南开大学 	  402.1   
    20    	北京理工大学	  395.6   

就写到这了,第一篇blog,欢迎批评指导

上一篇:脚本操作基础


下一篇:oeasy教您玩转vim - 9 - # 换行插入