python 难度-Python分析 oj 网的题目难度和通过率的关系
本着做题的心态,上了东莞理工学院的 oj 网;看了一下题目不想动手,在选择难度的时候发现有些题目通过率和难度可能存在着某些关系,于是决定爬下这些数据简单查看一下是否存在关系。
一、新建项目
我是用 Scrapy 框架爬取的(因为刚学没多久,顺便练练手)。首先,先新建 project (下载 Scarpy 部分已省略),在控制台输入 scrapy startproject onlineJudge(其中, onlineJudge为项目名称),敲击回车键新建项目完成。
二、明确目的
在动手写代码之前,先分析一下网页结构。网站是通过动态加载的,数据通过 json 文件加载。
1、明确要爬取的目标: http://oj.dgut.edu.cn/problems 网站里的题目,难度,提交量,通过率。在查找 json 的时候发现只有通过数,那么通过率就要自己计算。
2、打开 onlineJudge 目录下的 items.py 写下如下代码:
classOnlinejudgeItem(scrapy.Item): id= scrapy.Field() #题目编号 title = scrapy.Field() #标题 difficulty = scrapy.Field() #难度 submissionNo = scrapy.Field() #提交量 acceptedNo = scrapy.Field() #正确数 passingRate = scrapy.Field() #正确率
三、制作爬虫
1、在当前目录下输入命令:scrapy genspider oj "oj.dgut.edu.cn" (其中 oj 是爬虫的名字,"oj.dgut.edu.cn"算是一个约束,规定一个域名)
2、打开 onlineJudge/spiders 下的 ojSpider.py ,增加或修改代码为:
importscrapyimportjsonfrom onlineJudge.items importOnlinejudgeItemclassOjSpider(scrapy.Spider): name= 'oj'# 爬虫的名字 allowed_domains= ['oj.dgut.edu.cn'] # 域名范围 offset=0 url= 'http://oj.dgut.edu.cn/api/xproblem/?limit=20&offset='start_urls= [url +str(offset)] # 爬取的URL元祖/列表defparse(self, response): data= json.loads(response.text)['data']['results']iflen(data):for i inrange(len(data)): submissionNo= data[i]['submission_number'] acceptedNo= data[i]['accepted_number']try: passingRate= round((int(acceptedNo)/int(submissionNo)) * 100, 2)exceptZeroDivisionError as e: passingRate=0 strPR= str(passingRate) + "%"item=OnlinejudgeItem() item['id'] = data[i]['_id'] item['title'] = data[i]['title'] item['difficulty'] = data[i]['difficulty'] item['submissionNo'] =submissionNo item['acceptedNo'] =acceptedNo item['passingRate'] =strPRyielditemprint(i) self.offset+= 20 yield scrapy.Request(self.url + str(self.offset), callback=self.parse)
四、存储数据
1、打算将数据存储为 excel 文档,要先安装 openpyxl 模块,通过 pip install openpyxl 下载。
2、下载完成后,在 pipelines.py 中写入如下代码
from openpyxl importWorkbookclassOnlinejudgePipeline(object):def __init__(self): self.wb=Workbook() self.ws= self.wb.active #激活工作簿 self.ws.append(['编号', '标题', '难度', '提交量', '正确数', '正确率']) #设置表头 defprocess_item(self, item, spider): line= [item['id'], item['title'], item['difficulty'], item['submissionNo'], item['acceptedNo'], item['passingRate']] self.ws.append(line) self.wb.save('oj.xlsx')return item
五、设置 settings.py
修改并增加代码:
LOG_FILE = "oj.log"ROBOTSTXT_OBEY=TrueITEM_PIPELINES={'onlineJudge.pipelines.OnlinejudgePipeline': 300,}
六、运行爬虫
在当前目录下新建一个 main.py 并写下如下代码
from scrapy importcmdlinecmdline.execute("scrapy crawl oj".split())
然后运行 main.py 文件。
于是,想要的数据就被爬下来了
七、分析数据
分析数据之前,先安装好 numpy,pandas,matplotlib,xlrd。
importpandas as pdimportxlrddata= pd.read_excel("../onlineJudge/onlineJudge/oj.xlsx") # 导入 excel 文件data.describe()
data = data.set_index('编号') # 设置编号为索引
data.head() # 显示前五条信息
from matplotlib importpyplot as pltimportmatplotlib.style as psl%matplotlib inlinepsl.use('seaborn-colorblind') #设置图表风格plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
查看题目各难度的数目:
level_values = data['难度'].valuesdifficulties={'简单': 0,'中等': 0,'困难': 0}for value inlevel_values:if value == '简单': difficulties['简单'] += 1 elif value == '中等': difficulties['中等'] += 1 else: difficulties['困难'] += 1level=pd.Series(difficulties)print(level)level.plot(kind= 'bar', figsize=(6, 7))plt.grid(axis='y')
验证正确率与难度之间是否存在关系:
importnumpy as nprelation= data[['难度', '正确率']]rate_values= relation['正确率'].valuesfig, axes= plt.subplots(figsize=(15, 6))axes.scatter(rate_values, level_values)plt.grid(axis='x')plt.xticks(np.arange(0,1, 0.05))plt.xlabel('正确率')plt.ylabel('难度')
根据表格显示,题目难度跟正确率是存在一定关系的(我想的没有错哈哈哈)。
python 难度-Python分析 oj 网的题目难度和通过率的关系相关推荐
- 分析oj 网的题目难度和通过率的关系
# coding=utf-8 import csv import json import requests import gevent from gevent.queue import Queue # ...
- python爬虫beautifulsoup爬当当网_利用python爬虫可视化分析当当网的图书数据!
导语 这周末就分享个小爬虫吧.利用Python爬取并简单地可视化分析当当网的图书数据. 开发工具 Python版本:3.6.4 相关模块: requests模块: bs4模块: wordcloud模块 ...
- 利用python爬虫可视化分析当当网的图书数据
导语 这周末就分享个小爬虫吧.利用Python爬取并简单地可视化分析当当网的图书数据. 开发工具 **Python版本:**3.6.4 相关模块: requests模块: bs4模块: wordclo ...
- 使用Python爬取分析政府采购网数据
好久没写博客了,一直觉得之前写的都没啥技术性,这次分享个最近觉得很值得记录的一次操作吧~. Leader临时分配给我个任务,要我爬取下政府采购网近一个月公开招标中二三甲医院的数据,这一 ...
- 牛客网编程题python输入输出_牛客网算法题目记录
车站建设问题 有10^8个村庄排在一条公路上,依次编号为0~10^8-1,相邻村庄距离为1,其中有n个村庄居住着牛牛,居住着牛牛的村庄从小到大依次为a0~an-1,其中保证a0=0. 现在需要建设车站 ...
- c语言字符统计2sdut,山东理工大学SDUT - ACM OJ 题: Python代码 及分析
Python基础语法学习完成,先刷基础题100道巩固 ,附 题目.代码.知识分析 题目:http://acm.sdut.edu.cn/onlinejudge2/index.php/Home/Index ...
- 使用Python爬取“最好大学网”软科中国最好大学排名2019并做可视化分析
使用Python爬取"最好大学网"软科中国最好大学排名2019并做可视化分析 简介 开发环境 爬取数据 1.获取网站页面 2.解析网页内容 3.存储数据 可视化分析 基本设置 显示 ...
- python爬取二手房信息_刚刚接触PythonR?教你爬取分析赶集网北京二手房数据(附详细代码)...
原标题:刚刚接触Python&R?教你爬取分析赶集网北京二手房数据(附详细代码) 源 /数据森麟文 /徐涛 前言: 本文主要分为两部分:Python爬取赶集网北京二手房数据&R对爬取的 ...
- python爬虫爬猎聘网获取多条职责描述中有Linux需求的招聘信息
python爬虫爬猎聘网获取多条职责描述中有Linux需求的招聘信息 下列是我爬虫的作业 摘 要 随着现代化社会的飞速发展,网络上巨大信息量的获取给用户带来了许多的麻烦.由于工作和生活节奏的需求,人们 ...
最新文章
- VsCode 开发工具中英文切换
- js设置div透明度
- 三流Java搞技术,二流Java搞框架,一流Java…
- 临时表temporary table
- 解决GitHub加载和下载慢问题
- 恒生电子linux笔试题,恒生电子一面
- 模拟登录123026网站
- viewpager+fragment学习笔记
- 【转】MFC与.NET的区别
- Python中TypeError: ‘str‘ object is not callable
- Linux内核同步 - Read/Write spin lock
- BAT程序员手把手带你学算法-数组篇(理论知识剖析+5道经典面试题目)
- eXosip注册函数与使用说明
- 数据库概述05(数据库查询及修改操作)
- Android:layout_weight详解
- 2023秋招--梦加网络--游戏客户端--二面面经
- CAN总线网关是什么?
- 利用Yocto构建嵌入式Linux教程3_1--Yocto构建系统的配置文件
- IDEA插件之Json Parser
- 石头剪刀布Java实现
热门文章
- 开发日记-20190706 关键词 读书笔记 《Perl语言入门》Day 3
- android gradle tools 3.X 中依赖,implement、api 和compile区别
- dns tunnel CC
- LMDB中的mmap、Copy On Write、MVCC深入理解——讲得非常好,常来看看!
- Xcode:Task failed with exit 1 signal 0 {
- ios移动输入框被软键盘遮挡
- PHP Session变量
- GC详解及Minor GC和Full GC触发条件总结
- jquery ajax异步和同步从后天取值
- stand up meeting 12/24/2015 end sprint1