最近在刷北京理工大学的pyhton课程,因为在学基础,就想着想把当时的心得和想法记录下来,同时做一个总结。
我在看这个课程的时候,课程已经是2016年的了,所以嵩天老师上面讲的爬取中国大学排名的代码已经不适用了,所以想在这里更新一下:
首先中国大学排名的网站已经变更,变成:https://www.shanghairanking.cn/rankings/bcur/2021
其次所要爬取的内容框架有点不一样了。
好了,我们接下来谈怎么爬取吧。
这是效果图:
还是按照课程的要求,我采用requests库和beautifulsoup库,其中我还加了re库(正则表达式库,这是自带的不用安装)
功能需求:
输入:大学排名的url链接
输出:大学排名的屏幕信息(包括排名,大学名称,总分,层次)
技术路线:requests,bs4,re
定向爬虫:仅对输入的url链接爬取
爬虫的第一步,应该先看看该网站是否可以爬取,通过查看robot协议,该网站是允许爬取的。
首先导入库:
import requests
from bs4 import BeautifulSoup #B和S要大写!!!这里吃了亏。。。。
import re
创建获取网页数据的函数:
#获取网页数据
def getunivText(url):
try:
r = requests.get(url)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except:
return ""
创建解析函数并且将爬取内容存储的函数:
def fillunivList(ulist,html):
soup = BeautifulSoup(html,'html.parser') #使用html.parser解析html文本,以便使用soup搜索。
for tr in soup.find('tbody').children:
tds = tr.find_all('td')
temp = []
for i in [0,1,4,5]:
if i !=1:
t = tds[i].string
temp.append(re.sub('\s*|\n','',t))
else:
t = tds[i].find('a')
temp.append(temp.string)
ulist.append(temp)
return ulist
这部分是核心部分,通过查看网页的F12,发现我们所要的数据都在tbody这个标签里面:
tbody下面的每一个tr标签里面的内容就是一所大学的信息:
经观察tr标签下面的td标签,总共有6个,其中第1个,第2个,第5个,第6个才是我们所要的排名,名称,总分,办学层次的数据,其中第2个标签内,清华大学的名称还不在td标签内,在a标签内
所以用了一个if条件判断,来独立获取大学的名称信息。
这句:
for i in [0,1,4,5]:
if i !=1:
t = tds[i].string
ulist.append(re.sub('\s*|\n','',t))
else:
temp = tds[i].find('a')
ulist.append(temp.string)
而re.sub(’\s*|\n’,’’,t),的含义是将字符串t中的空格(多个或者一个)以及换行符\n替换成空。因为在获取.string的过程中发现了字符串里有干扰字符空格和换行符。
创建打印函数
def printunivRank(ulist,num):
print('{0:^4}\t{1:^10}\t\t{2:^5}\t{3:^5}'.format('排名','大学名称','总分','办学层次'))
for i in range(num):
a,b,c,d = ulist[i]
print('{0:{4}^4}\t{1:{4}^10}\t{2:{4}^5}\t{3:{4}^5}'.format(a,b,c,d,chr(12288)))
最后一步,创建主函数
def main():
url = 'https://www.shanghairanking.cn/rankings/bcur/2021'
html_text = getunivText(url)
unilist = [] #创建存储排名数据列表
fillunivList(unilist,html_text)
print(printunivRank(unilist,20))
main()
完整代码:
import requests
from bs4 import BeautifulSoup
import re
#创建获取网页数据的函数geunivText
def getnuivText(url):
try:
r = requests.get(url)
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:
tds = tr.find_all('td')
temp = []
for i in [0,1,4,5]:
if i != 1:
t = tds[i].string
temp.append(re.sub('\s*|\n','',t))
else:
t = tds[i].find('a')
temp.append(t.string)
ulist.append(temp)
return ulist
#创建打印函数
def printunivRank(ulist,num):
print('{0:^4}\t{1:^10}\t\t{2:^5}\t{3:^5}'.format('排名','大学名称','总分','办学层次'))
for i in range(num):
a,b,c,d = ulist[i]
print('{0:{4}^4}\t{1:{4}^10}\t{2:{4}^5}\t{3:{4}^5}'.format(a,b,c,d,chr(12288)))
def main():
url = 'https://www.shanghairanking.cn/rankings/bcur/2021'
html_text = getnuivText(url)
unlist = []
fillunivList(unlist,html_text)
print(printunivRank(unlist,20))
main()
输出结果:
环境:
python 3.8
使用的是集成包anacoda
win10
64位
OVER~