python 难度-Python分析 oj 网的题目难度和通过率的关系

本着做题的心态,上了东莞理工学院的 oj 网;看了一下题目不想动手,在选择难度的时候发现有些题目通过率和难度可能存在着某些关系,于是决定爬下这些数据简单查看一下是否存在关系。

一、新建项目

我是用 Scrapy 框架爬取的(因为刚学没多久,顺便练练手)。首先,先新建 project (下载 Scarpy 部分已省略),在控制台输入 scrapy startproject onlineJudge(其中, onlineJudge为项目名称),敲击回车键新建项目完成。

二、明确目的

在动手写代码之前,先分析一下网页结构。网站是通过动态加载的,数据通过 json 文件加载。

7fb7ea71bf19f4bf3c80a1fbb1534e89.png

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 文件。

于是,想要的数据就被爬下来了

731f88e928543e07e147e1fd0906c0af.png

七、分析数据

分析数据之前,先安装好 numpy,pandas,matplotlib,xlrd。

importpandas as pdimportxlrddata= pd.read_excel("../onlineJudge/onlineJudge/oj.xlsx")  # 导入 excel 文件data.describe()

4d3b42a93924d0b3d926b9d99db4e09e.png

data = data.set_index('编号')  # 设置编号为索引

data.head()            # 显示前五条信息

db7400debd0a46a4daf35d5d0c083ee3.png

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')

6815739799210b010bc9c85f3fdc1e4c.png

验证正确率与难度之间是否存在关系:

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('难度')

f21005190efab064555384aede7078be.png

根据表格显示,题目难度跟正确率是存在一定关系的(我想的没有错哈哈哈)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值