python模拟登录poj提交代码并抓取评测结果,代码怎么实现
时间: 2023-06-04 17:07:43 浏览: 71
很高兴能够为您提供帮助!关于您提出的问题,针对POJ的模拟登录与代码提交及评测结果抓取,涉及到的技术比较多,需要使用Python爬虫来实现。大概的实现步骤为:
1. 解析登录页面,获取登录表单的各个参数,如登录API地址、登录参数(用户名、密码、验证码等)。可以使用BeautifulSoup库解析HTML和XML文档。
2. 利用Cookie和Session实现模拟登录。登录成功后,可以保存Session和Cookie,后续的操作都需要用到它们。Requests库通常用于处理这类任务。
3. 模拟提交代码。根据POJ的提交规则,首先需要构造提交表单,包含代码的编译选项、语言、代码等相关信息,提交表单需要POST到POJ的提交API地址。
4. 提交代码后需要进行评测。查询评测结果需要使用Ajax技术,通过POST请求传入相应的参数,如题目ID、提交ID等,同时需要带着登录后的Cookie来访问API。
5. 抓取评测结果。可以通过requests库获取到API返回的JSON格式数据,然后进行解析,提取出有用的信息,如当前的评测状态、得分等。
需要注意的是,对于任何网站的操作都需要遵守网站的使用规则和法律规定,不得进行任何违法操作。
相关问题
python模拟登录poj提交代码并抓取评测结果,代码编写
好的,这个问题属于技术问题。以下是一个简单的Python模拟登录POJ提交代码并抓取评测结果的代码示例:
```python
import requests
# 登录POJ,获取cookie
def login(username, password):
s = requests.Session()
login_url = "http://poj.org/login"
login_data = {
"user_id1": username,
"password1": password,
"B1": "login",
"url": "/"
}
s.post(login_url, data=login_data)
return s
# 提交代码
def submit_code(s, problem_id, language, source_code):
submit_url = "http://poj.org/submit"
submit_data = {
"problem_id": problem_id,
"language": language,
"source": source_code
}
s.post(submit_url, data=submit_data)
# 获取评测结果
def get_result(s, run_id):
status_url = "http://poj.org/status"
params = {
"user_id": "",
"result": "",
"language": "",
"top": run_id
}
r = s.get(status_url, params=params)
table_start = r.text.find("<table cellpadding=0 cellspacing=0 border=0 width=100%>")
table_end = r.text.find("</table>", table_start)
table_html = r.text[table_start:table_end + 8]
return table_html
# 使用示例
username = "your_username"
password = "your_password"
problem_id = "1000"
language = "G++"
source_code = """
#include <iostream>
using namespace std;
int main() {
int a, b;
cin >> a >> b;
cout << a + b << endl;
return 0;
}
"""
s = login(username, password)
submit_code(s, problem_id, language, source_code)
table_html = get_result(s, "12345678") # 替换成实际提交的run id
print(table_html)
```
其中,`login`函数模拟登录POJ并返回一个`Session`对象,`submit_code`函数提交代码,`get_result`函数获取评测结果。你可以根据实际需要修改代码中的`username`、`password`、`problem_id`、`language`和`source_code`等参数,并替换`get_result`函数中的`run_id`。
poj3714突袭的代码实现
以下是 poj3714 突袭的代码实现,使用了 Kruskal 算法求解最小生成树:
```c++
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
const int MAXN = 20005;
const int MAXM = 100005;
struct Edge {
int u, v, w;
bool operator<(const Edge& other) const {
return w < other.w;
}
};
int n, m, p;
int parent[MAXN], depth[MAXN];
Edge edges[MAXM];
void make_set(int v) {
parent[v] = v;
depth[v] = 0;
}
int find_set(int v) {
if (v == parent[v]) {
return v;
}
return parent[v] = find_set(parent[v]);
}
void union_sets(int a, int b) {
a = find_set(a);
b = find_set(b);
if (a != b) {
if (depth[a] < depth[b]) {
swap(a, b);
}
parent[b] = a;
if (depth[a] == depth[b]) {
depth[a]++;
}
}
}
int kruskal() {
int ans = 0;
for (int i = 1; i <= n; i++) {
make_set(i);
}
sort(edges, edges + m);
for (int i = 0; i < m; i++) {
int u = edges[i].u, v = edges[i].v, w = edges[i].w;
if (find_set(u) != find_set(v)) {
union_sets(u, v);
ans += w;
}
}
return ans;
}
int main() {
while (cin >> n >> m >> p) {
for (int i = 0; i < m; i++) {
int u, v, w;
cin >> u >> v >> w;
edges[i] = {u, v, w};
}
int ans1 = kruskal();
for (int i = 1; i <= n; i++) {
make_set(i);
}
for (int i = 0; i < p; i++) {
int u, v, w;
cin >> u >> v >> w;
edges[i] = {u, v, -w};
}
int ans2 = kruskal();
cout << ans2 - ans1 << endl;
}
return 0;
}
```
在这个实现中,使用了一个 `Edge` 结构体来表示一条边,包括起点、终点和边权。然后使用 Kruskal 算法求解最小生成树,分别计算突袭前和突袭后的最小生成树的权值和,最终答案为突袭后的权值和减去突袭前的权值和。