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实现随机漫步算法

    下面是关于“Python实现随机漫步算法”的完整攻略。 1. 随机漫步算法简介 随机漫步算法是一种随机过程,它描述了一个物体在空间中随机移动的过程。随机步算法通常用于模拟分子扩散、股票价格变化等随机过程。 2. Python实现随机漫步算法 在Python中,我们可以使用 random 模块来实现随机漫步算法。下面是一个使用随机漫步算法模拟醉汉走路的示例: …

    python 2023年5月13日
    00
  • 如何使用matplotlib在python中生成3d三角面(trisurf)图(数据已准备好)?

    【问题标题】:How to generate a 3d triangle surface (trisurf) plot in python with matplotlib (the data is prepared)?如何使用matplotlib在python中生成3d三角面(trisurf)图(数据已准备好)? 【发布时间】:2023-04-01 14:3…

    Python开发 2023年4月8日
    00
  • Python入门(六)Python数据类型

    Python数据类型 Python数据类型总览 Python是一种强类型语言,它的数据类型可以分为以下几类: 数字类型: 整数(int), 浮点数(float), 复数(complex) 布尔类型: True, False 字符串类型: str 列表类型: list 元组类型: tuple 集合类型: set 字典类型: dict 每种数据类型都有其特定的属…

    python 2023年6月5日
    00
  • python list等分并从等分的子集中随机选取一个数

    下面是 Python 中实现“list 等分并从等分的子集中随机选取一个数”的完整攻略。 将 list 等分 为了将一个 list 等分成多个子集,我们可以使用 Python 中的切片(Slice)操作,将 list 分解成多个子集。 以下是一个将 list 等分成子集的示例代码: def split_list(lst, n): ""&q…

    python 2023年6月3日
    00
  • 详解Python迭代和迭代器

    详解Python迭代和迭代器 Python中的迭代是指重复执行一系列指令的过程。Python通过迭代器来实现迭代。迭代器是一个可以遍历元素的对象,它能被next()函数调用并不断返回下一个值,直到发生StopIteration异常。 迭代器的实现方式 在Python中,我们可以通过定义一个类和实现__iter__()和__next__()方法来创建一个迭代器…

    python 2023年6月6日
    00
  • 详解Python PIL BoxBlur()方法

    Python PIL库提供了一个BoxBlur方法用于执行图像模糊操作,本文将介绍BoxBlur方法的参数和用法,并提供示例来说明。 BoxBlur方法的参数 BoxBlur方法接受一个参数:半径,用于指定模糊半径,半径越大,图像越模糊。半径必须为正整数。 BoxBlur方法的用法 下面是BoxBlur方法的基本使用方式: from PIL import I…

    python-answer 2023年3月25日
    00
  • Python时间和日期库的实现

    Python时间和日期库的实现 在Python中,时间和日期是常见的数据类型,用于记录和处理时间和日期信息。Python提供了多个时间和日期库,包括datetime、time、calendar、dateutil等,可以方便地进行时间和日期的处理和转换。本文将详细讲解Python时间和日期库的实现,包括datetime库的使用、时间和日期的转换、时间和日期的计…

    python 2023年5月15日
    00
  • Python入门之集合的使用教程

    Python入门之集合的使用教程 什么是集合? 集合(set)是Python中的一种无序可变容器。它是由唯一的、不可变的对象组成,可以对集合进行添加、删除、更新和查找等操作。同时,集合还支持集合的交、并、差和对称差等常见集合操作。 创建集合 可以用set()或{}来创建一个空集合。如果需要创建一个非空集合,则可以在花括号内添加多个元素,以逗号分隔。 示例代码…

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