CataLpa

仿生人会梦见电子羊吗?

  • 主页
所有文章 友链 关于我

CataLpa

仿生人会梦见电子羊吗?

  • 主页

第一个爬虫--爬取OJ代码(SDUSTOJ外网)

2018-04-03

一、 环境搭建

使用python3.X + beautifulsoup4 + lxml + request + html实现。

首先当然要安装python3.x 和 pip

然后使用pip安装beautifulsoup4、html以及request模块。

二、 了解各模块基本作用和爬虫流程

使用request模块产生请求,使用beautifulsoup4模块和lxml解析器解析响应,使用html模块对解析出的代码进行字符反转义,得到可用代码,最后新建文件进行存储。

三、 具体操作&逻辑分析

打开OJ外网地址 http://cise.sdust.edu.cn/OJ/ 同时设置浏览器代理,并打开fiddler准备抓取网络封包。

想要抓取代码的话,首先就要登录目标账号,我们知道,维持登录状态的是session和cookies,通过抓取网络封包我们发现,OJ在登录一个账号之后会产生一套cookie:

其中主要关注PHPSESSID,就是这个字段来标识用户身份,现在登录一个账号,获取cookie备用。

想要从网络上抓取相应的资源,就要找到其中的规律,爬虫的工作原理大概是:

也就是说,我们要先给爬虫提供一个URL作为入口,然后通过解析URL的响应数据判断是否取得的希望的数据,如果是 则存储,如果否 则通过规律取得下一个URL继续执行以上操作。

既然想要取得OJ的代码,那么首先观察OJ的各个页面,在status这个页面下有一些线索:

通过限定User和Result两个参数,可以得到全部已通过的代码列表

得到的URL为:

当我们尝试翻页时,观察URL的变化:

发现由2个参数 top和prevtop限制当前是第几页,而这top参数就是当前页面第一个RunID,而且也是前一个页面的最后一个RunID。

那么Prevtop是什么呢?当然就是前一页的第一个RunID,这时就会思考,这个参数是必须的吗? 尝试去除这个参数发现: