python 爬虫基本使用——统计杭电oj题目正确率并排序

杭电OJ是一个著名的在线评测系统,提供了大量的算法题目。本攻略将介绍如何使用Python爬虫统计杭电OJ题目的正确率,并按照正确率排序。

爬取题目信息

我们可以使用Python的requests库和BeautifulSoup库爬取杭电OJ的题目信息。以下是一个示例代码,用于爬取杭电OJ的题目信息:

import requests
from bs4 import BeautifulSoup

url = 'http://acm.hdu.edu.cn/listproblem.php?vol=1'
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
table = soup.find('table', {'class': 'table_text'})
rows = table.find_all('tr')[1:]

problems = []
for row in rows:
    cols = row.find_all('td')
    problem_id = cols[0].text.strip()
    problem_title = cols[2].text.strip()
    problem_url = 'http://acm.hdu.edu.cn/' + cols[2].find('a')['href']
    problems.append({'id': problem_id, 'title': problem_title, 'url': problem_url})

在上面的代码中,我们使用requests库发送HTTP请求,并使用BeautifulSoup库解析HTML响应。我们使用find方法查找HTML响应中的题目表格,并使用find_all方法获取所有行。我们遍历每一行,并使用find_all方法获取所有列。我们使用列的文本内容和链接构造题目信息,并将其添加到problems列表中。

爬取提交记录

我们可以使用Python的requests库和BeautifulSoup库爬取杭电OJ的提交记录。以下是一个示例代码,用于爬取杭电OJ的提交记录:

import requests
from bs4 import BeautifulSoup

url = 'http://acm.hdu.edu.cn/status.php?user_id=your_user_id&status=0'
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
table = soup.find('table', {'class': 'table_text'})
rows = table.find_all('tr')[1:]

submissions = []
for row in rows:
    cols = row.find_all('td')
    problem_id = cols[2].text.strip()
    result = cols[3].text.strip()
    if result == 'Accepted':
        submissions.append(problem_id)

在上面的代码中,我们使用requests库发送HTTP请求,并使用BeautifulSoup库解析HTML响应。我们使用find方法查找HTML响应中的提交记录表格,并使用find_all方法获取所有行。我们遍历每一行,并使用find_all方法获取所有列。我们使用列的文本内容构造提交记录,并将其添加到submissions列表中。

统计正确率并排序

我们可以使用Python的collections库统计每个题目的正确率,并使用sorted函数按照正确率排序。以下是一个示例代码,用于统计杭电OJ题目的正确率并排序:

from collections import Counter

problem_ids = [problem['id'] for problem in problems]
submission_counts = Counter(submissions)
accuracy = {problem_id: submission_counts[problem_id] / len(submissions) for problem_id in problem_ids}
sorted_problems = sorted(problems, key=lambda problem: accuracy[problem['id']], reverse=True)

for problem in sorted_problems:
    print(f"{problem['id']} {problem['title']} {accuracy[problem['id']]:.2%}")

在上面的代码中,我们使用列表推导式获取所有题目的ID,并使用collections库的Counter函数统计每个题目的提交次数。我们使用字典推导式计算每个题目的正确率,并使用sorted函数按照正确率排序。最后,我们遍历排序后的题目列表,并打印每个题目的ID、标题和正确率。

示例1:爬取杭电OJ题目信息

以下是一个示例代码,用于爬取杭电OJ的题目信息:

import requests
from bs4 import BeautifulSoup

url = 'http://acm.hdu.edu.cn/listproblem.php?vol=1'
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
table = soup.find('table', {'class': 'table_text'})
rows = table.find_all('tr')[1:]

problems = []
for row in rows:
    cols = row.find_all('td')
    problem_id = cols[0].text.strip()
    problem_title = cols[2].text.strip()
    problem_url = 'http://acm.hdu.edu.cn/' + cols[2].find('a')['href']
    problems.append({'id': problem_id, 'title': problem_title, 'url': problem_url})

for problem in problems:
    print(f"{problem['id']} {problem['title']} {problem['url']}")

在上面的代码中,我们使用find方法查找HTML响应中的题目表格,并使用find_all方法获取所有行。我们遍历每一行,并使用find_all方法获取所有列。我们使用列的文本内容和链接构造题目信息,并打印到控制台。

示例2:统计杭电OJ题目正确率并排序

以下是一个示例代码,用于统计杭电OJ题目的正确率并排序:

import requests
from bs4 import BeautifulSoup
from collections import Counter

url = 'http://acm.hdu.edu.cn/status.php?user_id=your_user_id&status=0'
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
table = soup.find('table', {'class': 'table_text'})
rows = table.find_all('tr')[1:]

submissions = []
for row in rows:
    cols = row.find_all('td')
    problem_id = cols[2].text.strip()
    result = cols[3].text.strip()
    if result == 'Accepted':
        submissions.append(problem_id)

url = 'http://acm.hdu.edu.cn/listproblem.php?vol=1'
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
table = soup.find('table', {'class': 'table_text'})
rows = table.find_all('tr')[1:]

problems = []
for row in rows:
    cols = row.find_all('td')
    problem_id = cols[0].text.strip()
    problem_title = cols[2].text.strip()
    problem_url = 'http://acm.hdu.edu.cn/' + cols[2].find('a')['href']
    problems.append({'id': problem_id, 'title': problem_title, 'url': problem_url})

problem_ids = [problem['id'] for problem in problems]
submission_counts = Counter(submissions)
accuracy = {problem_id: submission_counts[problem_id] / len(submissions) for problem_id in problem_ids}
sorted_problems = sorted(problems, key=lambda problem: accuracy[problem['id']], reverse=True)

for problem in sorted_problems:
    print(f"{problem['id']} {problem['title']} {accuracy[problem['id']]:.2%}")

在上面的代码中,我们首先使用requests库和BeautifulSoup库爬取杭电OJ的提交记录和题目信息。我们使用列表推导式获取所有题目的ID,并使用collections库的Counter函数统计每个题目的提交次数。我们使用字典推导式计算每个题目的正确率,并使用sorted函数按照正确率排序。最后,我们遍历排序后的题目列表,并打印每个题目的ID、标题和正确率。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python 爬虫基本使用——统计杭电oj题目正确率并排序 - Python技术站

(0)
上一篇 2023年5月15日
下一篇 2023年5月15日

相关文章

  • Python中使用filter过滤列表的一个小技巧分享

    Python中使用filter过滤列表的一个小技巧分享的攻略如下: 1. filter函数简介 Python内置的filter()函数可以对序列进行过滤,过滤掉不符合条件的元素,返回一个迭代器对象,可以通过list()函数将其转换为列表使用。 filter()函数的语法结构为: filter(fn, iterable) 其中 fn 为自定义函数,用于指定过滤…

    python 2023年6月3日
    00
  • Python 文件操作技巧(File operation) 实例代码分析

    以下是关于“Python 文件操作技巧(File operation) 实例代码分析”的完整攻略: 一、Python 文件操作技巧概述 在 Python 中,文件操作是非常常见的操作,涉及到的内容也非常广泛。Python 为文件操作提供了丰富的内置函数,例如创建、修改、删除及访问文件等操作,同时还有一些用于处理文件数据的模块(如 CSV, JSON, XML…

    python 2023年6月2日
    00
  • Django中如何用xlwt生成表格的方法步骤

    下面是Django中如何用xlwt生成表格的方法步骤: 第一步:安装xlwt 在使用xlwt前,需要先安装该库,可以使用以下命令进行安装: pip install xlwt 第二步:导入xlwt 在生成表格的视图中导入xlwt库,即: import xlwt from django.http import HttpResponse 第三步:编写生成表格的视图…

    python 2023年5月13日
    00
  • Python 3.10 中 6 个兴奋的新特性

    下面我将为你详细讲解“Python 3.10 中 6 个兴奋的新特性”。 1. Parenthesized Context Managers Python 3.10 中引入的第一个新特性是 Parenthesized Context Managers(括号内的上下文管理器)。这使得代码编写更具可读性和清晰度。通常情况下,我们可以将一个上下文管理器放在 wit…

    python 2023年5月19日
    00
  • Python+PuLP实现线性规划的求解

    下面是Python+PuLP实现线性规划的求解的完整攻略。 什么是线性规划? 线性规划是指在一定限制条件下,使某一目标函数达到最大或最小值的问题。线性规划问题可以表示为: $$\max_{x}c^Tx$$ $$s.t.\ \ Ax\le b$$ 其中,$x$为变量向量,$c$为目标函数系数向量,$A$为约束系数矩阵,$b$为约束条件向量。 PuLP简介 Pu…

    python 2023年6月5日
    00
  • Python中输入若干整数以逗号间隔实现统计每个整数出现次数

    首先,我们需要了解Python中的input函数和列表的操作。 input函数可以让用户在命令行中输入一段字符串,而列表则是可以保存一组数据,其中每个元素都有一个对应的下标。 根据题目要求,我们需要让用户输入若干整数以逗号间隔,然后统计每个整数出现的次数。因此,我们可以先调用input函数获取用户输入: num_str = input("请输入若干…

    python 2023年6月3日
    00
  • Python中import机制详解

    Python中import机制详解 在Python中,使用import语句可以将一个模块导入到当前模块中,使得当前模块能够使用被导入的模块中定义的变量、函数和类等内容。本文将详细讲解Python中的import机制,包括import语句的使用方法、模块搜索路径、模块重载机制等内容。 1. import语句的使用方法 Python中的import语句可以导入一…

    python 2023年5月14日
    00
  • 学会Python正则表达式,就看这20个例子(脚本之家修正版)

    学会Python正则表达式,就看这20个例子(脚本之家修正版) 正则表达式是一种强大的文本处理工具,可以用于各种本处理任务,如数据清洗、文本分析、信息提取等。本攻略将介绍20个Python正则表达式的例子,助您更好地掌握正则表达式的用法。 例子1:匹配数字 import re text = ‘The price the product is $20’ res…

    python 2023年5月14日
    00
合作推广
合作推广
分享本页
返回顶部