爬虫爬取中国大学排名
import requests
import bs4 #导入bs4库,下文检测网页数据类型会用到
from bs4 import BeautifulSoup
def getHTMLText(url): #step1 '''获取网页信息的通用框架'''
try:
r=requests.get(url,timeout=40)
r.raise_for_status()
r.encoding=r.apparent_encoding
return r.text
except:
return '' #否则返回内容为空
def fillUnivList(ulist,html): #step2 提取HTML中关键数据,并添加到列表中
soup=BeautifulSoup(html,'html.parser')
# 检查网页代码可以发现数据都储存在tboyd标签中,这里需要对tbody的儿子节点进行遍历
for tr in soup.find('tbody').children:
# 检测标签类型,如果不是bs4库支持的Tag类型,就过滤掉
if isinstance(tr,bs4.element.Tag):
# 解析出tr标签中的td标签后,将其储存在列表tds中
tds=tr('td')
# 我们需要的是排名、学校名称和总分,写入列表
ulist.append([tds[0].string,tds[1].string,tds[3].string])
def printUnivList(ulist,num): #step3
#定义输出模板为变量tplt,\t为横向制表符,10为每列的宽度
tplt="{0:^10}\t{1:{3}^10}\t{2:^10}"
#format格式化,{3}为下行中chr(12888),中文空格填充符,美化显示。
print(tplt.format('排名','学校名称','总分',chr(12288)))
# {:^10}表示取10位居中对齐
for i in range(num):
u=ulist[i]
print(tplt.format(u[0],u[1],u[2],chr(12288)))
if __name__=='__main__':
uinfo=[]
url='http://www.zuihaodaxue.cn/zuihaodaxuepaiming2016.html'
html=getHTMLText(url)
fillUnivList(uinfo,html)
printUnivList(uinfo,20) #打印20所学校的信息
result:
排名 学校名称 总分
1 清华大学 95.9
2 北京大学 82.6
3 浙江大学 80
4 上海交通大学 78.7
5 复旦大学 70.9
6 南京大学 66.1
7 中国科学技术大学 65.5
8 哈尔滨工业大学 63.5
9 华中科技大学 62.9
10 中山大学 62.1
11 东南大学 61.4
12 天津大学 60.8
13 同济大学 59.8
14 北京航空航天大学 59.6
15 四川大学 59.4
16 武汉大学 59.1
17 西安交通大学 58.9
18 南开大学 58.3
19 大连理工大学 56.9
20 山东大学 56.3