
用Python登录学校OJ爬取AC代码
5星
- 浏览量: 0
- 大小:None
- 文件类型:DOCX
简介:
之前我曾利用Python获得了Toj平台上的基础题库内容——简单Python爬虫练习,并将其作为学习编程的基础实践项目。当我的Python编程能力进一步提升时,我想尝试用Python自动获取自己之前提交的所有AC题解。凭借日益精湛的编程技艺与个人能力的提升,掌握Python网络爬虫技术已成为许多程序员的重要学习技能之一。本文旨在详细讲解如何利用Python访问学校的在线评测系统(Online Judge, OJ)并获取自己之前提交并通过(Accepted, AC)的代码。通过这一过程,不仅能让学习者回顾之前的编程逻辑,还能让读者深入了解Python在网路爬取中的应用。
在开发爬虫程序之前,必须对其目标网站进行深入研究。本文采用天津大学的在线评测系统(TOJ)作为实践案例,旨在采集用户完成的所有正确答案源码。要达到上述目的,我们必须掌握以下几个关键方面:
1. **网站结构分析**:对网页整体架构进行详细解析,明确需要爬取的信息具体位置信息。
2. **登录机制**:深入探究网站的登录功能实现细节,包括登录表单提交方式及会话状态维持机制。
3. **数据提取**:识别所需数据类型(如文本文件、图片等),并制定相应的采集方案。
网站架构分析
- **个人提交记录**:用户在`http:acm.tju.edu.cntojstatus.php?accept=1&user=xxx`处可查看其提交列表,其中`xxx`为用户名。
- **详细信息页面**:每个提交对应唯一的RunID,通过访问code链接(如`http:acm.tju.edu.cntojshow_open.php?sid=1591405`)即可进入代码详情页。
- **权限验证**:在代码详情页上,需输入密码进行身份认证。成功后,可利用审查元素找到包含代码的页面,其URL通常为`http:acm.tju.edu.cntojshow_code.php`的形式。
为了支持网络数据抓取能力的实现需求,在本项目中主要采用了以下几种Python库配置:
urllib和urllib2被用于发送网络请求并处理服务器返回的数据。
BeautifulSoup (bs4)则被用来分析网页结构以提取所需信息。
getpass库提供了无需显示输入的密码处理方式,从而提高用户操作的安全性和便捷性。
os模块则被用作进行文件系统操作,方便存储和管理获取的信息。
具体实施流程如下:包括详细的步骤说明和操作指南,确保实现目标的高效执行。
**获取用户参与活动(AC)的提交标识**:
通过网络库`urllib2`向目标网页发送GET请求。
利用`BeautifulSoup`库解析返回的数据,提取用户参与活动的所有提交标识符(RunID)。
若结果包含多页数据,则重复此过程以确保收集全部提交标识。
2. **获取AC代码**:
逐一遍历所有的RunID,并生成一个包含`user_id`、`sid`以及`passwd`字段的表单数据集合。
通过调用`urllib2`库向指定的URL地址发送POST请求,目标是访问`show_code.php`页面以获取所需内容。
利用BeautifulSoup库再次解析返回的HTML文档,提取出所需的AC代码信息。
将提取到的AC代码保存至本地文件以便后续使用。以下是简化版的Python代码实例,旨在演示前面所述过程的具体实施方式。```python
import getpass
import urllib
import urllib2
import bs4
import os
def get_run_id(user_id, sid_url, run_id):
request = urllib2.Request(sid_url)
response = urllib2.urlopen(request)
soup = bs4.BeautifulSoup(response.read(), lxml)
tr = soup.select(tr[height=30])
if len(tr) > 0:
for x in tr:
run_id.append(x.get_text()[0:7])
y = int(x.get_text()[0:7])
sid_url = http:acm.tju.edu.cntojstatus.php?user=%s&accept=1&start=%d % (user_id, y - 1)
get_run_id(user_id, sid_url, run_id)
return run_id
def get_ac_codes(run_id, user_id, passwd, to_dir):
print(Printing All Your AC Codes)
for sid in run_id:
url = http:acm.tju.edu.cntojshow_code.php
values = {
user_id: user_id,
sid: sid,
passwd: passwd
}
data = urllib.urlencode(values)
request = urllib2.Request(url, data)
response = urllib2.urlopen(request)
soup = bs4.BeautifulSoup(response.read(), lxml)
pid = soup.select(a)[8].get_text()
code = soup.select(pre)[0].get_text().encode(utf-8)
with open(os.path.join(to_dir, pid + .cpp), wb) as fo:
fo.write(code)
# 主程序入口
if __name__ == __main__:
user_id = input(请输入用户名: )
passwd = getpass.getpass(请输入密码: )
to_dir = your_directory_path
run_id = []
sid_url = http:acm.tju.edu.cntojstatus.php?accept=1&user=%s % user_id
run_id = get_run_id(user_id, sid_url, run_id)
get_ac_codes(run_id, user_id, passwd, to_dir)
```
在完成前述操作后,我们能够有效地利用Python语言实现对本校在线评测系统OJ平台的访问,并获取用户的历史正确解答记录。这个流程不仅有助于我们回顾和巩固以往学习内容,还能深入理解Python在数据抓取领域的应用。进一步地,这种技术原理并非局限于本校平台,在其他类似的网络评估系统上也具有广泛的应用潜力。我们只需要根据目标平台的特殊需求对现有代码进行相应的优化和调整。深入掌握Python编程语言中的数据抓取技巧,是每一位软件工程师应当具备的核心能力之一。
全部评论 (0)


