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