本次对最好大学网进行爬虫示例。
def getHTMLText(url):
try:
resp = request.urlopen(url)
html_data = resp.read().decode('utf-8')
return html_data
except:
return ""
通过request来获取网页的信息。
def fillUnivList(ulist, html):
soup = BeautifulSoup(html, "html.parser")
for tr in soup.find('tbody').children: # 搜索'tbody'后面的子节点
if isinstance(tr, bs4.element.Tag):
tds = tr('td')
ulist.append([tds[0].string, tds[1].string,tds[2].string, tds[3].string])
使用bs4对网页信息进行处理,并以数组形式存储。
def printUnivList(ulist, num):
tplt = "{0:^10}\t{1:{4}^10}\t{2:^10}\t{3:^10}"
print(tplt.format("rank", "sn", "area",'grade', chr(12288)))
for i in range(num):
u = ulist[i]
print(tplt.format(u[0], u[1], u[2],u[3], chr(12288)))
这里对所获得信息进行输出检验,用tplt存放输出 格式的定义;其中^表示居中对齐,10表示按10个字符的长度输出。长度不够补空格,{4}表示使用format函数的第四个变量进行填充,即使用中文的空格进行填充。 chr(12288)表示按中文的习惯进行填充空格,为了输出对齐的约束
for i in range(100):
fieldnames = ["rank", "sn", "area",'grade']
a = dict(zip(fieldnames, uinfo[i]))
write_to_file(a)
def write_to_file(items):
with open('save.csv','a',encoding='utf_8_sig')as f:
fieldnames = ["rank", "sn", "area",'grade']
w = csv.DictWriter(f, fieldnames=fieldnames)
w.writerow(items)
由于爬取数据时,数据类型为数组,为方便后续得到可视化操作,在存储数据前,将数组转化为字典格式存储。
根据成绩排名表:
df_grade= df.sort_values('grade',ascending=False)#asc False降序,True升序: desc
sn1 = df_grade.sn[:10] #X轴坐标
grade1 = df_grade.grade[:10]#Y轴坐标
plt.bar(range(10),grade1,tick_label=sn1) #绘制条形图,用range()能保持X轴顺序一致
plt.ylim(0,100)
plt.title("学校评分Top10",color=colors1)
plt.xlabel('学校名称')
plt.ylabel('评分')
#标记数值
for x,y in enumerate(list(grade1)):
plt.text(x,y+0.01,'%s' %round(y,1),ha='center',color=colors1)
pass
根据大学数量对地区排名:
area_count = df.groupby(by='area').area.count().sort_values(ascending=False)
其余可根据成绩排名表改。
从大学分数排名图中,我们可以看出,在前十的国内大学中,清华大学相较于其他大学评分遥遥领先。
从各地大学数量图中,我们可以看到国内前百大学中,北京的大学占比最高,江苏其次,然后是上海,甘肃最少。从中可以反映出北京的高端教育水平较高。