【python爬虫课程设计】掌上高考

您所在的位置:网站首页 高考数据库怎么购买 【python爬虫课程设计】掌上高考

【python爬虫课程设计】掌上高考

2024-07-12 00:31| 来源: 网络整理| 查看: 265

一、选题的背景

选择此选题是因为掌上高考是一个提供本科院校信息的网站,通过爬取该网站的数据,可以获取到各个本科院校的相关信息,如学校名称、所在地、专业设置等。通过对这些数据进行分析和可视化,可以帮助学生更好地了解各个本科院校的情况,为他们的升学选择提供参考。预期目标是通过数据分析,找出各个本科院校的特点和优势,以及不同地区、不同专业的分布情况,为学生提供更全面、准确的信息。从社会方面来看,这有助于提高学生的就业竞争力;从经济方面来看,这有助于促进教育产业的发展;从技术方面来看,这需要运用爬虫技术和数据分析技术;数据来源主要是掌上高考网站。

二、主题式网络爬虫设计方案

1. 主题式网络爬虫名称:掌上高考高校数据爬取与可视化爬虫

2. 主题式网络爬虫爬取的内容与数据特征分析:

  - 爬取内容:掌上高考网站上的高校数据,包括高校名称、所在地、类型(综合类、理工类等)、排名、学科门类等信息。

  - 数据特征分析:高校数据具有结构化特点,可以通过HTML标签和属性进行定位和提取。同时,由于高校数据的多样性,需要对不同类型的高校进行分类处理

3. 主题式网络爬虫设计方案概述:

  - 实现思路:

    (1). 确定目标网站:掌上高考网站。

    (2). 分析网页结构:使用浏览器开发者工具查看网页源代码,分析大学数据的HTML标签和属性。

    (3). 编写爬虫代码:根据分析结果,使用Python的第三方库编写爬虫代码,实现对高校数据的爬取。

    (4). 数据清洗与存储:对爬取到的数据进行清洗和格式化处理,将数据存储到合适的数据结构中,如列表、字典等。

    (5). 数据可视化:使用Python的可视化库对高校数据进行可视化展示,如绘制柱状图、折线图等。

   - 技术难点:

    (1). 动态加载:部分网页数据是通过JavaScript动态加载的,需要使用Selenium等工具模拟浏览器操作,获取动态加载的数据。

    (2). 反爬机制:目标网站可能采用反爬机制,如设置User-Agent、限制访问频率等,需要使用代理IP、设置请求头等方式绕过反爬策略。

    (3). 数据清洗:爬取到的数据可能存在缺失值、异常值等问题,需要进行数据清洗和预处理,确保数据的准确性和完整性。

三、主题页面的结构特征分析

1.主题页面的结构与特征分析:

 

 

(1).主题页面包含多个大学的信息、

(2).每个大学的信息包括学校名称、所在地、类型、排名等。

(3).页面中可能存在分页功能,需要翻页获取更多高校信息。

2. Htmls 页面解析

上方导航栏,其内容是学校、专业等内容分类地区选择栏内容区页面部分,用来选择页面

