[关闭]
@tenlee 2015-08-05T10:53:52.000000Z 字数 1677 阅读 2209

下载HDUOJ所有AC题目代码

Python


通过对杭电OJ的观察,很容易找到规律,根据此规则写相应的代码.
Requests 实现模拟登陆
需要用 BeautifulSoup 处理 status 页面的表格, 获得runid,problemid,代码链接,其实runid就是代码链接

  1. #!/usr/bin/env python3
  2. #coding=utf-8
  3. from bs4 import BeautifulSoup
  4. import requests
  5. import time
  6. def saveFile(data, fname = "temp.html"):
  7. with open(fname, "w") as f:
  8. f.write(data)
  9. print(fname + '保存成功')
  10. def getCode(codeurl, proid):
  11. url = hdu_url + codeurl
  12. code_html = session.get(url, cookies=cookieJar)
  13. code_html.encoding = 'gb2312'
  14. data = code_html.text
  15. soup = BeautifulSoup(data) #初始化
  16. code = soup.textarea.text #代码区域的标签tag
  17. saveFile(code, 'HDU'+proid + '.cpp') #保存路径以及文件名,我的格式是当前目录,文件名规则为HDU1001.cpp
  18. def getStatus():
  19. first = ''
  20. vis = set() #标记是否保存过
  21. while(True):
  22. payload = {'first':first, "user":uname, "pid":"", "lang":"", "status":5}
  23. status_html = session.get(status_url, cookies=cookieJar, params=payload)
  24. print(status_html.url)
  25. status_html.encoding = 'gb2312' #设置编码
  26. data = status_html.text #转换成str
  27. soup = BeautifulSoup(data) #初始化
  28. runid = "" #每次将first初始化为空
  29. for table in soup.findAll('table'):
  30. for row in table.findAll('tr'):
  31. i = 100
  32. for tr in row.findAll('td'):
  33. if(len(tr.text) == 8 and '1' in tr.text): #找到RunId
  34. runid = tr.text
  35. i = 0
  36. if(i == 3):
  37. proid = tr.text
  38. if(proid in vis):
  39. break
  40. else:
  41. vis |= {proid} #保存过的代码,不再重新保存,节省时间
  42. if(i == 6):
  43. getCode(tr.a.get('href'), proid) #获取到代码的链接,保存代码
  44. time.sleep(1) #休眠一秒,不然服务器反应不过来
  45. i += 1
  46. if(runid == ''): #本页没有runid, 说明是最后一页
  47. break
  48. first = str(int(runid)-1) #下一页 是以本页最后一个Runid - 1,规律
  49. uname = input("请输入用户名: ")
  50. upass = input("请输入密码: ")
  51. hdu_url = "http://acm.hdu.edu.cn/"
  52. login_url = hdu_url + "userloginex.php?action=login"
  53. status_url = hdu_url + "status.php"
  54. login_data = {'username': uname, "userpass": upass,
  55. "login":"Sign In"}
  56. #保持会话
  57. cookieJar = requests.cookies.RequestsCookieJar()
  58. session = requests.Session()
  59. #登陆
  60. login_resp = session.request("POST", login_url,
  61. cookies=cookieJar, data=login_data)
  62. getStatus()
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注