爬虫?模拟SDUT OJ 的Standings,按输入的用户名查看排名

这真的是我第一次写爬虫啊啊啊,之前学Python的时候知道有爬虫,但是没想过去写,昨晚学长问我Python学得咋样了,我说基本的都还好,,结果学长直接来了句,那你给我写个爬虫吧..我哪写过啊QAQ,昨晚我的脑袋一片空白,今天整到下午才算基本完成,一开始的部分比较陌生,知道却都没用过,到后面提取页面的数据时就用到基础知识了(切片很好用),然后我又调试了一晚上,bug在所难免,针对两个信息完整度相同的user,一个可以爬,另一个就不可以,(郁闷),不过还好,用学号模糊查找肯定没问题(哈哈哈,总之就这样吧,bug啥时候真的解决了,再来更新吧2333

另外那个BeautifulSoup,是需要安装的,Python本身没有

#!/usr/bin/env python
#-*-coding:utf-8-*-

import urllib2
import re       #正则表达式模块
import sys
from bs4 import BeautifulSoup
#处理编码问题
reload(sys)
sys.setdefaultencoding("utf-8")

url = 'http://acm.sdut.edu.cn/onlinejudge2/index.php/Home/User/standings'
user = raw_input()
a = url + '?' + 'username=' + user + '&nickname=&major=&class='    #根据输入的用户名获取url
response = urllib2.urlopen(a)
html = response.read()
soup = BeautifulSoup(html, 'lxml')       #BS解析
print('Rank\tUsername\tNickname\t\tSolved\tSubmit\tRatio')
l = []
l = soup.find_all('td', text = re.compile(user))    #用正则表达式进行用户名匹配并用find_all()提取出来
for i in range(len(l)):                 #循环处理每一个用户
	info = str(l[i])
	u = 'http://acm.sdut.edu.cn' + info[13:61]
	r = urllib2.urlopen(u)
	s = BeautifulSoup(r.read(), 'lxml')
	sys.stdout.write('%d\t'%(i+1) + str(info[63:-9]) + '\t' + s.h4.small.string + '\t\t') #打印rank,username,nickname,不用print防止换行...
	data = []
	data = s.find_all('small')  	 #用户的基本信息在small这个标签里面,用find_all()提取出来
	solve = str(data[5])
	submit = str(data[6])
	ratio = str(data[7])
	print(solve[7:-8] + '\t' + submit[7:-8] + '\t' + ratio[7:-8]) 	#打印solved,submit,ratio


放一张截图吧,都是一些学长学姐的信息,他们应该不会介意吧2333,网页传送门>http://acm.sdut.edu.cn/onlinejudge2/index.php/Home/User/standings



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值