3.节点(标签) 查找方法与遍历方法

  - 查找方法:通过调用get_size()函数获取数据总数,然后调用get_university_info()函数进行分页爬取

  - 遍历方法:是在get_university_info()函数中,使用for`循环遍历每一页的数据

四、网络爬虫程序设计

Part1: 爬取查学校里面院校库的网页数据并保存为“全国大学数据.csv”文件

1 # 导入所需模块 2 import json 3 import time 4 from time import sleep 5 import pandas as pd 6 import numpy as np 7 from bs4 import BeautifulSoup 8 from requests_html import HTMLSession,UserAgent 9 import random 10 import os 11 12 def get_header(): 13 import fake_useragent 14 location = os.getcwd() + '/fake_useragent.json' 15 ua = fake_useragent.UserAgent(path=location) 16 return ua.random 17 18 def get_size(page=1): 19 url = 'https://api.eol.cn/gkcx/api/?access_token=&admissions=¢ral=&department=&dual_class=&f211=&f985=&is_doublehigh=&is_dual_class=&keyword=&nature=&page={0}&province_id=&ranktype=&request_type=1&school_type=&signsafe=&size=20&sort=view_total&top_school_id=[2941]&type=&uri=apidata/api/gk/school/lists'\ 20 .format(page) 21 session = HTMLSession() #创建HTML会话对象 22 user_agent = UserAgent().random #创建随机请求头 23 header = {"User-Agent": user_agent} 24 res = session.post(url, headers=header) 25 data = json.loads(res.text) 26 size = 0 27 if data["message"] == '成功---success': 28 size = data["data"]["numFound"] 29 return size 30 31 def get_university_info(size, page_size=20): 32 page_cnt = int(size/page_size) if size%page_size==0 else int(size/page_size)+1 33 print('一共{0}页数据,即将开始爬取...'.format(page_cnt)) 34 session2 = HTMLSession() #创建HTML会话对象 35 df_result = pd.DataFrame() 36 for index in range(1, page_cnt+1): 37 print('正在爬取第 {0}/{1} 页数据'.format(index, page_cnt)) 38 url = 'https://api.eol.cn/gkcx/api/?access_token=&admissions=¢ral=&department=&dual_class=&f211=&f985=&is_doublehigh=&is_dual_class=&keyword=&nature=&page={0}&province_id=&ranktype=&request_type=1&school_type=&signsafe=&size=20&sort=view_total&top_school_id=[2941]&type=&uri=apidata/api/gk/school/lists' \ 39 .format(index) 40 user_agent = UserAgent().random #创建随机请求头 41 header = {"User-Agent": user_agent} 42 res = session2.post(url, headers=header) 43 44 with open("res.text", "a+", encoding="utf-8") as file: 45 file.write(res.text) 46 47 data = json.loads(res.text) 48 49 if data["message"] == '成功---success': 50 df_data = pd.DataFrame(data["data"]["item"]) 51 df_result = pd.concat([df_result, df_data], ignore_index=True) 52 time.sleep(random.randint(5, 7)) 53 54 return df_result 55 56 size = get_size() 57 df_result = get_university_info(size) 58 df_result.to_csv('全国大学数据.csv', encoding='gbk', index=False)

 

Part2: 用访问量排序来查询保存下来的“全国大学数据.csv”文件

1 # 导入所需模块 2 import pandas as pd 3 import plotly as py 4 import numpy as np 5 # 读取数据 6 university = pd.read_csv('data/全国大学数据.csv',encoding='gbk') 7 8 # 对数据进行处理 9 university = university.loc[:,['name','nature_name','province_name','belong', 10 'city_name', 'dual_class_name','f211','f985','level_name' , 11 'type_name','view_month_number','view_total_number', 12 'view_week_number','rank']] 13 c_name = ['大学名称','办学性质','省份','隶属','城市','高校层次', 14 '211院校','985院校','级别','类型','月访问量','总访问量','周访问量','排名'] 15 university.columns = c_name 16 17 # 访问量排序 18 university.sort_values(by='总访问量',ascending=False).head()

 

Part3: 用条形图显示全国各省的 “双一流” 和 “非双一流” 高校数量

1 university['高校总数'] = 1 2 university.fillna({'高校层次': '非双一流'},inplace=True) 3 university_by_province = university.pivot_table(index=['省份','高校层次'], 4 values='高校总数',aggfunc='count') 5 university_by_province.reset_index(inplace=True) 6 university_by_province.sort_values(by=['高校总数'],ascending=False,inplace=True) 7 8 #查询全国各省高校数量 9 import plotly.express as px 10 fig = px.bar(university_by_province, 11 x="省份", 12 y="高校总数", 13 color="高校层次") 14 fig.update_layout( 15 title='全国各省高校数量', 16 xaxis_title="省份", 17 yaxis_title="高校总数", 18 template='ggplot2', 19 font=dict( 20 size=12, 21 color="Black", 22 ), 23 margin=dict(l=40, r=20, t=50, b=40), 24 xaxis=dict(showgrid=False), 25 yaxis=dict(showgrid=False), 26 plot_bgcolor="#fafafa", 27 legend=dict(yanchor="top", 28 y=0.8, 29 xanchor="left", 30 x=0.78) 31 ) 32 fig.show()

 

Part4: 根据 “全国省市区行政区划.xlsx” 文件结合 “全国大学数据.csv” 中的经纬度生成全国高校地理分布图

1 df = pd.read_excel('./data/全国省市区行政区划.xlsx',header=1) 2 # 筛选出层级为2的数据,并选择'全称'、'经度'和'纬度'列 3 df_l = df.query("层级==2").loc[:,['全称','经度','纬度']] 4 df_l = df_l.reset_index(drop=True).rename(columns={'全称':'城市'}) 5 df7 = university.pivot_table('大学名称','城市',aggfunc='count') 6 df7 = df7.merge(df_l,on='城市',how='left') 7 # 按照大学数量降序排序 8 df7.sort_values(by='大学名称',ascending=False) 9 10 import plotly.graph_objects as go 11 import pandas as p 12 df7['text'] = df7['城市'] + '大学总数 ' + (df7['大学名称']).astype(str)+'个' 13 14 # 定义文本、颜色和范围 15 limits = [(0,10),(11,20),(21,50),(51,100),(101,200)] 16 colors = ["royalblue","crimson","lightseagreen","orange","red"] 17 cities = [] 18 scale =.08 19 20 # 创建地理分布图对象 21 fig = go.Figure() 22 23 # 遍历范围,筛选出对应的城市数据,并添加到地理分布图中 24 for i in range(len(limits)): 25 lim = limits[i] 26 df_sub = df7[df7.大学名称.map(lambda x: lim[0]


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3