一、选题的背景
为什么要选择此选题?要达到的数据分析的预期目标是什么?(10 分) 从社会、经济、技术、数据来源等方面进行描述(200 字以内)
随着时间的推移,我们步入高考步入考研,这个时候作为一个考生了解中国大学排名就十分重要了,了解中国高校能提高我们的择校观,在分数一定情况下尽量上个好大学。本次爬虫我将获取中国本科院校的排名,了解这些大学在那些省份,了解他们的星级综合实力。希望在本次爬虫后能更加了解中国高校,数据来源于高三网
二、主题式网络爬虫设计方案(10 分)
1.主题式网络爬虫名称
名称是python网络爬虫—中国大学综合排名,url='http://www.gaosan.com/gaokao/299171.html',高三网
2.主题式网络爬虫爬取的内容与数据特征分析
内容是名次 、学校名称 、所在地区 、综合得分 、星级排名 、办学层次 ,这些数据能看出高校的水平和所在地
3.主题式网络爬虫设计方案概述(包括实现思路与技术难点)
找到一个网址并查看他的源代码,看数据所在源代码的位置,通过标签来查看这些数据被谁包裹起来,查看包裹标签的特点,思考是否可爬,怎么爬,技术难点在于他们在一个数据在一个标签里,标签之间没有特点,如何在没有特点的标签中爬取数据呢
三、主题页面的结构特征分析(10 分)
1.主题页面的结构与特征分析 2.Htmls 页面解析 3.节点(标签)查找方法与遍历方法 (必要时画出节点树结构)
结构是数据被tbody包裹着,每个数据被td标签包裹着,而每行被tr标签包裹着,所以我们可以在网页中查找tbody然后查找tr标签再查找td标签就可以对全部数据进行查找访问了,逐步击破
四、网络爬虫程序设计(60 分)
爬取数据
1 import requests
2 from bs4 import BeautifulSoup
3 import matplotlib.pyplot as plt
4 import jieba
5 jieba.setLogLevel(jieba.logging.INFO)
6
7 #获取网页信息
8 def gethtml():
9 #异常处理
10 try:
11 #高三网的url
12 url='http://www.gaosan.com/gaokao/299171.html'
13 #对网页发起请求获取信息
14 re= requests.get(url)
15 #如果返回值不是200说明发生了HTMLerror
16 re.raise_for_status()
17 #统一编码
18 re.encoding = re.apparent_encoding
19 return re.text
20 except:
21 #如果失败发出失败提示
22 return '获取失败'
23
24 #放大学信息
25 college=[]
26 #用美味谈解析网页
27 def htmlsoup(txt):
28 #美味汤解析网页,按照HTML的原则
29 soup=BeautifulSoup(txt, 'html.parser')
30 #解析的网页查找全部标签是tbody的内容
31 soupf= soup.find_all('tbody')
32 #对美味汤分析的html页面进行遍历
33 for i in soupf:
34 #查找所有tr标签
35 tr=i.find_all('tr')
36 #每一个tr都是一个tr标签
37 for j in tr:
38 #j都是一个td
39 for td in j:
40 #string获得标签之间的内容
41 #再转str
42 strtr=str(td.string)
43 #字符添加到大学列表
44 college.append(strtr)
45 return college
46
47 #处理内容
48 def dealhtml(college):
49 #用来切分的工具
50 dealmark=0
51 #对其中的数据一个个的遍历
52 # 用来装分数组的
53 dealc = []
54 for c in college:
55 dealmark=dealmark+1
56 #每6个一组
57 if dealmark%6!=0:
58 dealc.append(c)
59 #如果已经6个一组了
60 else:
61 dealc.append(c)
62 #添加到总的
63 dealcollege.append(dealc)
64 #再初始化
65 dealc=[]
66 return dealcollege
67
68 #处理得分异常问题
69 def dealcolleges(dealcollege):
70 for i in dealcollege:
71 if i[3]=='\u3000':
72 i[3]='无得分'
73 else:
74 continue
75 return dealcollege
76
77 import pandas
78 #用来输出的函数
79 def printcollege(dealcollege):
80 for i in dealcollege:
81 print("%-4s%-16s%-6s%-8s%-10s%-12s"%(i[0],i[1],i[2],i[3],i[4],i[5]))
82
83 #经过处理的大学
84 dealcollege=[]
85 #运行函数
86 def run():
87 txt=gethtml()
88 collegesoup=htmlsoup(txt)
89 d=dealhtml(collegesoup)
90 dd=dealcolleges(d)
91 printcollege(dd)
92
93 if __name__ == '__main__':
94 run()
词云如下
1 from wordcloud import WordCloud
2 #省份
3 province=[]
4 #从dealcollege添加进去
5 for d in dealcollege[1:]:
6 province.append(d[2])
7 #单个省份
8 everyprovinse=set(province)
9 listp=list(everyprovinse)
10 #一共多少省份
11 len_listp=len(listp)
12 number=[0 for i in range(len_listp)]
13 #每个省份的数量
14 for p in province:
15 for i in range(len_listp):
16 #有多少个
17 if listp[i]==p:
18 number[i]+=1
19 break
20 else:
21 continue
22
23 strprovince=''
24 #所有省份加一起
25 for i in range(len_listp):
26 intnumber=int(number[i])
27 #加\t才能分词
28 strp=(listp[i]+'\t')*intnumber
29 strprovince+=strp
30 #中文包地址
31 path='e:\\SimHei.ttf'
32 w=WordCloud(font_path=path,
33 background_color='White',
34 width=800,
35 height=600,
36 )
37 #放入文本
38 w.generate(strprovince)
39 plt.imshow(w)
40 # 坐标轴
41 plt.axis()
42 #显示
43 plt.show()
44 #词云保存地
45 w.to_file('地址')
可视化
1 #条形图
2 import matplotlib.pyplot as plt
3 import seaborn as sns
4 #中文包
5 plt.rcParams['font.sans-serif'] = ['SimHei']
6 plt.rcParams['axes.unicode_minus'] = False
7 x =listp
8 y =number
9 # Seaborn画条形图
10 data=pandas.DataFrame({
11 '数量':y,
12 '省份':x})
13 sns.barplot(
14 x="省份",
15 y="数量",
16 data=data
17 )
18 plt.show()
19
20 #散点图
21 import matplotlib.pyplot as plt
22 #高校的星级
23 xx=[0 for i in range(8)]
24 #高校的评分范围
25 score=[0 for i in range(8)]
26 for i in dealcollege[1:]:
27 if i[3]!='无得分':
28 inti=int(eval(i[3]))
29 if 0<=inti<60:
30 score[0]+=1
31 elif 60<=inti<65:
32 score[1]+=1
33 elif 65<=inti<70:
34 score[2]+=1
35 elif 70<=inti<75:
36 score[3]+=1
37 elif 75<=inti<80:
38 score[4]+=1
39 elif 80<=inti<85:
40 score[5]+=1
41 elif 85<=inti<90:
42 score[6]+=1
43 elif 90<=inti<100:
44 score[7]+=1
45 for h in range(8):
46 if int(i[-2][:-1])==h:
47 xx[h]+=1
48 plt.scatter(score,xx,marker='x', c="red", alpha=0.8)
49 plt.show()
保存
1 #保存
2 import csv
3 f = open('e:\\daxue.csv','w',newline='')
4 w= csv.writer(f)
5 for i in dealcollege:
6 w.writerow(i)
7 f.close()
全部代码
1 # --*-- coding:utf-8 --*--
2 import requests
3 from bs4 import BeautifulSoup
4 import matplotlib.pyplot as plt
5
6
7 #获取网页信息
8 def gethtml():
9 #异常处理
10 try:
11 #高三网的url
12 url='http://www.gaosan.com/gaokao/299171.html'
13 #对网页发起请求获取信息
14 re= requests.get(url)
15 #如果返回值不是200说明发生了HTMLerror
16 re.raise_for_status()
17 #统一编码
18 re.encoding = re.apparent_encoding
19 return re.text
20 except:
21 #如果失败发出失败提示
22 return '获取失败'
23
24 #放大学信息
25 college=[]
26 #用美味谈解析网页
27 def htmlsoup(txt):
28 #美味汤解析网页,按照HTML的原则
29 soup=BeautifulSoup(txt, 'html.parser')
30 #解析的网页查找全部标签是tbody的内容
31 soupf= soup.find_all('tbody')
32 #对美味汤分析的html页面进行遍历
33 for i in soupf:
34 #查找所有tr标签
35 tr=i.find_all('tr')
36 #每一个tr都是一个tr标签
37 for j in tr:
38 #j都是一个td
39 for td in j:
40 #string获得标签之间的内容
41 #再转str
42 strtr=str(td.string)
43 #字符添加到大学列表
44 college.append(strtr)
45 return college
46
47 #处理内容
48 def dealhtml(college):
49 #用来切分的工具
50 dealmark=0
51 #对其中的数据一个个的遍历
52 # 用来装分数组的
53 dealc = []
54 for c in college:
55 dealmark=dealmark+1
56 #每6个一组
57 if dealmark%6!=0:
58 dealc.append(c)
59 #如果已经6个一组了
60 else:
61 dealc.append(c)
62 #添加到总的
63 dealcollege.append(dealc)
64 #再初始化
65 dealc=[]
66 return dealcollege
67
68 #处理得分异常问题
69 def dealcolleges(dealcollege):
70 for i in dealcollege:
71 if i[3]=='\u3000':
72 i[3]='无得分'
73 else:
74 continue
75 return dealcollege
76
77 import pandas
78 #用来输出的函数
79 def printcollege(dealcollege):
80 for i in dealcollege:
81 print("%-4s%-16s%-6s%-8s%-10s%-12s"%(i[0],i[1],i[2],i[3],i[4],i[5]))
82
83 #经过处理的大学
84 dealcollege=[]
85 #运行函数
86 def run():
87 txt=gethtml()
88 collegesoup=htmlsoup(txt)
89 d=dealhtml(collegesoup)
90 dd=dealcolleges(d)
91 printcollege(dd)
92
93 if __name__ == '__main__':
94 run()
95
96 #词云
97 from wordcloud import WordCloud
98 #省份
99 province=[]
100 #从dealcollege添加进去
101 for d in dealcollege[1:]:
102 province.append(d[2])
103 #单个省份
104 everyprovinse=set(province)
105 listp=list(everyprovinse)
106 #一共多少省份
107 len_listp=len(listp)
108 number=[0 for i in range(len_listp)]
109 #每个省份的数量
110 for p in province:
111 for i in range(len_listp):
112 #有多少个
113 if listp[i]==p:
114 number[i]+=1
115 break
116 else:
117 continue
118
119 strprovince=''
120 #所有省份加一起
121 for i in range(len_listp):
122 intnumber=int(number[i])
123 #加\t才能分词
124 strp=(listp[i]+'\t')*intnumber
125 strprovince+=strp
126 #中文包地址
127 path='e:\\SimHei.ttf'
128 w=WordCloud(font_path=path,
129 background_color='White',
130 width=800,
131 height=600,
132 )
133 #放入文本
134 w.generate(strprovince)
135 plt.imshow(w)
136 # 坐标轴
137 plt.axis()
138 #显示
139 plt.show()
140 #词云保存地
141 w.to_file('地址')
142
143 #条形图
144 import matplotlib.pyplot as plt
145 import seaborn as sns
146 #中文包
147 plt.rcParams['font.sans-serif'] = ['SimHei']
148 plt.rcParams['axes.unicode_minus'] = False
149 x =listp
150 y =number
151 # Seaborn画条形图
152 data=pandas.DataFrame({
153 '数量':y,
154 '省份':x})
155 sns.barplot(
156 x="省份",
157 y="数量",
158 data=data
159 )
160 plt.show()
161
162 #散点图
163 import matplotlib.pyplot as plt
164 #高校的星级
165 xx=[0 for i in range(8)]
166 #高校的评分范围
167 score=[0 for i in range(8)]
168 for i in dealcollege[1:]:
169 if i[3]!='无得分':
170 inti=int(eval(i[3]))
171 if 0<=inti<60:
172 score[0]+=1
173 elif 60<=inti<65:
174 score[1]+=1
175 elif 65<=inti<70:
176 score[2]+=1
177 elif 70<=inti<75:
178 score[3]+=1
179 elif 75<=inti<80:
180 score[4]+=1
181 elif 80<=inti<85:
182 score[5]+=1
183 elif 85<=inti<90:
184 score[6]+=1
185 elif 90<=inti<100:
186 score[7]+=1
187 for h in range(8):
188 if int(i[-2][:-1])==h:
189 xx[h]+=1
190 plt.scatter(score,xx,marker='x', c="red", alpha=0.8)
191 plt.show()
192
193 #保存
194 import csv
195 f = open('e:\\daxue.csv','w',newline='')
196 w= csv.writer(f)
197 for i in dealcollege:
198 w.writerow(i)
199 f.close()
五、总结(10 分)
1.经过对主题数据的分析与可视化,可以得到哪些结论?是否达到预期的目标?
高校集中在北京、江苏、山东、河南,北京的高校最多质量也最高,国家文档的排名星级可以得到自己的最好选择,已达到预期目标
2.在完成此设计过程中,得到哪些收获?以及要改进的建议?
可以根据高校排名和自身水平寻找合适自己的高校。网址信息不足,如果能获取各个高校的最牛专业进行数据分析就更有针对性了
#条形图
import matplotlib.pyplot as plt
import seaborn as sns
#中文包
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
x =listp
y =number
# Seaborn画条形图
data=pandas.DataFrame({
'数量':y,
'省份':x})
sns.barplot(
x="省份",
y="数量",
data=data
)
plt.show()
#散点图
import matplotlib.pyplot as plt
#高校的星级
xx=[0 for i in range(8)]
#高校的评分范围
score=[0 for i in range(8)]
for i in dealcollege[1:]:
if i[3]!='无得分':
inti=int(eval(i[3]))
if 0<=inti<60:
score[0]+=1
elif 60<=inti<65:
score[1]+=1
elif 65<=inti<70:
score[2]+=1
elif 70<=inti<75:
score[3]+=1
elif 75<=inti<80:
score[4]+=1
elif 80<=inti<85:
score[5]+=1
elif 85<=inti<90:
score[6]+=1
elif 90<=inti<100:
score[7]+=1
for h in range(8):
if int(i[-2][:-1])==h:
xx[h]+=1
plt.scatter(score,xx,marker='x', c="red", alpha=0.8)
plt.show()