python爬虫 爬取大学排名

思路说明:以下的几种排名数据全部来自“迁木网”,爬取每一种排名时所用的代码大致相同,只有部分因网页数据格式的不同而引起的变动。以下将爬取四种排名的代码分别列出,并展示结果。由于第二题中需要用到第一题中所得到的数据,而将四种排名爬到的数据全部放在一份程序中,既会显得冗长混乱,又会由于爬取每种排名时所用的源代码细节的不同而出现问题。故在第一问爬取数据后,我将每一份排名数据转换为python的pandas库中的DataFrame形式并输出csv文件到桌面,在完成第二题时,直接读入数据,再进行分析即可。

一、编写实现最新世界大学四大排名的爬虫,并输出世界前100排名,中国前二十排名

  1. qs世界大学排名(调用相关的函数就可以输出对应的前多少的排名啦)

from pandas import DataFrame,Series
import pandas as pd
import requests
from bs4 import BeautifulSoup
import bs4

allUniv = {'排名':[],'学校名称':[],'国家':[]}
url = 'http://www.qianmu.org/ranking/1528.htm'
#url = 'http://www.qianmu.org/2018USNEWS%E4%B8%96%E7%95%8C%E5%A4%A7%E5%AD%A6%E6%8E%92%E5%90%8D'

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的函数
def fillUnivList(soup):
    data00 = soup.find_all('div',class_ = "rankItem")
    data0 = data00[1].find_all('tbody')
    data = data0[0].find_all('tr')
    for tr in data[1:]:
        ltd = tr.find_all('td')
        if len(ltd) == 0:
            continue
        allUniv['排名'].append(ltd[0].string)
        allUniv['学校名称'].append(ltd[1].string)
        allUniv['国家'].append(ltd[3].string)
#将需要的信息放在一个字典的几个相应的列表中的函数,便于生成DataFrame
        

def printUnivList(num,scope = "World"):
    if scope == "World":
        printWorldUnivlist(num)
    elif scope == "China":
        printChinaUnivlist(num)
#通过传入数字和排名种类打印出相应排名,默认打印世界排名
def printWorldUnivlist(num):
    
    print("{1:^2}   {2:{0}<30}".format(chr(12288),"排名","学校名称"))
    for i in range(0,num):  
        try:
            print("{1:^4}    {2:{0}<60}".format(chr(12288),df.ix[i]['排名'],df.ix[i]['学校名称']))
        except:
            continue
#打印世界排名前num的大学

def printChinaUnivlist(num):
    print("{1:^2}   {2:{0}<30}".format(chr(12288),"排名","学校名称"))
    df_china = df[df['国家'] == '中国']
    for i in range(0,num):
        print("{1:^4}    {2:{0}<60}".format(chr(12288),df_china.index[i],df_china.iloc[i]['学校名称']))
#打印中国排名前num的大学

html = getHTMLText(url)
soup = BeautifulSoup(html,'html.parser')
fillUnivList(soup)
df = DataFrame(allUniv)

df.to_csv(r"C:/Users/ichigo/Desktop/qs.csv")

 

2.USNEWS世界大学排名

from pandas import DataFrame,Series
import pandas as pd
import requests
from bs4 import BeautifulSoup
import bs4

allUniv = {'排名':[],'学校名称':[],'国家':[]}
url = 'http://www.qianmu.org/2018USNEWS%E4%B8%96%E7%95%8C%E5%A4%A7%E5%AD%A6%E6%8E%92%E5%90%8D'

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的函数

def fillUnivList(soup):
    #data00 = soup.find_all('div',class_ = "rankItem")
    data0 = soup.find_all('tbody')
    data = data0[0].find_all('tr')
    for tr in data[1:]:
        ltd = tr.find_all('td')
        if len(ltd) == 0:
            continue
        allUniv['排名'].append(ltd[0].string)
        allUniv['学校名称'].append(ltd[1].string)
        allUniv['国家'].append(ltd[3].string)
#将需要的信息放在一个字典的几个相应的列表中的函数,便于生成DataFrame
       
def printUnivList(num,scope = "World"):
    if scope == "World":
        printWorldUnivlist(num)
    elif scope == "China":
        printChinaUnivlist(num)
#通过传入数字和排名种类打印出相应排名,默认打印世界排名

def printWorldUnivlist(num):
    
    print("{1:^2}   {2:{0}<30}".format(chr(12288),"排名","学校名称"))
    for i in range(0,num):  
        try:
            print("{1:^4}    {2:{0}<60}".format(chr(12288),df.ix[i]['排名'],df.ix[i]['学校名称']))
        except:
            continue
#打印世界排名前num的大学

def printChinaUnivlist(num):
    print("{1:^2}   {2:{0}<30}".format(chr(12288),"排名","学校名称"))
    df_china = df[df['国家'] == '中国']
    for i in range(0,num):
        print("{1:^4}    {2:{0}<60}".format(chr(12288),df_china.index[i],df_china.iloc[i]['学校名称']))
#打印中国排名前num的大学


