SDUVJ开发实录(一):前置知识学习

来源:互联网 发布:deepin linux使用教程 编辑:程序博客网 时间:2024/05/27 09:44

更新记录:
5-11 爬虫知识学习与各oj题目爬取
5-14 增加了scrapy和xpath的学习

VJ,也就是Virtual Juage,是区别于Online Judge而言的,OJ具有自己的题库、判题终端等等,但是VJ是没有的。VJ的工作原理是把题目用爬虫抓过来,当你用VJ的账号提交题目的时候VJ会用自己在对应的OJ上的账号来提交你的代码,并抓取判题结果呈现给用户。简单来说就是你只要注册一个账号就可以在各个OJ(当然要是VJ支持的)上提交题目了。
VJ多用来进行队伍训练,目前国内比较著名的VJ有华中科技大学的(https://vjudge.net/)。而本组这次的任务就是在原sduoj(http://acm.sdu.edu.cn/)的基础上上线VJ功能,并且视情况做出一些改进。
这第一篇开发博客主要用于记录一些开发之前的知识,由于所需的知识可能存在疏漏,该博客预计将持续更新。
OK,进入正题。

VJ的编写将使用Python3作为主要语言,而对于VJ来说,其核心在于爬取的题目,则爬虫为重中之重,所以本博客首先更新的部分为Python爬虫的学习。
爬虫的定义不再赘述,其功能就是自动获取网上的信息。而Python3实现爬虫的核心包就是urllib.request。关于该包的所有信息可以去Python的官方网站(https://docs.python.org/3/)查看,这里只摘取一些比较重要的函数吧。
urllib.request.urlopen() 模拟开启某个url,这是核心函数之一。
随便测试一下:

import urllib.requestimport reresult = urllib.request.urlopen("http://www.baidu.com")print(result.read())

这个简单的代码爬取的是百度的网页信息,没有经过任何修饰,可以看到很多换行符啊占位符啊,相当杂乱。所以爬取的网页数据肯定还要继续处理。
得到的信息

要对爬取的网站信息做处理,就要进行正则匹配了。正则是怎么样的这里也不多说,在Python3中,对于一个字符串进行正则表达大概是如下形式:

import repattern = re.compile('<div class="ptx".*?>(.*?)</div>',re.S)items = re.findall(pattern, content)

re作为一个正则匹配的模块,具体的规则可以看这里(http://www.jb51.net/article/34642.htm),总之我们使用re.compile完成一个匹配模式,然后按照该模式对文本进行匹配。具体的匹配肯定要通过分析网页信息决定。

好了我目前记录东西已经可以用来爬取几个典型OJ的数据了,这里我们先从hdu开始。
P.s.不得不说不论是杭电还是POJ在网页编写这方面特别良心,完全没有进行反爬操作,连基本的header都不用设置,更不用说cookie或者什么json异步这些东西了。
首先我们随便点开hdu的一道题。
hdu1875

经典的不行的题目啊,用浏览器自带的工具分析一下网页,

可以看出来题目描述和input、output的数据都放在一个类似的结构里面,

….,如此就能利用正则表达式进行数据处理了,具体而言代码这么写:

import urllib.requestimport reresult = urllib.request.urlopen("http://acm.hdu.edu.cn/showproblem.php?pid=1875")content = result.read()#print(content.decode("gbk"))pattern = re.compile('<div class=panel_content.*?>(.*?)</div>',re.S)items = re.findall(pattern, content.decode("gbk"))for item in items:    print(item)

结果:

这是一个很粗略的处理,对于input、output这些东西也没有精确定位,还有一些冗余的数据,有待于将来再优化了。

对于poj的测试与此大同小异,不过poj的网页结构和hdu不太一样,不过不影响。

import urllib.requestimport reresult = urllib.request.urlopen("http://poj.org/problem?id=1001")content = result.read()content=content.decode('utf-8')#print(content.decode("gbk"))pattern = re.compile('<div class="ptx".*?>(.*?)</div>',re.S)items = re.findall(pattern, content)for item in items:    print(item)

这大概就是目前进行的一些粗略的针对oj的爬虫学习,如果未来爬其他oj的时候需要用到cookie等技术的话酌情再更新博客吧,不过按情况国内的网站好像都不怎么反爬。

update5-14 处于标准化和简单化的原则,学习了scrapy和Xpath的一些知识,准备使用框架完成爬虫的任务。下面将记录学习这些东西的情况。
参考网站(http://www.jianshu.com/p/a8aad3bf4dc4)
所谓Scrapy,是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。
Scrapy 使用 Twisted这个异步网络库来处理网络通讯,架构清晰,并且包含了各种中间件接口,可以灵活的完成各种需求。

0 0
原创粉丝点击