python爬虫自动提交HDU并获取AC状态(p3+request+Beatifulsoup)
2017-09-13 22:36
585 查看
说明
今天下午搞了好一会儿,源于上周日的沈阳网络赛,竟然可以枚举答案交1024发……想到如果自己能写个爬虫自动提交那该多好啊,源于这总冲动自己今天花了一个下午实现了这个小玩意儿.效果图
实现过程
其实主要是3个步骤:login 登录
submit 提交代码
report status 范围状态(AC没有?)
首先是登录,就是要把你的id 和 密码post 到HDU ,我们可以打开HDU 的主页然后分析提交页面(Chrome +F12)
可以看到这几个东西
这就是我们需要添加到post data上的东西.
与用requests 创建一个会话然后,post data 上去就行了
这就是login
submit
这个也是一个post动作,具体和上一步是一样的.先去分析网页.status
这个比较简单,只需要向对应网页发送请求就行了.,然后我分析了一下源码. 发现他的上图的数据存在一个叫做 fix_table的表里,用Beatifulsoup 解析一下就好了.
code
import sys import requests import time from bs4 import BeautifulSoup class HDUSubmit(object): log_url = 'http://acm.hdu.edu.cn/userloginex.php?action=login' submit_url = 'http://acm.hdu.edu.cn/submit.php?action=submit' status_url = 'http://acm.hdu.edu.cn/status.php?' language_map = { "Java": 5, "Cpp": 0 } def __init__(self, user_id, password): self.id = user_id self.password = password self.session = requests.session() self.session.headers.update({ "user-agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36\ (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36" }) self.cookie_jar = requests.cookies.RequestsCookieJar() def login(self): params = { "username": self.id, "userpass": self.password, "login": "Sign In" } r = self.session.request('POST', self.log_url, data=params, cookies=self.cookie_jar) print('log status_code:', r.status_code) return r def submit(self, pid, code, language='Cpp'): params = { 'check': 0, 'problemid': pid, 'language': self.language_map[language], 'usercode': code } r = self.session.request('POST', self.submit_url, data=params, cookies=self.cookie_jar) print("submit status_code", r.status_code) if r.status_code == 200: print('submit success') time.sleep(10) # 处理状态查询 return self.status(pid) else: print('submit failed') return r def status(self, pid): params = { 'pid': pid, 'user': self.id } r = self.session.get(self.status_url, params=params) soup = BeautifulSoup(r.text, 'lxml') trs = soup.find('div', {'id': 'fixed_table'})('tr') model = [td.string for td in trs[0]('td')] data = [td.string for td in trs[1]('td')] pat = ['{:^%d}' % (max(len(model[i]), len(data[i]))) for i in range(len(data))] for i in range(len(model)): print(pat[i].format(model[i]), end=' ') print() for i in range(len(data)): print(pat[i].format(data[i]), end=' ') return r def read_code(filename): code = None with open(filename) as f: code = f.read() return code def main(lan='Cpp', argv=None): if argv is None: try: argv = sys.argv[1:] except: print("请输入id和密码:") argv =[] argv.append(input("id:")) 4000 argv.append(input("password:")) argv.append(input("代码文件名:")) argv.append(input("题号:")) code = read_code(argv[2]) hdu = HDUSubmit(argv[0], argv[1]) hdu.login() hdu.submit(argv[3], code,lan) if __name__ == '__main__': main()
相关文章推荐
- Python爬虫获取POJ某个用户的所有提交状态
- Python3 BeautifulSoup爬虫 HDU自动提交
- Python2 爬虫(三) -- 爬CSDN全部博文(自动获取页数)
- Python3 BeautifulSoup爬虫 POJ自动提交
- [python] HDU自动登录提交代码程序
- Python爬虫自动获取CSDN博客收藏文章
- Python3 BeautifulSoup爬虫 ZOJ自动提交
- Python爬虫之HDU提交数据
- python爬虫_自动获取seebug的poc实例
- python编写的自动获取代理IP列表的爬虫-chinaboywg-ChinaUnix博客
- Python中获取网页状态码的两个方法
- Python爬虫:获取糗事百科笑话
- python爬虫获取11选5彩票历史开奖号码
- Python爬虫:获取新浪网新闻
- hdu 2825(ac自动机+状态压缩dp)
- python 自动获取(打印)代码中的变量的名字字串
- Python爬取SDUTOJ比赛提交代码及批量提交(爬虫(伪))
- Hdu 4057 Rescue the Rabbit (AC自动机+状态压缩dp) - 2011 ACM-ICPC Dalian Regional Contest Problem G
- python实现获取天气信息后自动登录邮箱发送到指定邮件联系人
- python爬虫_获取知乎最多100篇文章