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

yizhihongxing

杭电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爬取网页数据”的完整攻略,我可以基于以下内容进行讲解: 实例讲解Python爬取网页数据 前言 Python作为脚本语言,可以快速的获取和处理网页数据。随着网络的发展,如何通过Python获取网络数据已经成为一门必不可少的技能。本文将从两个示例开始,带领大家逐步学习如何通过Python来爬取网页数据。 示例1:爬取模拟浏览器 首先,…

    python 2023年5月14日
    00
  • PHP-FPM实现性能优化

    下面是详细讲解“PHP-FPM实现性能优化”的完整攻略。 什么是PHP-FPM? PHP-FPM是一种运行于PHP环境中的FastCGI进程管理器。它可以用于解决Apache请求过多、内存泄露等问题,从而提高网站的稳定性和性能。PHP-FPM可以独立于Web服务器如Nginx、Apache运行,通常和Nginx、Apache搭配使用。 PHP-FPM性能优化…

    python 2023年6月3日
    00
  • 命令“python setup.py egg_info”在 /tmp/pip-build-dlih6aks/MarkupSafe/ 中失败,错误代码为 1

    【问题标题】:Command “python setup.py egg_info” failed with error code 1 in /tmp/pip-build-dlih6aks/MarkupSafe/命令“python setup.py egg_info”在 /tmp/pip-build-dlih6aks/MarkupSafe/ 中失败,错误代码为…

    Python开发 2023年4月8日
    00
  • 使用python-pptx操作PPT的示例详解

    使用python-pptx操作PPT的示例详解 一、概述 python-pptx是Python库中的一个模块,它可以对Microsoft PowerPoint 2007或更高版本中的.pptx文件进行添加、修改和读取幻灯片的操作。我将在以下几点详细讲解python-pptx的使用攻略。 二、安装python-pptx 可以使用pip轻松地安装python-p…

    python 2023年6月6日
    00
  • Python爬虫之网页图片抓取的方法

    Python爬虫之网页图片抓取的方法 在Python爬虫中,网页图片的抓取是一项基本任务。下面介绍网页图片抓取的方法和实例。 1. 查找图片链接 在抓取图片前,需要先找到图片对应的链接。可以通过BeautifulSoup库和正则表达式进行图片链接的查找。 1.1 使用BeautifulSoup库查找图片链接 使用BeautifulSoup库可以方便地在网页中…

    python 2023年5月14日
    00
  • Spring Event观察者模式事件监听详解

    Spring Event观察者模式事件监听详解 什么是Spring Event Spring Event是Spring Framework中实现的一种事件通知机制。在Spring应用中,当某个事件发生时,Spring可以通知感兴趣的监听器执行相应的处理逻辑。这也被称为观察者模式。 Spring Event的使用步骤 创建事件 首先,需要定义一个事件类,例如:…

    python 2023年6月13日
    00
  • python 中dict的元素取值操作

    下面是关于Python中dict的元素取值操作的完整攻略。 标准的dict结构 Python中的dict类型是一种键-值对(Key-Value)的数据结构,其基本语法格式为: dict = {key1: value1, key2: value2, key3: value3, … , keyn: valuen} 其中,key是用来标识value的,key和…

    python 2023年5月13日
    00
  • python如何发送带有附件、正文为HTML的邮件

    发送带有附件、正文为 HTML 的邮件可以使用 Python 的 smtplib、email.mime.text 和 email.mime.multipart 模块实现。 以下是详细的攻略步骤: 步骤一:导入模块 import smtplib from email.mime.text import MIMEText from email.mime.multi…

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