python爬虫学习(7) —— 爬取你的AC代码
上一篇文章中,我们介绍了python爬虫利器——requests,并且拿HDU做了小测试。
这篇文章,我们来爬取一下自己AC的代码。
1 确定ac代码对应的页面
如下图所示,我们一般情况可以通过该顺序找到我们曾经AC过的代码
登陆hdu -> 点击自己的信息 -> 点击Last accepted submissions -> 在Code Len 处选择一个代码 -> 看到你AC的代码

我们可以看到,所有AC代码的页面都是
http://acm.hdu.edu.cn/viewcode.php?rid= + RunID
而这个RunID,正好在表格的最前面:

很自然我们可以想到,用正则表达式进行匹配。
2. 处理换页问题
很显然,,如果你AC的代码多了,必然会存在换页问题
不过我们可以在源代码中找到换页对应的URL,我们直接跳转,直到找不到为止。

3. 代码处理问题
html中有一些转义字符,使得我们不能直接将代码保存下来。

这时候我们需要用到 HTMLParser
code = html_parser.unescape(down_code)
4. 具体实现
#coding=utf-8
import re, HTMLParser, requests, getpass, os
# 初始化会话对象 以及 cookies
s = requests.session()
cookies = dict(cookies_are='working')
# 一些基础的url
host_url = 'http://acm.hdu.edu.cn'
post_url = 'http://acm.hdu.edu.cn/userloginex.php?action=login'
status_url = 'http://acm.hdu.edu.cn/status.php?user='
codebase_url = 'http://acm.hdu.edu.cn/viewcode.php?rid='
# 正则表达式的匹配串
runid_pat = re.compile(r'<tr.*?align=center ><td height=22px>(.*?)</td>.*?</tr>',re.S)
code_pat = re.compile(r'<textarea id=usercode style="display:none;text-align:left;">(.+?)</textarea>',re.S)
lan_pat = re.compile(r'Language : (.*?)  ',re.S)
problem_pat = re.compile(r'Problem : <a href=.*?target=_blank>(.*?) .*?</a>',re.S)
nextpage_pat = re.compile(r'Prev Page</a><a style="margin-right:20px" href="(.*?)">Next Page ></a>',re.S)
# 代码保存目录
if not os.path.exists('./ac_code'):
os.mkdir(r'./ac_code')
base_path = r'./ac_code/'
# 登陆
def login(usr,psw):
data = {'username':usr,'userpass':psw,'login':'Sign In'}
r = s.post(post_url,data=data,cookies=cookies)
# 代码语言判断
def lan_judge(language):
if language == 'G++':
suffix = '.cpp'
elif language == 'GCC':
suffix = '.c'
elif language == 'C++':
suffix = '.cpp'
elif language == 'C':
suffix = '.c'
elif language == 'Pascal':
suffix = '.pas'
elif language == 'Java':
suffix = '.java'
else:
suffix = '.cpp'
return suffix
if __name__ == '__main__':
usr = raw_input('input your username:')
psw = getpass.getpass('input your password:')
login(usr,psw)
# 用于处理html中的转义字符
html_parser = HTMLParser.HTMLParser()
# 遍历每一页,并下载其代码
status_url = status_url + usr + '&status=5'
status_html = s.get(status_url,cookies=cookies).text
flag = True
print "Just go!"
while( flag ):
runid_list = runid_pat.findall(status_html)
for id in runid_list:
code_url = codebase_url + id
down_html = s.get(code_url,cookies=cookies).text
down_code = code_pat.search(down_html).group(1)
language = lan_pat.search(down_html).group(1)
problemid = problem_pat.search(down_html).group(1)
suffix = lan_judge(language)
code = html_parser.unescape(down_code).encode('utf-8')
code = code.replace('\r\n','\n')
open( base_path + 'hdu' + problemid + '__' + id + suffix,"wb").write(code)
nexturl = nextpage_pat.search(status_html)
if nexturl == None:
flag = False
else:
status_url = host_url + nexturl.group(1)
status_html = s.get(status_url,cookies=cookies).text
print "all of your ac codes were saved!"
5. 效果截图
- ubuntu下测试:

- windows下测试:

6. 写在后面
额。。很久很久很久没有刷题了。。。233333333,其实我是想告诉你一个事实
这里就可以下载AC的代码,,,哈哈哈。so,这个爬虫仅仅用来练习就好。

