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日

相关文章

  • 8种用Python实现线性回归的方法对比详解

    8种用Python实现线性回归的方法对比详解 线性回归是机器学习中的一个重要问题,Python可以很方便地实现这个操作。本文将介8种用Python实现线性回归的方法,并对它们进行详细对比。 1. 基本思路 线性回归是一用于建立两个变量之间线性关系的方法。在Python中,我们可以使用numpy和scikit-learn库来实现线性回归。具体实现如下: imp…

    python 2023年5月14日
    00
  • 编写Python小程序来统计测试脚本的关键字

    编写Python小程序来统计测试脚本的关键字的攻略如下: 确认需求 首先需要明确需求,统计测试脚本的关键字,需要考虑以下几个方面: 如何读取测试脚本文件? 如何解析测试脚本内容获取关键字? 如何将关键字进行统计并输出结果? 明确需求后,我们就可以开始编写代码了。 编写Python程序 读取文件 读取文件的代码如下: with open("test_…

    python 2023年5月23日
    00
  • Python正则表达式非贪婪、多行匹配功能示例

    Python正则表达式非贪婪、多行匹配功能示例 在Python正则表达式中,有两个非常有用的功能:非贪婪匹配和多行匹配。贪婪匹配指的是尽可能多地匹配字符,而不尽可能少地匹配字符;非贪婪匹配则相反,尽可能少地匹配字符。多行匹配指的是匹配多行文本,而不是单行文本。下面将分别介绍两个功能,并提供两个示例说明。 非贪婪匹配 在正则表达式中,*和+默认是贪的,即尽可能…

    python 2023年5月14日
    00
  • TypeError:“函数”对象不可下标 – Python

    【问题标题】:TypeError: ‘function’ object is not subscriptable – PythonTypeError:“函数”对象不可下标 – Python 【发布时间】:2023-04-02 15:40:01 【问题描述】: 我已尝试使用此代码解决作业: bank_holiday= [1, 0, 1, 1, 2, 0, 0,…

    Python开发 2023年4月8日
    00
  • Python网络编程之xmlrpc模块

    下面让我详细讲解一下“Python网络编程之xmlrpc模块”的完整攻略。 什么是xmlrpc模块? XML-RPC是一种远程调用协议,它使用XML格式编码远程调用信息,使用HTTP协议简单的传输信息。Python中的xmlrpc模块可以帮助我们快速构建一个XML-RPC服务器或客户端程序,提供了非常简单易用的API。 如何安装xmlrpc模块? Pytho…

    python 2023年6月3日
    00
  • Python reques接口测试框架实现代码

    首先,Python的requests库是用于发送HTTP/1.1请求。这个库可以完全地替代Python内置的httplib库。但是,这个有额外的好处,需要手动处理cookies、重定向可以直接获取等等。在接口测试中,使用requests库发送HTTP请求并获取响应内容,可以实现接口的功能测试、性能测试、安全测试等多种测试。 以下是实现Python reque…

    python 2023年5月13日
    00
  • 详谈python http长连接客户端

    HTTP长连接是一种在单个TCP连接上进行多次HTTP请求和响应的技术。它可以帮助我们更高效地进行HTTP通信和数据交换。在Python中,我们可以使用requests库来实现HTTP长连接客户端。本文将通过实例讲解如何使用Python实现HTTP长连接客户端,包括安装和使用requests库,以及两个示例。 安装requests库 在使用requests库…

    python 2023年5月15日
    00
  • 学习python (1)

    下面是关于学习Python (1) 的完整攻略: 1. 安装Python 首先,你需要在自己的电脑上安装Python。Python在不同的操作系统上安装方法可能会有细微的差别。以下是在不同操作系统上的安装方法: 在Windows上安装Python 打开Python官方网站(https://www.python.org/),下载并安装适合自己操作系统的Pyth…

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