html = getHTMLText(url)
soup = BeautifulSoup(html,'html.parser')
fillUnivList(soup)
df = DataFrame(allUniv)
for indexs in df.index:
    try:
        df['国家'].ix[indexs] = (df['国家'].ix[indexs]).strip()
    except:
        continue
df.to_csv(r"C:\Users\ichigo\Desktop\usnews.csv")
  1. 3. 上海交通大学软科学世界大学排名
  2. from pandas import DataFrame,Series
    import pandas as pd
    import requests
    from bs4 import BeautifulSoup
    import bs4
    
    allUniv = {'排名':[],'学校名称':[],'国家':[]}
    url = 'http://www.qianmu.org/2018USNEWS%E4%B8%96%E7%95%8C%E5%A4%A7%E5%AD%A6%E6%8E%92%E5%90%8D'
    
    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的函数
    
    def fillUnivList(soup):
        #data00 = soup.find_all('div',class_ = "rankItem")
        data0 = soup.find_all('tbody')
        data = data0[0].find_all('tr')
        for tr in data[1:]:
            ltd = tr.find_all('td')
            if len(ltd) == 0:
                continue
            allUniv['排名'].append(ltd[0].string)
            allUniv['学校名称'].append(ltd[1].string)
            allUniv['国家'].append(ltd[3].string)
     #将需要的信息放在一个字典的几个相应的列表中的函数,便于生成DataFrame       
    
    def printUnivList(num,scope = "World"):
        if scope == "World":
            printWorldUnivlist(num)
        elif scope == "China":
            printChinaUnivlist(num)
    #通过传入数字和排名种类打印出相应排名,默认打印世界排名
    
    def printWorldUnivlist(num):
        
        print("{1:^2}   {2:{0}<30}".format(chr(12288),"排名","学校名称"))
        for i in range(0,num):  
            try:
                print("{1:^4}    {2:{0}<60}".format(chr(12288),df.ix[i]['排名'],df.ix[i]['学校名称']))
            except:
                continue
    #打印世界排名前num的大学
    
    def printChinaUnivlist(num):
        print("{1:^2}   {2:{0}<30}".format(chr(12288),"排名","学校名称"))
        df_china = df[df['国家'] == '中国']
        for i in range(0,num):
            print("{1:^4}    {2:{0}<60}".format(chr(12288),df_china.index[i],df_china.iloc[i]['学校名称']))
    #打印中国排名前num的大学
    
    
    html = getHTMLText(url)
    soup = BeautifulSoup(html,'html.parser')
    fillUnivList(soup)
    df = DataFrame(allUniv)
    
    for indexs in df.index:
        try:
            df['国家'].ix[indexs] = (df['国家'].ix[indexs]).strip()
        except:
            continue
    #将某些“国家”对应字符串两边有空格的去掉空格
    
    
    df.to_csv(r"C:\Users\ichigo\Desktop\arwu.csv")

    4.THE世界大学排名


from pandas import DataFrame,Series
import pandas as pd
import requests
from bs4 import BeautifulSoup
import bs4

allUniv = {'排名':[],'学校名称':[],'国家':[]}
url = 'http://www.qianmu.org/ranking/902.htm'

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的函数

def fillUnivList(soup):
    #data00 = soup.find_all('div',class_ = "rankItem")
    data0 = soup.find_all('tbody')
    data = data0[0].find_all('tr')
    for tr in data[1:]:
        ltd = tr.find_all('td')
        if len(ltd) == 0:
            continue
        allUniv['排名'].append(ltd[0].string)
        allUniv['学校名称'].append(ltd[1].string)
        allUniv['国家'].append(ltd[6].string)
#将需要的信息放在一个字典的几个相应的列表中的函数,便于生成DataFrame        

def printUnivList(num,scope = "World"):
    if scope == "World":
        printWorldUnivlist(num)
    elif scope == "China":
        printChinaUnivlist(num)
#通过传入数字和排名种类打印出相应排名,默认打印世界排名

def printWorldUnivlist(num):
    
    print("{1:^2}   {2:{0}<30}".format(chr(12288),"排名","学校名称"))
    for i in range(0,num):  
        try:
            print("{1:^4}    {2:{0}<60}".format(chr(12288),df.ix[i]['排名'],df.ix[i]['学校名称']))
        except:
            continue
#打印世界排名前num的大学

def printChinaUnivlist(num):
    print("{1:^2}   {2:{0}<30}".format(chr(12288),"排名","学校名称"))
    df_china = df[df['国家'] == '中国']
    for i in range(0,num):
        print("{1:^4}    {2:{0}<60}".format(chr(12288),df_china.index[i],df_china.iloc[i]['学校名称']))
#打印中国排名前num的大学


html = getHTMLText(url)
soup = BeautifulSoup(html,'html.parser')
fillUnivList(soup)
df = DataFrame(allUniv)
for indexs in df.index:
    try:
        df['国家'].ix[indexs] = (df['国家'].ix[indexs]).strip()
    except:
        continue
#将某些“国家”对应字符串两边有空格的去掉空格
df.to_csv(r"C:\Users\ichigo\Desktop\THE.csv")

 

你可能感兴趣的:(python)