python爬虫学习(7) —— 爬取你的AC代码的更多相关文章
- Python爬虫学习(二) ——————爬取前程无忧招聘信息并写入excel
作为一名Pythoner,相信大家对Python的就业前景或多或少会有一些关注.索性我们就写一个爬虫去获取一些我们需要的信息,今天我们要爬取的是前程无忧!说干就干!进入到前程无忧的官网,输入关键字&q ...
- python爬虫学习之爬取全国各省市县级城市邮政编码
实例需求:运用python语言在http://www.ip138.com/post/网站爬取全国各个省市县级城市的邮政编码,并且保存在excel文件中 实例环境:python3.7 requests库 ...
- 【转载】教你分分钟学会用python爬虫框架Scrapy爬取心目中的女神
原文:教你分分钟学会用python爬虫框架Scrapy爬取心目中的女神 本博文将带领你从入门到精通爬虫框架Scrapy,最终具备爬取任何网页的数据的能力.本文以校花网为例进行爬取,校花网:http:/ ...
- Python爬虫实例:爬取B站《工作细胞》短评——异步加载信息的爬取
很多网页的信息都是通过异步加载的,本文就举例讨论下此类网页的抓取. <工作细胞>最近比较火,bilibili 上目前的短评已经有17000多条. 先看分析下页面 右边 li 标签中的就是短 ...
- Python爬虫实例:爬取猫眼电影——破解字体反爬
字体反爬 字体反爬也就是自定义字体反爬,通过调用自定义的字体文件来渲染网页中的文字,而网页中的文字不再是文字,而是相应的字体编码,通过复制或者简单的采集是无法采集到编码后的文字内容的. 现在貌似不少网 ...
- Python爬虫实例:爬取豆瓣Top250
入门第一个爬虫一般都是爬这个,实在是太简单.用了 requests 和 bs4 库. 1.检查网页元素,提取所需要的信息并保存.这个用 bs4 就可以,前面的文章中已经有详细的用法阐述. 2.找到下一 ...
- python爬虫-基础入门-爬取整个网站《3》
python爬虫-基础入门-爬取整个网站<3> 描述: 前两章粗略的讲述了python2.python3爬取整个网站,这章节简单的记录一下python2.python3的区别 python ...
- python爬虫-基础入门-爬取整个网站《2》
python爬虫-基础入门-爬取整个网站<2> 描述: 开场白已在<python爬虫-基础入门-爬取整个网站<1>>中描述过了,这里不在描述,只附上 python3 ...
- python爬虫-基础入门-爬取整个网站《1》
python爬虫-基础入门-爬取整个网站<1> 描述: 使用环境:python2.7.15 ,开发工具:pycharm,现爬取一个网站页面(http://www.baidu.com)所有数 ...
随机推荐
- UML类图与面向对象设计原则
1. 引言 从大一开始学习编程,到如今也已经有两年了.从最初学习的Html,Js,JaveSe,再到JavaEE,Android,自己也能写一些玩具.学习过程中也无意识的了解了一些所谓的设计模 ...
- ES6之块级作用域
一.前言 在ECMAScript6(以下简称ES6)之前,ECMAScript的作用域只有两种: 1. 全局作用域: 2. 函数作用域. 正是因为有这两种作用域,所以在JavaScript中出现一 ...
- 如何重新注册VMware Update Manager(VUM)至vCenter Server中
在VMware的vSphere化境中,VUM的角色相当于Windows 环境中的WSUS(Windows 更新服务器),可以批量,自动化的完成所管辖ESXi主机的大版本迁移,小版本升级的任务,深受管理 ...
- 利用Python进行数据分析(2) 尝试处理一份JSON数据并生成条形图
一.JSON 数据准备 首先准备一份 JSON 数据,这份数据共有 3560 条内容,每条内容结构如下: 本示例主要是以 tz(timezone 时区) 这一字段的值,分析这份数据里时区的分布情况. ...
- .NET跨平台之旅:将QPS 100左右的ASP.NET Core站点部署到Linux服务器上
今天下午我们将生产环境中一个单台服务器 QPS(每秒请求数)在100左右的 ASP.NET Core 站点部署到了 Linux 服务器上,这是我们解决了在 .NET Core 上使用 EnyimMem ...
- asp.net core 1.1 升级后,操作mysql出错的解决办法。
遇到问题 core的版本从1.0升级到1.1,操作mysql数据库,查询数据时遇到MissingMethodException问题,更新.插入操作没有问题. 如果你也遇到这个问题,请参照以下步骤进行升 ...
- JAVA 日期格式工具类DateUtil.java
DateUtil.java package pers.kangxu.datautils.utils; import java.text.SimpleDateFormat; import java.ut ...
- java集合你了解多少?
用了java集合这么久,还没有系统的研究过java的集合结构,今天亲自画了下类图,总算有所收获. 一.所有集合都实现了Iterable接口. Iterable接口中包含一个抽象方法:Iterator& ...
- 从零开始学 Java - Spring 集成 Memcached 缓存配置(一)
硬盘和内存的作用是什么 硬盘的作用毫无疑问我们大家都清楚,不就是用来存储数据文件的么?如照片.视频.各种文档或等等,肯定也有你喜欢的某位岛国老师的动作片,这个时候无论我们电脑是否关机重启它们永远在那里 ...
- IIS初始化(预加载),解决第一次访问慢,程序池被回收问题
你以为你可以慢,那是不可能的!你以为你可以不动,那也是不可能的! 河南是守株待兔故事情节的发源地,讲的是懒惰的农夫坐在树桩旁等待可爱的小毛兔撞树的故事,那么这种事情怎么可能天天出现呢!你以为的事并一定 ...