思路说明:以下的几种排名数据全部来自“迁木网”,爬取每一种排名时所用的代码大致相同,只有部分因网页数据格式的不同而引起的变动。以下将爬取四种排名的代码分别列出,并展示结果。由于第二题中需要用到第一题中所得到的数据,而将四种排名爬到的数据全部放在一份程序中,既会显得冗长混乱,又会由于爬取每种排名时所用的源代码细节的不同而出现问题。故在第一问爬取数据后,我将每一份排名数据转换为python的pandas库中的DataFrame形式并输出csv文件到桌面,在完成第二题时,直接读入数据,再进行分析即可。
一、编写实现最新世界大学四大排名的爬虫,并输出世界前100排名,中国前二十排名
- 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")
- 3. 上海交通大学软科学世界大学排名
-
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")