Advertisement

用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)

还没有任何评论哟~
客服
客服
  • 使Python虫抓和专业分数线的
    优质
    本项目提供了一段利用Python编写的数据爬取脚本,专门用于获取各高校及专业的录取分数线信息。通过该脚本,用户可以轻松收集所需数据进行教育规划或研究分析。 随着高考的结束,考生们开始估分选大学时发现中国教育在线的估分选大学系统已开始收费。因此,我编写了一个爬虫程序来获取各高校在河南省历年来的录取分数线、排名以及学校的基本信息。
  • Python编写的园网自动
    优质
    本简介介绍了一个使用Python语言开发的自动化工具,该工具能够实现校园网络的自动登录功能,极大地方便了用户的日常上网需求。它通过模拟用户操作,实现了高效、稳定的网页抓取和数据解析技术,帮助学生或教职工节省时间并提高效率。 这段文字可以改写为:适用于初学者学习爬虫的基础操作技巧,通过更改账户密码可以在校园网实现自动登录。需要调整请求头与postdata才能在其他网站使用,此代码专为北科校园网的自动登录设计。
  • 东北大OJ平台STL全解AC
    优质
    本项目汇集了东北大学在线评测系统(OJ)中关于STL标准模板库的所有题目,并提供了经过测试的完整解答代码。适合学习C++ STL的学生参考与练习。 【东北大学oj平台STL全部AC代码】是一个集合了通过东北大学在线判题系统(Online Judge,简称OJ)的C++编程练习题目的代码库,重点在于使用了C++的标准模板库(Standard Template Library,简称STL)。STL是C++编程中的一个强大工具,它提供了一系列高效、易用的容器、算法和迭代器,极大地提高了程序的可读性和效率。本段落将详细介绍STL的重要组成部分,并结合实际题目解析,帮助读者深入理解并掌握STL的使用。 1. 容器:作为STL的核心组件之一,提供了各种数据结构,如数组、链表、队列、栈和映射等。在东北大学oj平台的AC代码中,可能会看到`vector`(动态数组)、`list`(双向链表)、`set`(有序集合)以及`map`(关联数组)等容器的使用。例如,`vector`常用于动态数组操作,而`set`和`map`则用于存储和查找元素。 2. 算法:STL包含一系列通用算法,如排序、搜索、交换及比较等。在解题时常用到的有`sort`(排序)、`find`(查找)以及`lower_bound`(下界查找) 和 `upper_bound`(上界查找)等。这些算法通常与容器结合使用,以实现高效的数据处理。 3. 迭代器:迭代器是STL中连接容器和算法的关键部分,它可以像指针一样遍历容器内的元素。有输入迭代器、输出迭代器、前向迭代器、双向迭代器以及随机访问迭代器等多种类型,每种对应不同的访问与修改能力。 4. 功能对象(Functors):STL中的函数对象是一种可以作为参数传递的类,它们重载了操作符(),类似于函数。例如,`less`和`greater`用于比较元素而 `equal_to`则用来判断元素是否相等。在排序或搜索算法中,我们经常自定义功能对象以满足特定需求。 5. 配对容器:如`pair`, 用于存储两个元素,在关联容器(比如map和multimap)以及自定义函数对象的实现中有广泛应用。 通过分析东北大学oj平台上的STL AC代码实例,我们可以学习到如何根据题目要求选择合适的容器、算法,并且了解怎样利用迭代器高效地遍历与操作数据。例如,对于求解最短路径问题时可能会用到`priority_queue`(优先队列)和`graph`(图)的概念;而面对查找及排序相关的问题,则会使用如 `binary_search` 和 `lower_bound` 等算法来解决问题。通过这种方式不仅能够提升编程技能,还能加深对STL的理解,在实际开发中更好地应用它。
  • Python虫验证实现示例
    优质
    本示例详细介绍了使用Python进行网页爬虫时如何处理验证码登录问题,提供了具体代码和方法指导。 为了防止网站被恶意访问,许多网站会设置验证码登录机制以确保只接受人类用户的操作。使用Python编写爬虫来实现验证码登录的原理是先获取到登录页面生成的验证码,并将其保存下来;然后由用户手动输入该验证码,再将包括验证信息在内的数据包装后通过POST请求发送给服务器进行验证。 这一过程涉及到Cookie的应用:Cookie通常存储在本地计算机上,用于避免重复地向网站提交用户名和密码。当与服务器建立连接时,会结合访问链接以及事先设计好的Cookie内容(如包含登录凭证的用户身份信息)一起发送到服务器端以完成认证流程。 整个过程中需要进行两次POST请求: 1. 第一次是将自定义的内容作为Cookie数据传递给服务器; 2. 而第二次则是向网站提交验证所需的验证码及其他必要参数,从而实现完整的登录过程。 在编程时会使用Python3语言,并主要依赖于`re`和`urllib.request`等库来完成上述操作。
  • Python虫验证实现示例
    优质
    本文章提供了一个详细的代码示例,介绍如何使用Python编写爬虫程序,并解决遇到的验证码登录问题。通过该教程可以掌握基本到中等难度的网页数据抓取技术。 ### Python爬虫实现验证码登录详解 #### 一、引言 在互联网开发中,爬虫技术是一种非常重要的手段,用于自动地抓取网络上的数据。然而,为了防止爬虫的恶意访问,许多网站采取了验证码机制来阻止非人类用户的访问。因此,如何让爬虫能够识别并处理验证码成为了一个关键问题。本段落将详细介绍使用Python实现验证码登录的过程,并提供一个具体的代码实例。 #### 二、验证码登录原理 验证码登录的基本流程如下: 1. **获取登录页面**:首先访问目标网站的登录页面。 2. **下载验证码**:在登录页面中找到并下载验证码图片。 3. **手动输入验证码**:将下载的验证码显示给用户,让用户手动输入验证码。 4. **构造请求参数**:包括用户名、密码以及验证码。 5. **发送登录请求**:将构造好的参数发送给服务器进行验证。 6. **处理登录结果**:根据服务器返回的结果判断是否登录成功。 #### 三、Python实现步骤 ##### 1. 导入必要的库 ```python import re import urllib.request import http.cookiejar ``` - `re`模块用于正则表达式匹配。 - `urllib.request`用于HTTP请求操作。 - `http.cookiejar`用于处理Cookie。 ##### 2. 配置Cookie处理器 ```python cookie = http.cookiejar.CookieJar() opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cookie)) ``` 这里创建了一个`CookieJar`对象用于存储Cookie,并使用`build_opener`函数配置了一个带有`HTTPCookieProcessor`的自定义`opener`,以便于后续的操作能够自动处理Cookie。 ##### 3. 构造登录参数 ```python params = {} params[form_email] = 用户名 params[form_password] = 密码 params[source] = http://www.douban.com/accounts/login ``` 此处定义了一个字典`params`,包含了登录所需的用户名、密码以及来源页面。 ##### 4. 发送初次登录请求 ```python response = opener.open(loginurl, urllib.parse.urlencode(params).encode(utf-8)) ``` 这里通过`opener`发送登录请求,并获取响应。 ##### 5. 处理登录响应 ```python if response.geturl()[0:33] == https://accounts.douban.com/login: html = response.read().decode(utf-8) ``` 如果响应URL为登录页面,则读取HTML内容。 ##### 6. 提取验证码图片 ```python imgurl = re.search(captcha,
  • 如何Python虫抓需要的网站
    优质
    本教程详细介绍了使用Python编写网络爬虫来获取受密码保护的网站数据的方法和技巧。通过学习,你将掌握利用Selenium或Requests-Session等库自动登录,并持续保持会话状态以下载所需信息的技术。适合对网页抓取感兴趣的初学者及进阶用户阅读。 在使用Python爬虫抓取需要用户登录的网站内容时,掌握如何通过Cookie实现自动登录是非常重要的技能。这些受保护的内容通常只有注册并通过身份验证的用户才能访问。 首先理解Cookie的工作原理是关键步骤之一:当一个用户成功登陆某个网站之后,服务器会发送一个小文本段落件(即Cookie)到用户的浏览器中,并且保存在本地。这个文件包含了该次登录的状态信息,例如登录凭证等重要数据。每次后续请求时,如果浏览器携带了有效的Cookie,服务器就能识别出这是已认证的用户并提供相应的内容和服务;反之,则需要重新进行身份验证。 使用Python中的`requests`库可以轻松实现模拟登陆和保持会话状态的功能。下面以一个具体的例子来说明如何通过Cookie自动登录: 1. 打开目标网站(如:https://example.com/login)并完成手动登录步骤。 2. 使用浏览器的开发者工具,找到POST请求,特别是与登录相关的那个,并查看Request Headers中的Cookie字段内容。复制这些信息以便后续使用。 3. 编写Python脚本以实现自动登陆: ```python import requests headers = { User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/73.0.3683.75 Chrome/73.0.3683.75 Safari/537.36, } headers[Cookie] = your-cookie-value-here session = requests.Session() response = session.get(https://example.com/profile, headers=headers) print(response.text) ``` 上述代码片段展示了如何创建一个`Session`对象来保持会话状态,包括自动携带的登录凭证。通过发送带有正确Cookie值的GET请求到个人主页,可以绕过实际登陆过程直接访问受保护的数据。 然而需要注意的是,此方法具有一定的局限性:由于Cookie的有效期限制,在一段时间后可能失效;另外一些网站采用更复杂的机制(如JavaScript或CSRF Tokens)来处理登录流程。这时你或许需要进一步解析网页或者使用诸如Selenium之类的工具以模拟完整的浏览器行为。 总结起来,Python爬虫要成功抓取需用户登陆的页面内容,可以遵循以下步骤: 1. 手动完成网站登陆,并获取其中包含身份验证信息的Cookie。 2. 将此Cookie添加到请求头中并通过`Session`对象发起网络请求。 3. 检查服务器返回的内容以确保登录成功并开始提取所需的信息。 对于需要验证码的情况,通常会结合OCR技术来识别图片中的字符;或者使用第三方服务如Captcha解决。同时也要注意遵守网站的爬虫规则(robots.txt文件),避免因过度频繁访问而被封禁IP地址。
  • 浙工大OJ 355题AC(C++版)
    优质
    这段代码是为解决浙江大学工业控制学院在线评测系统中的第355道题目而编写的C++语言解决方案。 浙江工业大学的OJ平台zjut上的第355题代码已经全部亲测通过。
  • Python虫利Cookie详解
    优质
    本教程详细讲解了如何使用Python编写爬虫程序,并利用Cookie实现网站自动登录,适合初学者快速上手。 本段落详细介绍了使用Python爬虫进行cookie登录的方法,具有一定的参考价值。需要相关内容的朋友可以参考这篇文章。
  • Python虫利Cookie详解
    优质
    本文详细讲解了如何使用Python编写爬虫程序,并通过抓取和处理Cookie实现网站的自动登录功能。适合初学者掌握基础技巧。 前言:什么是cookie?Cookie 是某些网站为了辨别用户身份、进行会话跟踪而存储在用户本地终端上的数据(通常经过加密)。例如,有些网站需要登录后才能访问某个页面,在登录之前抓取该页面内容是不允许的。我们可以利用 Python 内置的 Urllib 库保存我们登录时生成的 Cookie,然后用它来抓取其他页面的内容,从而实现我们的目标。 一、Urllib库简介 Urllib 是 Python 自带的一个 HTTP 请求库。它包含以下几个模块: - urllib.request:请求模块; - urllib.error:异常处理模块;