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的一道题。
经典的不行的题目啊,用浏览器自带的工具分析一下网页,
可以看出来题目描述和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这个异步网络库来处理网络通讯,架构清晰,并且包含了各种中间件接口,可以灵活的完成各种需求。
- SDUVJ开发实录(一):前置知识学习
- SDUVJ开发实录(二):数据库设计(一)
- SDUVJ开发实录(三):数据库建立
- SDUVJ开发实录(八):总结
- SDUVJ开发实录(四):Problem与ProblemList显示
- SDUVJ开发实录(六):contest、submit以及其他界面
- SDUVJ开发实录(七):rank、contest_rank及其他
- SDUVJ开发实录(五):Problem等界面的显示优化
- 物理渲染学习笔记(一) —— 前置知识
- [原创]网络分析的前置知识(一)
- MVC小知识 读《MVC WEB 开发学习实录》 一书 摘录
- struts2 开发学习实录
- 【Virtual C++ 3D游戏开发】前置知识 一 <工作环境及Win项目初窥>
- 学习笔记---高等数学前置知识---约分、通分
- 学习笔记---高等数学前置知识---三角函数
- Bug实录(一)
- 学习视频编码、解码知识需要哪些前置知识?
- iOS开发学习笔记(一) - 预备知识(1)
- 配置文件
- 分享自己觉得有意思的
- POJ NOI0105-32 求分数序列和
- Ubuntu 16.04 LTS国内快速更新源(桌面版更新源)
- IOS 空值 nil Nil NULL NSNull kCFNull
- SDUVJ开发实录(一):前置知识学习
- 自动和半自动知识提取
- HTML DOM border 属性
- 《scala程序设计》笔记
- ELK介绍安装
- django学习3
- 到底该不该妥协?
- angularjs2 组件的生命周期
- ios线程安全