Python定向爬虫实例:中国大学排名爬虫

本文记录了一位初学者在学习Python网络爬虫时遇到的问题,包括URL变动、代码报错及网页源码解析的困扰。作者通过调整代码,解决了TypeError错误,并学会了如何从经过JavaScript修饰的源码中提取所需信息。最后成功爬取并展示了软科2021年中国大学排名的部分数据。
摘要由CSDN通过智能技术生成

昨天学到北理工开设的《Python网络爬虫与信息提取》的“中国大学排名”实例,总结编写实例过程中遇到的一些问题。

url

视频中代码给出的网址是:

http://www.zuihaodaxue.cn/zuihaodaxuepaiming2016.html

但是编写过程中发现该url已不可用,该网站已改名为软科

要用新的url进行编程:

【软科排名】2021年最新软科中国大学排名|中国最好大学排名

TypeError: unsupported format string passed to NoneType.__format__

这个问题顾名思义是字符串的.format方法出了问题,上网找到了一篇博客记录了相同问题和解决方案:

问题解决:TypeError: unsupported format string passed to NoneType.__format___Mr.Q_LuLu的博客-CSDN博客经过修改(把string方法改成text方法)后的代码是这样的:

def fillUnivList(ulist,html):
    soup=BeautifulSoup(html,"html.parser")
    for tr in soup.find('tbody').children:
        if isinstance(tr,bs4.element.Tag):
            tds=tr('td')
            ulist.append([tds[0].text.strip(),tds[1].text.strip(),tds[4].text.strip()])

 但是又发现一个问题:打印大学名称时还打印出来一些其他的东西(本来还有许多空格,代码中用.strip方法去除,同样借鉴于之前那篇博客)

去除无用信息

其实是网页的源代码发生了变化

于是我花了一个多小时寻找解决方法:“如何打印标签内的特定文本”

结果搜索到的却是一些诸如xpath之类的方法使我这个小白一脸懵逼

我通过“检查”查看了网页的源码:

 ?这一层层嵌套的<div>直接给我整懵了,“这题超纲了吧?”

最终是在之前这位博主的另一篇博客找到了答案:

Python爬虫入门实例三之爬取软科中国大学排名_Mr.Q_LuLu的博客-CSDN博客

里面有这么一句话:

 ?a标签?我看的怕是个假的源码???

幸亏原博有图,原来是通过网页查看的源码

我这才恍然大悟:通过检查看到的源码和网页看到的源码并不完全一样

搜索后了解到:“检查”看到的是经过JavaScript修饰的源码,与源代码并不完全一样

根据原博修改了自己的代码,最后也是很快就运行成功了,代码如下:

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):
            a=tr('a')
            tds=tr('td')
            ulist.append([tds[0].text.strip(),a[0].text.strip(),tds[4].text.strip()])

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

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

运行结果:(至于视觉效果应该是每个人不一样(?)可以适当调整输出宽度)

总结

其实这部分本来写了好多话,针对自己学习这个实例时候的波折和学习到的经验以及对多次提到的那位博主的感谢,但是即将完成之际一个ctrl+z直接回到了第二部分少了将近1000字,气得我差点砸电脑(╬ ̄皿 ̄) ,最后也是没恢复成。

希望可以给到同样刚刚入门的学习者一些帮助,同时作为一个学习python过程中的纪念吧(还有第一次写文章却白打1000字(好气啊!))

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

你向江南处处栽

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

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

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

打赏作者

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

抵扣说明:

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

余额充值