爬虫案例:中国大学排名及网站更新后爬取问题解决(2021.3.28)

解答标签string属性Tag.string方法获取不了的问题

本次爬虫的URL(上海软科中国大学排名):
https://www.shanghairanking.cn/rankings/bcur/2020

案例来源:中国大学慕课嵩天老师的“Python网络爬虫与信息提取
由于该课程的录制时间较早,而案例爬取网站做了部分的代码修改,导致课程中的爬虫案例的部分代码已不适用于今天网站的内容结构,所以就有了开始学习爬虫的你来到了CSDN,哈哈哈哈。

课程中的案例代码这里就不展示了,直接上问题
由于网页中的这部分做了一定的修改,所以这样的方式已不再适用
由于网页中的这部分做了一定的修改,所以这样的方式已不再适用。
接下来我们找到网页中大学排名的Html代码对应的位置,看看是怎样的。
在这里插入图片描述
这里和课程文档内的网页对比一下,你应该就发现了问题的所在。以前我们想要爬取的网页完全是直接就在td标签内的,因此可以很方便快捷的照抄案例代码就能爬取数据。
在这里插入图片描述
在这里插入图片描述
这里可以看出不能再使用Tag.string来获取当前特殊情况下的String属性。
但是我们想要获取数据就需要从这里打印输出数据,于是我想了一个办法把td标签里的内容强制转换为str类型----->输出。

复习一下知识点

// strip()删除字符串开头和结尾的空白
.strip()
//删除左边的空白
.lstrip()
//删除右边的空白
.rstrip()
//<tag>所有的儿子节点存入列表
Tag.contents   

在这里插入图片描述
到这其实就差不多了,只要能够想到这一点,问题就能迎刃而解了。

我的完整代码代码如下:

import requests
import bs4
from bs4 import BeautifulSoup

def getHTMLText(url, headers):
    try:
        r = requests.get(url=url, headers=headers, timeout=30)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        soup = BeautifulSoup(r.text,"html.parser")
        return soup
    except:
        return ""

def fillUnivList(ulist, html):

    for tr in html.find("tbody").children:
        if isinstance(tr,bs4.element.Tag):
            tds = tr('td')
            rank = str(tds[0].contents[0]).strip()
            school = str(tds[1].a.string)
            score = str(tds[4].contents[0]).strip()
            cla = str(tds[5].string).strip()
            ulist.append([rank, school, score, cla])
    return ulist


def printUnivList(ulist,num):
    tplt = "{0:^10}\t{1:^10}\t{2:^10}\t{3:^10}"
    print(tplt.format("排名", "学校名称", "总分", "class"))
    for i in range(num):
        u = ulist[i]
        print(tplt.format(u[0], u[1], u[2], u[3]))


if __name__ == "__main__":
    info = []
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36"
    }
    url = "https://www.shanghairanking.cn/rankings/bcur/2020"

    html = getHTMLText(url,headers)
    info = fillUnivList(info, html)
    printUnivList(info,30)

结果展示如下:
在这里插入图片描述
一起学Python,一起写代码


原代码出现无法找到 tbody 的标签的报错。

经反馈,原网站内容无法按照上面的源码爬取,故作了以下修改,从network下的Xpath抓包获取数据

import requests
import json
import pandas as pd


def getHTMLText(url, headers):
    try:
        r = requests.get(url=url, headers=headers, timeout=30)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        # soup = BeautifulSoup(r.text,"html.parser")
        data_json = json.loads(r.text)
        return data_json["data"]["rankings"]
    except:
        print("爬取失败")

def get_data(jdata):
    # data = pd.DataFrame(jdata)
    # 获取排名、大学、总分、等级信息
    ind = pd.DataFrame([i["indData"]["59"] for i in jdata])
    rank = pd.DataFrame([i["rankOverall"] for i in jdata])
    school = pd.DataFrame([i["univNameCn"] for i in jdata])
    score = pd.DataFrame([i["score"] for i in jdata])

    df = pd.concat([rank, school, score,ind], axis=1,)
    df.columns = ["排名", "学校名称", "总分", "class"]

    return df

def printRank(uinfo,num):
    tplt = "{0:^10}\t{1:^10}\t{2:^10}\t{3:^10}"
    print(tplt.format("排名", "学校名称", "总分", "class"))
    for i in range(num):
        u = uinfo.loc[i]
        print(tplt.format(u[0], u[1], u[2], u[3]))

if __name__ == "__main__":
    # info = []
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36 Edg/89.0.774.75"
    }
    url = "https://www.shanghairanking.cn/api/pub/v1/bcur?bcur_type=11&year=2020"

    html = getHTMLText(url,headers)

    info = get_data(html)
    printRank(info,20)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

明总有

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值