import requests
import csv
import time
from pyecharts import options as opts
from pyecharts.charts import Map
class DaXue():
def __init__(self):
self.num = 1
self.headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36"
}
self.file = open('大学热度排行utf-8.csv', 'a', encoding='utf-8-sig', newline='')
self.write_csv = csv.writer(self.file)
self.write_csv.writerow(
['排行', '大学名称', '公/私办', '所在省份','所在城市', '具体地址', '办学层次', '办学性质', '总查询热度', '本年查询热度'])
def save_file(self, file_data):
self.write_csv.writerow(file_data)
def run(self):
for i in range(1, 79):
print(f'正在爬取第{i}页内容')
url = f'https://api.eol.cn/gkcx/api/?access_token=&admissions=¢ral=&department=&dual_class=&f211=&f985=&is_doublehigh=&keyword=&nature=&page={i}&province_id=&school_type=6000&signsafe=&size=15&sort=view_total&sorttype=desc&type=&uri=apidata/api/gk/school/lists'
res = requests.get(url, headers=self.headers).json()
page_res = res
school_list = page_res['data']['item']
for index in school_list:
name = index['name']
nature_name = index['nature_name']
province_name = index['province_name']
city_name = index['city_name']
address = index['address']
level_name = index['level_name']
type_name = index['type_name']
view_total = index['view_total']
view_year = index['view_year']
self.save_file([
self.num,
name,
nature_name,
province_name,
city_name,
address,
level_name,
type_name,
view_total,
view_year])
print(f'第{self.num}条数据写入成功!')
print('-' * 100)
self.num += 1
time.sleep(0.5)
print('数据保存完毕!')
class Vasualable():
def count_data(self):
csv_file = csv.reader(open('大学热度排行utf-8.csv','r',encoding='utf-8'))
province = []
total = []
total_dict = {}
for index in csv_file:
if index[0].isnumeric():
total_dict[index[3]] = total_dict.get(index[3],0) +int(index[-1])
for a,b in total_dict.items():
province.append(a)
total.append(b)
return province,total
def run(self):
print('正在生成可视化地图....')
province,total = self.count_data()
c = (
Map()
.add("", [list(z) for z in zip(province, total)], "china")
.set_global_opts(
title_opts=opts.TitleOpts(title="本年度各省高校查询热度"),
visualmap_opts=opts.VisualMapOpts(max_=50000000)
)
)
c.render('test.html')
print('地图生成完毕!')
if __name__ == '__main__':
Vasualable().run()