中国大学排名定向爬虫

中国大学排名定向爬虫

功能描述

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

程序的结构设计

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

import requests
from bs4 import BeautifulSoup
import bs4

'''输入是需要获取的url信息,输出是url的内容
def getHTMLText(url):
    return ""
    将url信息从网络中爬取下来,并将它其中的html页面返回给其他的程序
'''
def getHTMLText(url):
    try:
        r=requests.get(url,timeout=30)
        r.raise_for_status()
        r.encoding=r.apparent_encoding
        return r.text
    except:
        return ""

'''将一个HTML页面放到一个list列表中,列表定义为ulist
def fillUnivList(ulist,html):
    pass
提取html中关键的数据 并且填到一个列表中
'''
def fillUnivList(ulist,html):
    soup=BeautifulSoup(html,"html.parser")
    # print(soup.prettify())
    #查找tbody中的tr标签并将它的孩子进行遍历
    for tr in soup.find('tbody').children:
      #过滤非标签类型的其他信息
      #用isinstance函数对类型做判断
      if isinstance(tr,bs4.element.Tag):
          tds=tr('td')
          ulist.append([tds[0].string,tds[1].a.string,tds[4].string])

'''将ulist信息打印出来'''
def printUnivList(ulist,num):
    # 打印表头
    print("{:^10}\t{:^6}\t{:^10}".format("排名","学校名称","总分"))
    for i in range(num):
        u=ulist[i]
         #   打印其他信息
        # 所有信息保存在ulist中 ,想输出的学校由number来控制
        print("{:^10}\t{:^6}\t{:^10}".format(u[0],u[1],u[2]))

#主函数
def main():
    #信息放在uinfo中
    uinfo=[]
    url='https://www.shanghairanking.cn/rankings/bcur/2022'
    html=getHTMLText(url)
    fillUnivList(uinfo, html)
    printUnivList(uinfo, 20) #打印20条信息

main()

中文输出对齐

import requests
from bs4 import BeautifulSoup
import bs4

'''输入是需要获取的url信息,输出是url的内容
def getHTMLText(url):
    return ""
    将url信息从网络中爬取下来,并将它其中的html页面返回给其他的程序
'''
def getHTMLText(url):
    try:
        r=requests.get(url,timeout=30)
        r.raise_for_status()
        r.encoding=r.apparent_encoding
        return r.text
    except:
        return ""

'''将一个HTML页面放到一个list列表中,列表定义为ulist
def fillUnivList(ulist,html):
    pass
提取html中关键的数据 并且填到一个列表中
'''
def fillUnivList(ulist,html):
    soup=BeautifulSoup(html,"html.parser")
    # print(soup.prettify())
    #查找tbody中的tr标签并将它的孩子进行遍历
    for tr in soup.find('tbody').children:
      #过滤非标签类型的其他信息
      #用isinstance函数对类型做判断
      if isinstance(tr,bs4.element.Tag):
          tds=tr('td')
          ulist.append([tds[0].string,tds[1].a.string,tds[2].text])

'''将ulist信息打印出来'''
def printUnivList(ulist,num):
    # 打印表头
    tplt = "{0:^10}\t{1:{3}^10}\t{2:^10}"
    print(tplt.format("排名","学校名称","省份",chr(12288)))
    for i in range(num):
        u=ulist[i]
         #   打印其他信息
        # 所有信息保存在ulist中 ,想输出的学校由number来控制
        print(tplt.format(u[0].strip(),u[1].strip(),u[2].strip(),chr(12288)))

#主函数
def main():
    #信息放在uinfo中
    uinfo=[]
    url='https://www.shanghairanking.cn/rankings/bcur/2022'
    html=getHTMLText(url)
    fillUnivList(uinfo, html)
    printUnivList(uinfo, 20) 
    #打印20条信息

main()

bs4 string与text的区别

在指定标签td,没有子标签,且有文本时,两者的返回结果一致,都是文本

在指定标签td,没有子标签,且没有文本时,.string返回None,.text返回为空

在指定标签td,只有一个子标签时,且文本只出现在子标签之间时,两者返回结果一致,都返回子标签内的文本

最关键的区别,在指定标签td,有子标签,并且父标签td和子标签p各自包含一段文本时,两者的返回结果,存在很大的差异

.string返回为空,因为文本数>=2,string不知道获取哪一个

.text返回的是,两段文本的拼接。
https://www.cnblogs.com/kaibindirver/p/11374669.html

posted @ 2022-05-10 12:24  flyall  阅读(118)  评论(0)    收藏  举报